这个器件的API实在太烂了。
一是, 该API 太大了, 本想用在STM8L中,但无论如何空间度不够。
二是,移植时的兼容性太差了, 整个API混乱不堪。
看看当时跟踪的实际记录:
VL53L0X PLT: RdByte status: 0H Byte: 6H
VL53L0X PLT: RdByte status: 0H Byte: 4H
VL53L0X: PerformRefCalibration
VL53L0X API CAL: perform_ref_calibration/ PALDevDataGet
VL53L0X API CAL: perform_vhv_calibration / PALDevDataGet
VL53L0X API CAL: perform_vhv_calibration / WrByte status: 0
VL53L0X API CAL: perform_single_ref_calibration / WrByte status: 0
VL53L0X PLT: RdByte status: 0H Byte: 50H
VL53L0X API: GetInterruptMaskStatus / RdByte status: 0H Byte: 50H
VL53L0X API CORE: measurement_poll_for_completion / GetMeasurementDataReady status: FFFA
VL53L0X API CAL: perform_single_ref_calibration / measurement_poll_for_completion status: FFFA
VL53L0X API CAL: perform_single_ref_calibration / ClearInterruptMask status: FFFA
VL53L0X API CAL: perform_single_ref_calibration / WrByte status: FFFA
VL53L0X API CAL: perform_vhv_calibration / perform_single_ref_calibration status: FFFA
VL53L0X API CAL: perform_ref_calibration/perform_vhv_calibration status: FFFA
VL53L0X ErrorCode [-6]: Range error
VL53L0X: PerformSingleRangingMeasurement
Set Single Measurement ...
Set Perform Measurement ...
VL53L0X PLT: RdByte status: 0H Byte: 0H
VL53L0X PLT: RdByte status: 0H Byte: 50H
VL53L0X API: GetInterruptMaskStatus / RdByte status: 0H Byte: 50H
VL53L0X API CORE: measurement_poll_for_completion / GetMeasurementDataReady status: FFFA
Get data ...
Clear IntMask ...
VL53L0X Get: 0 mm
前段时间调试一个 状态 0x50 错误, 花了两天跟踪,才找到原因处理好, 结果又发现出现 no vhv value 错误。我是不高兴再陪它折腾了。连个寄存器都不肯给的器件,下次绝对不采用。
如果 不需要 使用 长距离的 测量选项,有个简单方法, 可以这样用:
#define VL53L0X_REG_RESULT_RANGE_STATUS 0x0014
u8 LR_VL53L0X_Send(u8 reg,u8 dat)
{
return I2C_WriteOneByte(VL53L0X_IIC_PORT,VL53L0X_ADDR, reg,dat);
}
u8 LR_VL53L0X_Read(u8 reg)
{
return I2C_ReadOneByte(VL53L0X_IIC_PORT,VL53L0X_ADDR,reg);
}
发开始测量:
LR_VL53L0X_Send(VL53L0X_REG_SYSRANGE_START, 0x01);
等待完成
while(cnt<=100)
{
val = LR_VL53L0X_Read(VL53L0X_REG_RESULT_RANGE_STATUS);
if (val & 0x01) break;
cnt++;
}
读取12字节数据
for(i=0;i<12;i++)
gbuf[i]=LR_VL53L0X_Read(VL53L0X_REG_RESULT_RANGE_STATUS+i);
读取状态, 这个不能省略 , 因为读出异常时,前面操作也会返回值 比如 20 , 要读出状态码判断是否成功
err=LR_VL53L0X_Read(VL53L0X_REG_RESULT_RANGE_STATUS);
err=(err&0x78)>>3;
下面是错误表:
char* vl53l0x_err[VL53L0X_MAXERR]={
"OK",
"VCSELCONTINUITYTESTFAILURE",
"VCSELWATCHDOGTESTFAILURE" ,
"NOVHVVALUEFOUND" ,
"MSRCNOTARGET",
"SNRCHECK",
"RANGEPHASECHECK",
"SIGMATHRESHOLDCHECK" ,
"TCC",
"PHASECONSISTENCY",
"MINCLIP" ,
"RANGECOMPLETE",
"ALGOUNDERFLOW",
"ALGOOVERFLOW",
"RANGEIGNORETHRESHOLD"};
实测正常时 , 并非返回 0 -OK, 而是 RANGECOMPLETE
该程序工作正常, 但只能测量短距离模式,无法切换到长距离。
总之,这个器件是垃圾。
|