做嵌入式驱动开发,会使用逻辑分析仪是必不可少的技能。

什么情况需要使用逻辑分析仪

当你编写驱动与设备通信读写数据遇到问题时,可以用逻辑分析仪排除硬件问题,这样我们就可以安心找软件的bug了。

这里我以Kingst逻辑分析仪 LA1010型号为例,来说明。

连接硬件

逻辑分析仪相比示波器,体积优势明显,首先,你需要硬件工程师帮你把板子引出三根线SCL(时钟线) SDA(数据线) GND(接地)。

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_嵌入式


逻辑分析仪USB直连电脑供电,然后选择两个CH通道连上SCL和SDA,这里我把CH0连SCL,CH1连SDA,接地的线对应连上逻辑分析仪的GND即可。

逻辑分析仪软件设置

由逻辑分析仪厂家提供此软件

如图显示已连接,则说明软件工作正常

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_嵌入式_02


设置我们使用的通道,保存退出即可

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_kingst逻辑分析仪 Python_03


添加协议解析器,选择i2c

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_linux_04


SDA和SCL选择正确

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_kingst逻辑分析仪 Python_05


设置采样率和采样深度,提高采集时间有两个办法,一是提高采样深度,二是降低采样率

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_逻辑分析_06

使用i2c tool工具发送命令

直接adb push 到板子上执行

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_扫描测试工具_07

检测系统上有几组i2c

命令:i2cdetect -l 可以看到目前板子上,有三组i2c是可用的

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_扫描测试工具_08

检测挂载在i2c上的器件

命令:i2cdetect -r -y 0 检测i2c0上的设备

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_扫描测试工具_09


可以看到0x70的地址上有一个设备,是我添加的温湿度传感器

第一种测试方法,使用i2ctransfer读取16位寄存器(重点)

执行这一步之前,我们先设置SCL为下降沿,然后点启动,软件会等待触发

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_扫描测试工具_10

adb shell 执行./i2ctransfer -f -y 0 w2@0x70 0xef 0xc8 r1 触发(其中参数0为i2c0,w2表示写两个字节,@0x70为你的i2c设备(注意要7位地址),0xefc8 为验证传感器是否存在以及是否正确沟通的寄存器地址,详见温湿度寄存器手册)

如果采集时间太短可参考上诉办法,提高采集时间

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_嵌入式_11

如果硬件通信正常,我们把鼠标放到波形区域,按住ctrl键滑动鼠标滑轮,可以放大和缩小波形。我们不断缩小波形,会发现如下图形

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_嵌入式_12


再放大波形后可见,前一段为我发送0xefc8的命令,后一段为设备回复的ACK,值为0x08

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_逻辑分析_13


在右侧协议解析中,也能清晰的看到wirte read的数据

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_逻辑分析_14

第二种测试方法,使用i2cdump查看器件所有寄存器的值

i2cdump -f -y 0 0x70 (其中参数0为i2c0,0x70表示设备地址)

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_kingst逻辑分析仪 Python_15

缩小波形,能看到大段内容

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_扫描测试工具_16


再放大波形,能看到大量这种write之后能收到read回复,说明硬件通信正常

kingst逻辑分析仪 Python kingst逻辑分析仪 协议解析器_kingst逻辑分析仪 Python_17

能采集如上两种这样的数据,便说明硬件是ok的,如果我们编写的驱动获取不到数据,就要查看我们代码是否哪里有问题了。
注意:测试读取的寄存器地址不能直接用获取温湿度设备数据的寄存器,因为设备可能还没有使能,是无法获取到数据的,而0xefc8这种寄存器地址本身就是用于测试设备能否正常沟通,不需要使能设备。