I2C总线协议笔记

1.I2C概念

I2C总线为PHILIPS公司推出的串行通信总线,具有接线少,控制方式简单,通信速率高等优点。采用数据线SDA和时钟线SCL构成通信线路,各器件可通过并联到总线上实现数据收发,器件间彼此独立,通过唯一的总线地址区分。传输数据时每个字节后需带一个响应位
三种I2C传输模式:标准模式传输速率100k bit/s,也支持100k bit/s以下的速度传输,快速模式传输速率400k bit/s,高速模式可达3.4M bits/s(一般设备不支持)。

I2C硬件结构图

I2C总线上各器件都采用漏极开路(OD)的形式与总线连接,因此SCL和SDA均需接上拉电阻,才能输出高电平。也就是说在SCL和SDA的常态为高电平,在IO口输出低电平的时候为低电平,I2C原理图如下图所示。
I2C总线协议笔记

I2C总线协议

数据有效性

SDA上的数据必须在SCL为高电平的时候保持稳定,只有在SCL为低电平时,数据线的数据改变才是有效的,如下图所示。
I2C总线协议笔记
启动和停止条件
所有通过I2C传输的数据都是由START开始,有STOP终止。START条件为:当SCL为高电平时,SDA线上由高电平转换为低电平。STOP条件为:当SCL为高电平时,SDA线上由低电平转换为高电平,如图所示。I2C总线协议笔记
START和STOP条件都是由Master产生得,I2C总线在START条件后是繁忙的,在STOP条件后是空闲的。如果重复满足START条件,则总线将保持繁忙。

数据有效性和字节格式

在SCL的每一个时钟脉冲期间,会传输一个数据位。一个字节由SDA行上的8位数据组成,可以是设备地址、寄存器地址或从slave写入或读出的数据。
数据首先传输最高位(MSB),在START和STOP条件之间,可以从master传输到slave任意数量的数据字节。SDA线上的数据必须在时钟SCL为高电平时保持稳定,因为当SCL为高电平时,数据线上的变化被定义为控制指令(START或STOP)。
I2C总线协议笔记

Acknowledge (ACK) and Not Acknowledge (NACK)

在每一个字节(8bit)的数据(包括地址字节)后面有一个来自于接收器的一个ACK位。ACK位允许接收器与发送器通信,表示该字节已成功接收,并可以发送另一个字节。
在接收器能够发送ACK之前,发射器必须释放SDA线路,为了发送ACK位,接收器应该在ACK/NACK相关时钟(期间9)的低电平时拉SDA线,以便于在ACK/NACK相关时钟时段的高位SDA线稳定。
当SDA线在ACK/NACK相关时钟器件保持低电平时,则解释为ACK;若保持为高电平则解释为NACK。有几种条件会导致产生NACK:
1.接收器正在执行一些实时功能,没有准备好开始与master的通信,无法进行接收和传输。
2.在传输过程中,接收器得到它不理解的数据或指令。
3.在传输过程中,接收器无法接收更多的数据字节。
I2C总线协议笔记

数据读写流程

写标准流程为:
1.Master 发起 START
2.Master 发送 I2C addr (7bit)和 w操作0 (1bit),等待ACK.
3.Slave 发送 ACK
4.Master 发送 reg addr (8bit),等待ACK
5.Slave 发送 ACK
6.Master 发送data(8bit),即要写入寄存器中的数据,等待ACK
7.Slave 发送ACK
8 第6步和第7步可以重复多次,即顺序写多个寄存器
9 Master 发起STOP
I2C总线协议笔记

读寄存器的标准流程为:
1.Master 发送I2C addr (7bit)和W操作1(1bit),等待ACK
2.Slave发送ACK
3.Master 发送reg addr(8bit),等待ACK
4.Slave 发送ACK


5.Master 发起START
6.Master 发送I2C addr(7bit)和R操作1(1bit),等待ACK
7 Slave 发送ACK
8 Slave发送data(8bit),即寄存器里的值
9 Master发送ACK
10 第8步和第9步可以重复多次,即顺序读多个寄存器
I2C总线协议笔记

上一篇:黑群晖系统备份与恢复


下一篇:如何使用wipefs命令擦除磁盘上的签名