一、I2C
IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发。 主要是用来方便微控制器与外围器件的数据传输。 它是一种半双工,由SDA(数据)和SCL(时钟)组成的两线式串行传输总线。
协议版本:
https://www.dreamsourcelab.cn/doc/UM10204%20I2C-bus%20specification%20and%20user%20manual.pdf
IIC的时钟线总是由主机控制,主机与从机之间的数据传输只在SDA一根线上完成,不能同时发送和接收数据,所以IIC是一种半双工的通信协议。一条IIC总线上面可以挂载多个设备,每一个设备都有其对应的设备地址,设备之间数据传送只能由一个设备传送给对应地址的设备。
IIC的总线连接可以接受多主机的模式,也就是说一条IIC总线上面可以有多个设备可以作为主机来使用,但是在一次数据的传输过程中只能有一个设备作为主机。一条IIC总线上面谁是主机取决于总线上面的时钟和数据信号由谁控制。如图所示,这一条IIC总线上面挂载了多个设备,其中MCU1和MCU2都可以作为主机来使用,但是不能同时有两个主机。
如果两个MCU同时发起开始信号时(都试图成为主机),这时候IIC的仲裁机制会发挥作用来判定谁成为主机。
IIC的仲裁机制得益于其开漏的输入输出结构。当SCL线上挂载的多个设备,其中的MCU2的SCL输出低电平,那么这条IIC总线SCL就会被MCU2拉低,这也就是“与”的特性。
IIC上的仲裁主要是由两部分组成SCL时钟同步、SDA线仲裁。
CLK1和CLK2都是连接在一条SCL线上的设备同时产生的时钟信号,由于IIC总线存在“与”的特性,所以两个设备高电平相同的部分形成了SCL最终的时钟,也就是说同一条IIC总线上面的时钟都是相同的。
同样SDA仲裁也是基于“与”的特性。如图所示当两个设备同时发出开始信号想要传送数据时,在第一个和第二个周期内DATA1和DATA2的数据都是相同的,然后两者继续传送数据,当在第三个时钟周期时DATA2与SDA的数据不一致,这个时候设备2就会停止发送数据,转而启动接收模式。这样SDA的数据就会与DATA1的数据保持一致,并且设备2停止发送数据也不会影响SDA的数据。
二、协议规范
2.1 编码规则
2.2 信号传输
IIC总线上面的每一个设备都有唯一的地址与之对应,信号传输时也是根据指定的地址找到设备来传输信号。
写操作:主机确定了从机的设备地址后,生成一个开始信号,然后向IIC总线上面发送设备的地址和读写方向标志。从机检测到该地址和自己设备地址相对应后,回复主机一个应答信号。主机接收到应答信号后就开始向这个设备以字节为单位发送数据,每一个字节后面都会带有从机的应答信号,直到主机发送完成最后一个数据后生成一个停止信号结束此次数据的传输。
读操作:读操作与写操作有一些类似,同样的是需要确定需要读取的从设备的地址。然后主机生成开始信号,再向IIC总线上发送从设备的地址和读数据的指令。从设备接收到地址与自己的吻合后会产生一个应答信号。就这从设备就开始向主机发送主机想要读取的数据,主机正确接收数据后会向从机回复应答信号,当主机想要结束读取操作时,主机会回复一个非应答信号,然后生成停止信号结束数据的读取。
2.3 传输示例
主机向地址为0XA0 的设备写入0X0C。
0xA0 =( (0xA0 >> 1 ) << 1) |
w
‾
\overline{\text{w}}
w
w ‾ \overline{\text{w}} w = 0
三、逻辑分析仪软件的配置
打开软件,配置成I2C。
文章来源:
利用逻辑分析仪进行I2C总线的全面分析