2. I2C协议帧格式:起始条件、停止条件、数据有效性、字节传输与应答机制(ACK/NACK)

I2C总线上的每一次通信都以一个完整的帧(Frame)为单位。理解帧格式是分析时序、调试设备的基础。本章将逐一拆解构成I2C帧的五个核心要素:起始条件、停止条件、数据有效性、字节传输顺序以及应答/非应答机制。

2.1 帧结构总览

一个标准的I2C写操作帧包含以下顺序:起始条件 → 从机地址(7位)→ 读写位(R/W)→ 应答位(ACK)→ 数据字节(8位)→ 应答位(ACK)→ … → 停止条件。读操作帧类似,但数据方向由从机驱动。

I2C完整帧结构时序图 I2C 完整帧结构(写操作示例) SCL SDA S 起始 从机地址 (7位) 例如:0x50 R/W 0=写 ACK 应答 数据字节 (8位) 例如:0xA5 ACK 应答 P 停止 关键说明: 1. 起始条件(S):SCL高电平时,SDA由高→低跳变,由主机独占发起。 2. 从机地址 + R/W:主机发送7位地址 + 1位读写方向(0=写,1=读)。 3. 应答位(ACK):每字节后接收方必须拉低SDA表示应答;若为NACK(高电平),主机可终止传输。 4. 停止条件(P):SCL高电平时,SDA由低→高跳变,释放总线。 5. 数据字节:MSB优先传输,每字节后跟一个应答位。

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的特殊信号。
I2C数据有效性时序图 数据有效性:SCL高电平时SDA必须稳定 SCL SDA D7 D6 D5 D4 D3 ✅ SCL高电平时,SDA数据必须保持稳定(采样窗口)。 ✅ 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低→高