你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TOF传感器(VL53L5),无法得到data ready

[复制链接]
Danny1973 提问时间:2025-6-19 11:45 / 未解决

软件环境:基于STSW-IMG023示例代码,将代码移植到KEIL5下使用;

硬件环境:STM32F405芯片和VL53L5CX-SATEL模块;

问题描述:完成传感器初始化(测距频率10hz,测距连续模式)之后,使用polling的方式读取数据,调用vl53l5cx_check_data_ready函数读取到传感器数据是:0x00, 0x03, 0x01, 0x0D,这四个值在判断后认为data not ready。

我想知道这四个值分别代表什么意义?我查了我已知的文档(DS13754,um2884等)未找到相关的寄存器说明。

为何出现这样的原因,以及我应该如何调试?

感谢!

收藏 评论3 发布时间:2025-6-19 11:45

举报

3个回答
深圳好星星 回答时间:5 天前

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对应窗口。

深圳好星星 回答时间:5 天前
Danny1973 回答时间:5 天前

深圳好星星 发表于 2025-6-20 14:07
L5CX的驱动是跑在user层面的,没有寄存器说明文档。</p>
<p>关于你提到的现象直接原因应该就是测距数据没有完 ...

[md]谢谢你的建议,我抓取了I2C数据发现确实在初始化过程中有问题,某个寄存器的读取一直是0,导致与期待值不符,反复读取后timeout了,但程序并未处理这个错误的返回状态,才会继续往后执行。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版