前言
笔者刚学习i2c协议时,翻到了62页的官方文档,直接就被页数和满屏的英文劝退了;后来又翻到了ti上一篇讲解i2c的文章,也是洋洋洒洒写了8页,看似认真地看完,结果被问了一个基础的问题又答不上来,才发现自己什么都没记住。正所谓纸上得来终觉浅,绝知此事要躬行,将抓取的数据与协议相对照来理解,记忆才能更加深刻。
前置准备
工具安装
首先我们需要下载一个逻辑分析仪,它由MuseLab推出,对硬件软件以及上位机均开源,同时支持百余种协议解析。
github地址如下:github.com/wuxx/nanoDL…
将项目拉取到本地,software目录下有工具的安装向导,仓库的readme文档有具体操作方法,照着操作即可。
i2c连接
用三根线实现i2c通信,其中一根线接地,一根作为SCL(serial clock),一根作为SDA(serial data)。
串口连接到计算机设备方便查看
- 用usb转串口连接线,如未安装相关驱动,应先安装,对应驱动版本可以从官网下载。
- 通过电脑的设备管理器(windows下)确认串口com版本,然后用serial方式连接开发板设备,波特率设置为115200。
抓取数据并可视化
设置好采样数据大小和采样率,即可点击运行按钮开始采样。采样结束后,配置具体的解析协议,PlusView就会将数据以可视化的形式展现出来。
协议分析
- D4那条线是SCL(时钟线),D6是SDA(数据线),开始标志就是在SCL高电平的情况下SDA的下降沿,结束标志就是它的上升沿;
正因为下降上升标志着开始和结束这两个控制命令的中断,所以在传输数据的过程中,SCL高电平时,SDA的电平应该保持稳定。
- ACK就是,当SCL低电平时,SDA也会被下拉成低电平,所以在之后SCL是高电平的时钟周期里SDA依然保持低电平。
- 而NACK则是:在第9个时钟周期内,主机会释放总线,然后因为上拉电阻的缘故,总线会变成高,这个时候从机拉低总线表示应答,然后归还总线给主机总线,表现为SCL和SDA都是高电平。
- i2c支持双工通信的基础之一是:一个设备只能将总线的电平拉低或者释放总线,让上拉电阻来提高电压,而无法让总线保持高电平。
- stop之后的SCL和SDA都是高电平表示处于空闲状态。
- 有时候可能会出现这种一个start后面没有stop直接又是一个start的情况。
理论上这是为了防止在多主节点的环境下,主节点失去对总线的控制;实践中多用于连续读或者写。
补充小知识
- i2c可同时挂载多少个设备?
i2c有8位,其中一位为读写位,所以理论上最大可挂载2^7-1=127个设备,但由于保留地址限制,实际最多可挂载112个设备。
- i2c波特率问题
I2C标准波特率为100Kbit/s,最高传输速率可达400Kbit/s。
参考资料
- Understanding the I2C Bus
- PlusView演示结果