I2C(Inter-Integrated Circuit)总线是一种用于连接微控制器和各种外围设备的通信协议。它使用两条线:串行数据线(SDA)和串行时钟线(SCL),实现了设备之间的简单、高效通信。以下是I2C总线数据包结构的详解:
一、I2C总线数据包的基本组成
I2C总线上的数据传输以数据包为单位进行,每个数据包包含起始信号、设备地址、数据传输方向位、数据字节以及应答信号(ACK/NACK)等部分。
- 起始信号(S) :
- 起始信号标志着数据传输的开始。当SCL为高电平时,SDA由高电平向低电平跳变,即产生起始信号。
- 所有连接到I2C总线的设备都会检测到起始信号,并准备接收后续的数据。
- 设备地址 :
- 紧接着起始信号的是设备地址。I2C总线上的每个设备都有一个唯一的地址,用于区分不同的设备。
- 设备地址可以是7位或10位,但在实际应用中,7位地址更为常见。
- 设备地址后面紧跟着一个数据传输方向位,用于指示后续的数据传输方向。该位为0时表示写操作,为1时表示读操作。
- 数据字节 :
- 数据以字节为单位进行传输,每个字节包含8位数据。
- 在传输每个字节时,主设备在SCL的每个时钟周期内将一位数据放置在SDA线上。数据从高位到低位依次传输。
- 应答信号(ACK/NACK) :
- 每传输完一个字节后,接收设备会返回一个应答信号。
- 应答信号为低电平时表示应答(ACK),表示接收设备已正确接收到数据,并准备接收下一个字节。
- 应答信号为高电平时表示非应答(NACK),表示接收设备无法接收更多数据或数据传输出现错误。
二、I2C总线数据包的传输过程
- 写操作 :
- 主设备发送起始信号。
- 主设备发送从设备地址和数据传输方向位(写操作)。
- 从设备确认地址匹配后返回应答信号。
- 主设备发送数据字节。
- 从设备接收数据字节并返回应答信号。
- 重复上述步骤,直到所有数据传输完毕。
- 主设备发送停止信号,标志着数据传输的结束。
- 读操作 :
- 主设备发送起始信号。
- 主设备发送从设备地址和数据传输方向位(读操作)。
- 从设备确认地址匹配后返回应答信号。
- 从设备发送数据字节。
- 主设备接收数据字节并返回应答信号(如果需要继续接收数据)或非应答信号(如果不需要继续接收数据)。
- 重复上述步骤,直到所有数据传输完毕。
- 主设备发送停止信号,标志着数据传输的结束。
三、I2C总线数据包的复合格式
在实际应用中,I2C通信更常用的是复合格式,即在一次通信过程中包含多次起始信号和停止信号。这种格式允许主设备在一次通信中访问多个从设备或进行复杂的读写操作。
例如,主设备可以先向一个从设备发送一个寄存器地址,然后读取该寄存器的值。在这个过程中,主设备会先发送起始信号、从设备地址和写操作方向位,然后发送寄存器地址。接着,主设备会再次发送起始信号、从设备地址和读操作方向位,然后从设备会返回寄存器的值。最后,主设备发送停止信号结束通信。