2. I2C协议帧格式:起始条件、停止条件、数据有效性、字节传输与应答机制(ACK/NACK)
I2C总线上的每一次通信都以一个完整的帧(Frame)为单位。理解帧格式是分析时序、调试设备的基础。本章将逐一拆解构成I2C帧的五个核心要素:起始条件、停止条件、数据有效性、字节传输顺序以及应答/非应答机制。
2.1 帧结构总览
一个标准的I2C写操作帧包含以下顺序:起始条件 → 从机地址(7位)→ 读写位(R/W)→ 应答位(ACK)→ 数据字节(8位)→ 应答位(ACK)→ … → 停止条件。读操作帧类似,但数据方向由从机驱动。
2.2 起始条件与停止条件
起始条件(START)和停止条件(STOP)是I2C总线通信的唯一合法开始与结束标志。它们由主机(Master)产生,且必须满足严格的时序要求。
| 条件 | SCL状态 | SDA跳变方向 | 时序要求 | 备注 |
|---|---|---|---|---|
| 起始条件(S) | 高电平 | 高 → 低 | SCL高电平期间SDA完成跳变 | 总线从空闲变为忙碌 |
| 停止条件(P) | 高电平 | 低 → 高 | SCL高电平期间SDA完成跳变 | 总线从忙碌变为空闲 |
| 重复起始条件(Sr) | 高电平 | 高 → 低 | 与S相同,但前一个字节后无停止条件 | 用于改变传输方向或切换从机 |
调试提示:在逻辑分析仪上,起始条件表现为SDA线上一个明显的负脉冲(高→低),而停止条件为正脉冲(低→高)。如果波形中缺少停止条件,总线将一直处于忙碌状态,后续通信无法启动。
2.3 数据有效性
I2C协议规定:数据在SCL时钟的高电平期间必须保持稳定。只有在SCL为低电平时,SDA上的数据才允许发生变化。这一规则确保了数据采样的可靠性。
- 采样点:从机在SCL的上升沿或高电平期间采样SDA。
- 数据变化:必须在SCL低电平期间完成,以避免误判。
- 例外:起始条件和停止条件不受此规则约束,它们是在SCL高电平时改变SDA的特殊信号。
2.4 字节传输与MSB优先
I2C协议规定每个数据字节为8位,且高位(MSB)在前传输。这意味着发送方先发送第7位(最高位),最后发送第0位(最低位)。
示例:发送字节
0xA5(二进制 1010 0101)时,SDA上的位顺序为:1 → 0 → 1 → 0 → 0 → 1 → 0 → 1
字节传输完成后,发送方必须释放SDA线,由接收方在第9个SCL时钟周期内产生应答位。
2.5 应答机制(ACK/NACK)
应答机制是I2C协议可靠性的核心。每传输一个字节(8位),接收方必须在第9个SCL时钟周期内给出应答信号。
| 应答类型 | SDA电平(第9个SCL) | 含义 | 主机后续动作 |
|---|---|---|---|
| ACK(应答) | 低电平 | 接收成功,可以继续发送下一字节 | 继续传输或发送停止条件 |
| NACK(非应答) | 高电平 | 接收失败、设备忙、或传输结束 | 主机必须发送停止条件或重复起始条件 |
常见NACK原因:
- 从机地址不匹配(无设备响应)。
- 从机正在处理内部操作(如EEPROM写入中)。
- 从机接收缓冲区已满。
- 主机在读取操作中主动发送NACK以表示“不再读取”。
2.6 帧格式总结
下表汇总了I2C协议帧中每个字段的职责与长度:
| 字段 | 长度(位) | 方向 | 说明 |
|---|---|---|---|
| 起始条件(S) | 1 | 主机→总线 | SCL高时SDA高→低 |
| 从机地址 | 7 | 主机→从机 | 高7位地址,MSB优先 |
| 读写位(R/W) | 1 | 主机→从机 | 0=写,1=读 |
| 应答位(ACK/NACK) | 1 | 接收方→发送方 | 第9个SCL时钟 |
| 数据字节 | 8 | 发送方→接收方 | MSB优先,每字节后跟应答 |
| 停止条件(P) | 1 | 主机→总线 | SCL高时SDA低→高 |