|
|
這個器件的API實在太爛了。
一是, 該API 太大了, 本想用在STM8L中,但無論如何空間度不夠。
二是,移植時的兼容性太差了, 整個API混亂不堪。
看看當(dāng)時跟蹤的實際記錄:
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
前段時間調(diào)試一個 狀態(tài) 0x50 錯誤, 花了兩天跟蹤,才找到原因處理好, 結(jié)果又發(fā)現(xiàn)出現(xiàn) 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);
}
發(fā)開始測量:
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字節(jié)數(shù)據(jù)
for(i=0;i<12;i++)
gbuf[i]=LR_VL53L0X_Read(VL53L0X_REG_RESULT_RANGE_STATUS+i);
讀取狀態(tài), 這個不能省略 , 因為讀出異常時,前面操作也會返回值 比如 20 , 要讀出狀態(tài)碼判斷是否成功
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
該程序工作正常, 但只能測量短距離模式,無法切換到長距離。
總之,這個器件是垃圾。
|
|