通讯协议

I2C 协议

I2C 是一种双线半双工的通信协议,只能用于短距离通信。实现I2C需要两根信号线完成信息交换,SCL时钟信号线,SDA数据输入/输出线。
它属于同步通信,由于输入输出数据均使用一根线,因此通信方向为半双工。

I2C 采用单总线通信,即所有设备都连接到同一个总线上,并且同一时间只能有一个设备在总线上进行通信。

通讯方式

数据通信中,传输方式可以分为单工通信和半双工通信、全双工通信三种。I2C 采用半双工通信。

单工通信: 是指消息只能单方向传输的工作方式。
半双工: 是指数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送,因此又被称为双向交替通信。
全双工: 是指在通信的任意时刻,线路上可以同时存在A到B和B到A的双向信号传输。

工作原理

以下是I2C消息数据,被分解为数据帧 。每条消息都有一个地址帧,其中包含从设备的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件、读/写位和 ACK/NACK 位:

起始条件:在 SCL 线 从高电平变为低电平 之前, SDA 线从高电平变为低电平。
停止条件: SCL 线 由低电平 变为高电平后, SDA 线 也由低电平变为高电平。
地址帧: 每个从机独有的 7 位或 10 位序列,当主机想要与从机通信时,用于识别从机。
读/写位: 单个位指定主机是否正在向从机发送数据(低电压电平)或向从机请求数据(高电压电平)。
ACK/NACK 位: 消息中的每个帧后面都有一个确认/不确认位。如果成功接收地址帧或数据帧,则接收设备会向发送方返回一个 ACK​​ 位。

数据传输

I2c数据在传输过程时,有约定的条件,了解这些条件后,就能看懂时序图了。

1、位传输规定
SCL为高电平时,SDA线必须保持稳定,SDA上传输1个bit数据;数据改变:SCL为低电平时,SDA线才可以改变电平。

2、起始和结束信号

起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。起始信号由主控制器产生。

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。结束信号也只能由主控制器产生。

3、应答信号
SDA主线上每个字节均由8位组成,主机每发送完8bit数据后等待从机ACK。即在第9个clock,若从机发回ACK,SDA会被拉低。若没有ACK,SDA会被置高,主控则需要重新发送或者停止。在时钟信号为高电平期间,数据线上的数据必须保持稳定,这个值则为发送数据的值。

简单理解,正确发送一个数据,SCL需要经过9个时钟信号,这些时钟信号都是规律的类似正弦波形。在SCL高电平时,SDA稳定时的值就是数据。在SCL低电平时,SDA可以改变值,直到稳定,等待SCL也处于高电平。

4、仲裁机制
这个是I2C协议中的重要机制,当多个设备同时请求I2C总线时,谁先拿到总线谁就先发送数据,这个主要是通过SDA的电平状态来判断。SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。当出现高低两种电平,则处于低电平端主机优先级更高,此时则会断开发送高电平的主机。

从图中可以看到DATA1主机发送的“101…”,DATA2主机发送的“1001”,在传输第3位时,DATA2因为是低电平,则优先拿到主线,DATA1因为是高电平,与主线电平冲突,则会主动放弃连接。每个主机在发送1位数据后,会确认总线数据是否和自己发送数据一致,是则继续发送,否则退出竞争。

注意

不管是从机还是主机,每次在收到数据后,需要向对方发送一个ACK应答信号,否则主机会一直等待,直到超时退出。