做嵌入式驱动开发,会使用逻辑分析仪是必不可少的技能。
什么情况需要使用逻辑分析仪
当你编写驱动与设备通信读写数据遇到问题时,可以用逻辑分析仪排除硬件问题,这样我们就可以安心找软件的bug了。
这里我以Kingst逻辑分析仪 LA1010型号为例,来说明。
连接硬件
逻辑分析仪相比示波器,体积优势明显,首先,你需要硬件工程师帮你把板子引出三根线SCL(时钟线) SDA(数据线) GND(接地)。
逻辑分析仪USB直连电脑供电,然后选择两个CH通道连上SCL和SDA,这里我把CH0连SCL,CH1连SDA,接地的线对应连上逻辑分析仪的GND即可。
逻辑分析仪软件设置
由逻辑分析仪厂家提供此软件
如图显示已连接,则说明软件工作正常
设置我们使用的通道,保存退出即可
添加协议解析器,选择i2c
SDA和SCL选择正确
设置采样率和采样深度,提高采集时间有两个办法,一是提高采样深度,二是降低采样率
使用i2c tool工具发送命令
直接adb push 到板子上执行
检测系统上有几组i2c
命令:i2cdetect -l 可以看到目前板子上,有三组i2c是可用的
检测挂载在i2c上的器件
命令:i2cdetect -r -y 0 检测i2c0上的设备
可以看到0x70的地址上有一个设备,是我添加的温湿度传感器
第一种测试方法,使用i2ctransfer读取16位寄存器(重点)
执行这一步之前,我们先设置SCL为下降沿,然后点启动,软件会等待触发
adb shell 执行./i2ctransfer -f -y 0 w2@0x70 0xef 0xc8 r1 触发(其中参数0为i2c0,w2表示写两个字节,@0x70为你的i2c设备(注意要7位地址),0xefc8 为验证传感器是否存在以及是否正确沟通的寄存器地址,详见温湿度寄存器手册)
如果采集时间太短可参考上诉办法,提高采集时间
如果硬件通信正常,我们把鼠标放到波形区域,按住ctrl键滑动鼠标滑轮,可以放大和缩小波形。我们不断缩小波形,会发现如下图形
再放大波形后可见,前一段为我发送0xefc8的命令,后一段为设备回复的ACK,值为0x08
在右侧协议解析中,也能清晰的看到wirte read的数据
第二种测试方法,使用i2cdump查看器件所有寄存器的值
i2cdump -f -y 0 0x70 (其中参数0为i2c0,0x70表示设备地址)
缩小波形,能看到大段内容
再放大波形,能看到大量这种write之后能收到read回复,说明硬件通信正常
能采集如上两种这样的数据,便说明硬件是ok的,如果我们编写的驱动获取不到数据,就要查看我们代码是否哪里有问题了。
注意:测试读取的寄存器地址不能直接用获取温湿度设备数据的寄存器,因为设备可能还没有使能,是无法获取到数据的,而0xefc8这种寄存器地址本身就是用于测试设备能否正常沟通,不需要使能设备。