找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 655|回复: 7
打印 上一主题 下一主题
收起左侧

VL53L0X怎么使用呢?

[复制链接]
跳转到指定楼层
楼主
ID:1162261 发表于 2025-10-31 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试VL53L0X测距芯片,但在网上找了很久都没有找到其寄存器介绍的文档;只找到了用stm32调用api的程序,自己用stm32测试了一下自己的VL53L0X芯片,是可以测试距离的;但是想用其他32芯片 来测试VL53L0X芯片,发现这个api程序体积太大了,装不下;想直接操控寄存器,这样体积小点;但在网上查询的程序,总是在0x14状态寄存器时,就会出现0x5F;而测试距离数据是不对的;不知道什么原因;望大佬给点拨一下,谢谢!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1064915 发表于 2025-10-31 16:22 | 只看该作者
VL53L0X是意法半导体推出的第二代FlightSense™技术激光测距传感器,其官方数据手册及相关技术资料可通过权威渠道获取
回复

使用道具 举报

板凳
ID:1138150 发表于 2025-11-1 00:34 | 只看该作者
VL53L0X 的状态寄存器(0x14)用于指示最后一次测距的结果状态。值 0x5F 换算成二进制是 0101 1111。根据VL53L0X的文档,这个值的含义是:  Bit [7:4]: 0101 - 这表示测量状态。0101 通常对应 Ranging API Error 或类似的硬件错误状态。这告诉你,传感器内部的状态机在执行测距流程时遇到了问题,没有正常完成。  Bit [3:0]: 1111 - 这表示流状态。1111 通常对应 GPTIMING 状态,意思是传感器正在等待某个内部定时器事件。  组合起来,0x5F 的含义是:传感器卡在了某个内部等待状态,并最终因为超时或错误而停止了测量。 这几乎总是由于初始化序列不正确或关键配置寄存器设置错误导致的。
回复

使用道具 举报

地板
ID:1138150 发表于 2025-11-1 00:35 | 只看该作者
VL53L0X 的状态寄存器(0x14)用于指示最后一次测距的结果状态。值 0x5F 换算成二进制是 0101 1111。根据VL53L0X的文档,这个值的含义是:

Bit [7:4]: 0101 - 这表示测量状态。0101 通常对应 Ranging API Error 或类似的硬件错误状态。这告诉你,传感器内部的状态机在执行测距流程时遇到了问题,没有正常完成。

Bit [3:0]: 1111 - 这表示流状态。1111 通常对应 GPTIMING 状态,意思是传感器正在等待某个内部定时器事件。

组合起来,0x5F 的含义是:传感器卡在了某个内部等待状态,并最终因为超时或错误而停止了测量。 这几乎总是由于初始化序列不正确或关键配置寄存器设置错误导致的。

回复

使用道具 举报

5#
ID:420836 发表于 2025-11-2 06:17 | 只看该作者
官方网站下载数据手册
回复

使用道具 举报

6#
ID:1162375 发表于 2025-11-2 13:01 | 只看该作者
VL53L0X 直接操作寄存器时出现状态寄存器 0x14 为 0x5F 且测距错误,核心原因可能是初始化流程不完整或寄存器配置顺序错误
回复

使用道具 举报

7#
ID:628113 发表于 2025-11-7 09:03 | 只看该作者
这个器件的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

该程序工作正常, 但只能测量短距离模式,无法切换到长距离。

总之,这个器件是垃圾。
回复

使用道具 举报

8#
ID:57657 发表于 2025-11-8 13:17 | 只看该作者
你要用其他32芯片驱动哪就是程序移植问题,有问题用逻辑分析仪检查时序差异。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表