一、VL53L1X简介
VL53L1X属于STMicroelectronics即常说的意法半导体(ST)公司推出的FlightSense? 产品系列ToF(Time of flight)激光测距传感器。
VL53L1X它是市场上最快的微型ToF传感器,精确测距能力4米,测距频率50米 Hz。单光子雪崩二极管采用微型可回流焊封装(SPAD)接收阵列,940nm激光1类发射器、物理红外滤波器和光学器件在各种环境照明条件下都能达到最佳的测距性能,并提供一系列覆盖窗口的选择。
由于包装小,很容易集成到设备中。与传统的红外传感器不同,VL53L1X采用ST最新一代ToF无论目标颜色和反射率如何,技术都可以进行绝对距离测量。接收阵列也可以对接收ROI编程大小(感兴趣区域)以减少传感器 FoV(视角)。VL53L1X激光测距传感器的实物图如下图所示。
二、I2C概述
Inter-Integrated Circuit,缩写为内部集成电路接口IIC或I2C。IIC总线是一种由PHILIPS连接微控制器及其外围设备的公司开发的两线串行总线。I2C总线的物理连接非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)和上拉电阻。通信原理是正确的SCL和SDA线高低电平时序的控制产生I2C数据传输是总线协议所需的信号。当总线处于空闲状态时,这两条线通常被上面连接的上拉电阻拉高,以保持高电平。如下图所示,单片机和单片机I2C接口传感器之间的通信图。
三、I2C总线协议
对I2C总线的操作实际就是主从设备之间的读写操作。大致可分为以下两种操作情况:
- 从设备中写下主要设备的数据。数据传输格式如下:
二是主设备从设备中读取数据。数据传输格式如下:
实际上把I2C协议分开后,其组成包括始条件、终止条件、地址段、数据段、响应ACK、非响应NACK。
(1)START和STOP,主机的起始和终止条件是由主机决定的(master)启动产生。总线起步后处于忙碌状态,停止后处于空闲状态。
起始条件:SCL线是高电平时,SDA从高电平到低电平切换线。
停止条件:SCL线是高电平时,SDA从低电平到高电平切换线。
- 地址段,地址段7bit地址 读写位组成,一个7-bit地址从最高位置(MSB) 开始发送,地址后面会跟着1-bit(R/W)操作符,1表示读操作,0表示写操作。 下一个bit是NACK/ACK,在这个帧个帧中 bit接收端的设备发送后获得SDA控制权,接收设备应在第9时钟脉冲前回复ACK(将SDA如果没有接收设备,则表示接收正常SDA拉低,说明接收设备可能没有收到数据(如设备不存在或设备繁忙)或无法分析收到的信息,假如是这样,那就由master决定如何处理,比如停止。
- 数据段,SDA数据线上的每个字节必须是8位,每个字节的数量没有限制。每个字节后必须有响应位(ACK)。首先传输的数据是最高的(MSB),SDA数据必须在上面SCL在高电平周期中保持稳定,数据的高低电平发生变化SCL低电平时期。
以传输Byte:1010 1010 (0xAAh)为例,SDA SCL传输时序如下:
- 响应ACK(Acknowledge)和非响应NACK(Not Acknowledge),
每个字节传输必须带有响应位,相关响应时钟也由主机产生。在响应时钟脉冲期(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。以传输10101010101为例,SCL第九时钟高电平信号期间,SDA拉低代表有ACK响应位。当在SCL第9位时钟高电平信号期间,SDA这种情况被定义为仍然保持高电平NACK非响应位。在这种情况下,主机可以直接生成STOP条件终止后的传输或继续重新START开始新的传输。会出现以下情况NACK位:
a、接收器无发送机响应地址,接收器无任何响应地址ACK发送给发射机;
b、由于接收机处理实时程序繁忙,无法接收或发送;
c、在传输过程中,接收器无法识别发送机的数据或命令;
d、接收机无法接收;
e、主机读取数据后,主机应发送数据NACK最后通知机器。
以下图例代表NACK时序:
根据I2C协议分解的每个部分都可以得到读写的时序图,以传感器的地址为0x09寄存器写入两个字节 0x02和0x以84为例,如下图所示。
从传感器的地址为0x09的寄存器中读出两个字节0x02和0x以84为例,时序图如下所示。
四、激光测距实验
使用激光测距实验STM32的GPIO模拟I2C激光测距模块VL53L1X串口1即相连接UART1,通过USB将计算机连接到转串口模块I2C获取到的VL53L1X的距离值(mm通过串口1传输到计算机端串口调试助手显示出来。做该实验的时候需要把视觉模组暂时取下,并且把USB转串口的线接到视觉模组接口处。激光测距模组VL53L1X在无人机支架底部,杜邦线和SH1.0接口接到主板上的USART3(这里用该接口的GPIO模拟I2C)的接口上,如下图所示。
根据原理图,可以看到VL53L1X的I2C接口分别是:PB10、PB11,如下图所示。
串口1的配置可以参考《串口(基础收发),配置代码(通过调用官方库)。
获取VL53L1X的测距数据代码编写的思路如下:
代码思路
1 |
管脚配置 |
1、定义结构体; 2、使能时钟; 3、填充结构体; 4、装载结构体。 |
2 |
I2C读写逻辑 |
|
4 |
VL53L1X驱动 |
|
模拟I2C的GPIO初始化代码如下:
VL53L1X的初始化代码如下。
VL53L1X的测距代码如下。
每隔5s读取一次距离,并发送到串口上。代码如下所示。
这里注意要把串口的发送也配置好,这样才能把数据发送到电脑。串口1通过USB转串口模块接到电脑,保存、编译、下载代码,可以看到串口调试助手每隔5s在打印VL53L1X的2个字节的距离数据(mm为单位),数据如下图所示: