
软件环境:基于STSW-IMG023示例代码,将代码移植到KEIL5下使用; 硬件环境:STM32F405芯片和VL53L5CX-SATEL模块; 问题描述:完成传感器初始化(测距频率10hz,测距连续模式)之后,使用polling的方式读取数据,调用vl53l5cx_check_data_ready函数读取到传感器数据是:0x00, 0x03, 0x01, 0x0D,这四个值在判断后认为data not ready。 我想知道这四个值分别代表什么意义?我查了我已知的文档(DS13754,um2884等)未找到相关的寄存器说明。 为何出现这样的原因,以及我应该如何调试? 感谢! |
keil调试阶段无法进行仿真,能进到仿真界面,但是无法执行程序,这个怎么解决?
STM32F4的IO口5V容忍问题
STM32F407的flash读写问题
询问STM32F407两种USB可以实现的功能
在CUBEMX生成的STM32F407VET6的I2S主机接收模式与I2S主机发送模式能正常运行,如何进行动态调整或者如何实现主机全双工?
STM32F407 多机RS485串口通讯+地址位唤醒+DMA空闲线接收,无法进入中断服务程序。
设置RDP等级为2的同时,有什么办法可以确保后续还能够烧录程序
STM32F407VET6 I2S 采用DMA传输问题
有STM32F4倒车雷达响应例程吗?
STM32F429I倒车雷达响应
L5CX的驱动是跑在user层面的,没有寄存器说明文档。
关于你提到的现象直接原因应该就是测距数据没有完成,排查的方向可以是以下几点:
1.. 请确认Init过程中没有报错
2.. I2C速度是多少?建议400kHz以上
3.. 在测距过程中,可以用手机摄像头(需确认摄像头没有红外滤波片)对准ToF激光发射孔,看一下是否有亮点。如果没有,说明器件并未正常测距。
4.. 执行一下代码看一下I2C读写是否符合预期:
/* To check the I2C RdByte/WrByte function :
Inside the function “vl53l5cx_is_alive()”, it will call I2C RdByte/WrByte to
read device and verion ID. which can help you to verify the I2C RdByte/WrByte
functions at same time. */ uint8_t device_id, revision_id; status |= WrByte(&(p_dev->platform), 0x7fff, 0x00); status |= RdByte(&(p_dev->platform), 0, &device_id); status |= RdByte(&(p_dev->platform), 1, &revision_id); status |= WrByte(&(p_dev->platform), 0x7fff, 0x02);
if(status) { printf("Error Rd/Wr byte: status %u\n", status); return status; }
/* To check the I2C RdMulti/WrMulti function:
Below is example codes which can help you vefify the I2C RdMulti/WrMulti
function. */
uint8_t Data_write[4]={0x5A,0xA5,0xAA,0x55}; uint8_t Data_read[4]={0,0,0,0}; uint8_t Data_default[4]={0,0,0,0};
status |= RdMulti(&(p_dev->platform), 0x100, Data_default, 4); if(status) { printf("Error RdMulti: status %u\n", status); return status; }
printf("Read default value and save it at begging\n"); printf("Data_default (0x%x)\n", Data_default[0]); printf("Data_default (0x%x)\n", Data_default[1]); printf("Data_default (0x%x)\n", Data_default[2]); printf("Data_default (0x%x)\n", Data_default[3]);
status |= WrMulti(&(p_dev->platform), 0x100, Data_write, 4); if(status) { printf("Error WrMulti: status %u\n", status); return status; } printf("Writing values 0x5A 0xA5 0xAA 0x55\n");
status |= RdMulti(&(p_dev->platform), 0x100, Data_read, 4); if(status) { printf("Error RdMulti: status %u\n", status); return status; }
printf("Reading:\n"); printf("Data_read (0x%x)\n", Data_read[0]); printf("Data_read (0x%x)\n", Data_read[1]); printf("Data_read (0x%x)\n", Data_read[2]); printf("Data_read (0x%x)\n", Data_read[3]);
status |= WrMulti(&(p_dev->platform), 0x100, Data_default, 4); printf("Write back default value\n"); if(status) { printf("Error WrMulti: status %u\n", status); return status; }
status |= RdMulti(&(p_dev->platform), 0x100, Data_default, 4); if(status) { printf("Error RdMulti: status %u\n", status); return status; }
printf("Read value again to make sure default value was correct loaded\n"); printf("Data_default (0x%x)\n", Data_default[0]); printf("Data_default (0x%x)\n", Data_default[1]); printf("Data_default (0x%x)\n", Data_default[2]); printf("Data_default (0x%x)\n", Data_default[3]);
printf("I2C test done - everything works fine.\n");
如需更深层次的debug,可以通过ST代理商联系ST对应窗口。
[md]谢谢你的建议,我抓取了I2C数据发现确实在初始化过程中有问题,某个寄存器的读取一直是0,导致与期待值不符,反复读取后timeout了,但程序并未处理这个错误的返回状态,才会继续往后执行。