do
{
Status |= vl53l0x_init(&vl53l0x_dev); //VL53L0X_DataInit()
Status |= VL53L0X_StaticInit(&vl53l0x_dev);
// Status |= VL53L0X_SetDeviceMode(&vl53l0x_dev,VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING);
GPIOB_InverseBits(OBJ_LED);
mDelayuS(500);
}while(Status != VL53L0X_ERROR_NONE); //如果TOF有问题或接触不良,LED会以2Hz频率闪烁
while(1)
{
Status = VL53L0X_ERROR_NONE;
KEY_SCAN();
if(KEY3_PRESS_flag) //RST键(要改造) 不需要?特定的光照条件。室内正常光线即可,校准期间,确保传感器前方 ?1 米内无遮挡物?,或者至少保持开阔空间
{//第一步
GPIOB_SetBits(OBJ_LED);; //让LED灭,不影响标定
KEY3_PRESS_flag = 0;
VL53L0X_GetReferenceSpads(&vl53l0x_dev,&myrefSpadCount_readout,&myisApertureSpads_readout); //初始值myrefSpadCount_readout=5,myisApertureSpads_readout =0
mDelayuS(20);
Status = VL53L0X_PerformRefSpadManagement(&vl53l0x_dev,&myrefSpadCount,&myisApertureSpads); //执行参考Spad管理 refSpadCount = 8;isApertureSpads= 1
if(Status == VL53L0X_ERROR_NONE)
{
VL53L0X_GetReferenceSpads(&vl53l0x_dev,&myrefSpadCount_readout,&myisApertureSpads_readout); //执行Spad校准后 refSpadCount = 8;isApertureSpads= 1
Write_eeprom(refSpadCount_addr,&myrefSpadCount,sizeof(myrefSpadCount));
Write_eeprom(isApertureSpads_addr,&myisApertureSpads,sizeof(myisApertureSpads));
Read_eeprom(refSpadCount_addr,&myrefSpadCount_readout,sizeof(myrefSpadCount_readout));
Read_eeprom(isApertureSpads_addr,&myisApertureSpads_readout,sizeof(myisApertureSpads_readout));
if((myrefSpadCount != myrefSpadCount_readout) && (myisApertureSpads_readout != myisApertureSpads ) )
{
goto ERR1;
}
}
else
{
goto ERR1; //让LED灭,表示标定不成功
}
//Status |= VL53L0X_StaticInit(&vl53l0x_dev);
Status |= VL53L0X_PerformRefCalibration(&vl53l0x_dev, &myVhvSettings, &myPhaseCal);//Ref参考校准 (如果中断充许,则会产生中断,中断会被清除)
if(Status == VL53L0X_ERROR_NONE)
{
VL53L0X_GetReferenceSpads(&vl53l0x_dev,&myrefSpadCount_readout,&myisApertureSpads_readout);
Write_eeprom(VhvSettings_addr,&myVhvSettings,sizeof(myVhvSettings));
Read_eeprom(VhvSettings_addr,&myVhvSetting_readout,sizeof(myVhvSetting_readout));
if(myVhvSettings != myVhvSetting_readout) goto ERR1;
Write_eeprom(PhaseCal_addr,&myPhaseCal,sizeof(myPhaseCal));
Read_eeprom(PhaseCal_addr,&myPhaseCal_readout,sizeof(myPhaseCal_readout));
if(myPhaseCal == myPhaseCal_readout)
GPIOB_ResetBits(OBJ_LED); //让LED亮
else
goto ERR1 ;
}
else
{
ERR1: GPIOB_SetBits(OBJ_LED); //让LED灭,表示标定不成功
}
}
else if(KEY2_PRESS_flag) //Download键 做offset键
{//第二步 暗环境 100mm
GPIOB_SetBits(OBJ_LED);; //让LED灭,不影响标定
KEY2_PRESS_flag = 0 ;
mDelayuS(20);
Status |= VL53L0X_PerformOffsetCalibration(&vl53l0x_dev,myCalDistanceMilliMeter,&myOffsetMicroMeter);//长距离
if(Status == VL53L0X_ERROR_NONE)
{
Write_eeprom(pOffsetMicroMeter_addr,&myOffsetMicroMeter,sizeof(myOffsetMicroMeter)); //把标定的结果写入EEPROM
Read_eeprom(pOffsetMicroMeter_addr,&myOffsetMicroMeter_readout,sizeof(myOffsetMicroMeter_readout));
if(myOffsetMicroMeter == myOffsetMicroMeter_readout)
GPIOB_ResetBits(OBJ_LED); //让LED亮
else
goto ERR2;
}
else
{
ERR2: GPIOB_SetBits(OBJ_LED);; //让LED灭,表示标定不成功
}
}
//串扰校准-----------------------------------------------------
else if(KEY1_PRESS_flag) //KEY键 做XTALK
{//第三步 600mm 最好暗环境
GPIOB_SetBits(OBJ_LED);; //让LED灭,不影响标定
KEY1_PRESS_flag = 0;
mDelayuS(20);
Status |= VL53L0X_PerformXTalkCalibration(&vl53l0x_dev,(600<<16),&myXTalkCompensationRateMegaCps); //现是600mm,我知道要以实际实际测距拐点为准,但一般为450--600mm
if(Status == VL53L0X_ERROR_NONE)
{
Write_eeprom(pXTalkCompensationRateMegaCps_addr,&myXTalkCompensationRateMegaCps,sizeof(myXTalkCompensationRateMegaCps));
Read_eeprom(pXTalkCompensationRateMegaCps_addr,&myXTalkCompensationRateMegaCps_readout,sizeof(myXTalkCompensationRateMegaCps_readout));
if(myXTalkCompensationRateMegaCps == myXTalkCompensationRateMegaCps_readout)
GPIOB_ResetBits(OBJ_LED); //让LED亮
else
{
goto ERR3;
}
}
else
{
ERR3: GPIOB_SetBits(OBJ_LED);; //让LED灭,表示标定不成功
}
}