VL53L1_Dev_t VL53L1_dev[2]; //device param, include I2C
//VL53L1_DeviceInfo_t VL53L1_dev_info[2];//device ID version info
uint8_t Ajusted[]={0,0};//adjusted sign, 0-not, 1-had
uint16_t Distance = 0;//保存測距數(shù)據(jù)
VL53L1_RangingMeasurementData_t VL53L1_data[2];//ranging result struct, distance, max distance,etc.
if(newaddr == dev->I2cDevAddr) //if new addr == old addr, exit
return VL53L1_Error_NONE;
//try to access a reg with old addr(default 0x52)
Status = VL53L1_RdWord(dev, VL53L1_IDENTIFICATION__MODEL_ID, &Id);
if(Status!=VL53L1_Error_NONE)
return Status;
if(Id == 0xEACC)
{
//set new I2C addr
Status = VL53L1_SetDeviceAddress(dev,newaddr);
if(Status!=VL53L1_Error_NONE)
return Status;
//update struct I2C addr
dev->I2cDevAddr = newaddr;
//check new I2C addr
Status = VL53L1_RdWord(dev, VL53L1_IDENTIFICATION__MODEL_ID, &Id);
}
//HAL_Delay(2);
vl531_delay_ms(2);
status = VL53L1_SetLimitCheckEnable(dev,VL53L1_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//signal--amplitude of the signal-
//-reflected. enable signal rate limit check
if(status!=VL53L1_Error_NONE)
return status;
//HAL_Delay(2);
vl531_delay_ms(2);
status = VL53L1_SetLimitCheckValue(dev,VL53L1_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//set SIGMA limit
if(status!=VL53L1_Error_NONE)
return status;
//HAL_Delay(2);
vl531_delay_ms(2);
status = VL53L1_SetLimitCheckValue(dev,VL53L1_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//set signal rate limit
if(status!=VL53L1_Error_NONE)
return status;
//---maybe need, and add a item to Mode_data
//HAL_Delay(2);
//status = VL53L1_SetLimitCheckValue(dev,VL53L1_CHECKENABLE_RANGE_IGNORE_THRESHOLD,Mode_data[mode].ignoreThres);//set signal rate limit
//if(status!=VL53L1_Error_NONE)
// return status;
//HAL_Delay(2);
//vl531_delay_ms(30);
status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//set the max interval for a whole diatance test
if(status!=VL53L1_Error_NONE)
return status;
// Status = VL53L1_poll_for_range_completion(dev, VL53L1_RANGE_COMPLETION_POLLING_TIMEOUT_MS);
Status = VL53L1_GetMeasurementDataReady(dev,&isDataReady);
//Status = VL53L1_WaitMeasurementDataReady(dev);
if(Status != VL53L1_Error_NONE)
return Status;
if(1 == isDataReady)
{
Status = VL53L1_GetRangingMeasurementData(dev, pdata);
Distance = pdata->RangeMilliMeter;
}
Status = VL53L1_ClearInterruptAndStartMeasurement(dev);
return Status;
}
// Distance_data = pdata->RangeMilliMeter;//output the final distance data
//start general test. repeatly. not used
//dev:device I2C param struct
//mode0:default, 1:high accuracy, 2:long distance
void VL53L1_general_start(VL53L1_Dev_t *dev,uint8_t mode)
{
VL53L1_Error Status=VL53L1_Error_NONE;
uint8_t i=0;
while(VL53L1_set_mode(dev,mode)) //config test mode
{
i++;
if(i==2)
return;
}
while(Status==VL53L1_Error_NONE)
{
Status = VL53L1_single_test(dev,&VL53L1_data[0]);//perform a test
// Distance_data=VL53L1_data[0].RangeMilliMeter;
}
//HAL_Delay(50);
vl531_delay_ms(50);
}