2. I²C 通信时序详解:起始条件、停止条件、数据有效性、字节传输格式、ACK/NACK 机制

I²C 总线是一种同步、多主从、半双工的串行通信协议,其物理层仅由两条线构成:串行数据线(SDA)和串行时钟线(SCL)。所有通信行为都围绕这两条线上的电平变化与时序关系展开。理解起始条件、停止条件、数据有效性、字节传输格式以及应答机制,是进行 I²C 驱动开发和硬件时序调优的基础。

2.1 起始条件(S)与停止条件(P)

总线空闲时,SDA 和 SCL 均为高电平。起始条件和停止条件由主设备产生,是总线状态转换的关键标志。

条件 信号变化顺序 说明
起始条件(S) SCL 保持高电平 → SDA 从高电平跳变为低电平 表示一次传输开始,总线由空闲变为忙状态
停止条件(P) SCL 保持高电平 → SDA 从低电平跳变为高电平 表示一次传输结束,总线由忙变为空闲状态
重复起始条件(Sr) 在未产生停止条件前,再次产生起始条件 用于改变传输方向或切换从设备,不释放总线
驱动开发提示: 在设备树中配置时钟频率时,需确保主设备产生的 SCL 高电平宽度满足从设备对起始/停止条件的建立时间(tSU;STA)和保持时间(tHD;STA)要求。标准模式下 tHD;STA 最小为 4.0 µs。
起始条件与停止条件时序图 SDA SCL S SDA↓ while SCL=H P SDA↑ while SCL=H 数据传输阶段(SDA 在 SCL 低电平时变化)

2.2 数据有效性

I²C 协议对数据线上的采样时刻有严格规定,这是保证数据完整性的核心规则。

  • 数据稳定规则: 在 SCL 时钟的高电平期间,SDA 上的数据必须保持稳定。
  • 数据变化规则: 只有在 SCL 为低电平时,SDA 上的数据才允许发生变化。
  • 例外: 起始条件和停止条件属于例外情况,此时 SCL 为高电平,但 SDA 发生跳变。
数据有效性:SCL 高电平时采样 SDA SCL SDA 采样 采样 采样 采样 采样 采样 SDA 只在 SCL 低电平时变化

2.3 字节传输格式

I²C 总线上的数据以字节(8 位)为单位进行传输,每个字节后必须跟随一个应答位(ACK/NACK)。传输时高位(MSB)在前,低位(LSB)在后。

2.3.1 单字节写操作时序

I²C 单字节写操作时序(主设备→从设备) SCL SDA S A6 A5 A4 A3 A2 A1 A0 W ACK D7 D6 D5 D4 D3 D2 D1 D0 ACK P 从设备地址 + 读写位(8位) 数据字节(8位)

2.3.2 字节传输流程

  1. 主设备产生起始条件(S),总线进入忙状态。
  2. 主设备发送从设备地址(7 位或 10 位),高位在前。
  3. 主设备发送读写位(R/W):0 表示写操作,1 表示读操作。
  4. 从设备在第 9 个 SCL 时钟周期发送应答位(ACK),拉低 SDA 表示确认。
  5. 主设备发送/接收数据字节,每个字节 8 位,高位在前。
  6. 接收方在第 9 个时钟周期发送应答位:主设备发送数据时,从设备应答;从设备发送数据时,主设备应答。
  7. 主设备产生停止条件(P),总线恢复空闲状态。
关键参数: 标准模式下,SCL 时钟频率为 100 kHz,每位传输时间为 10 µs,一个字节(含 ACK)共 9 个时钟周期,耗时 90 µs。快速模式下频率为 400 kHz,每位 2.5 µs,一个字节耗时 22.5 µs。

2.4 ACK/NACK 机制

应答机制是 I²C 协议保证通信可靠性的核心。每个字节传输完成后,接收方必须给出应答信号。

应答类型 SDA 电平(第 9 个 SCL 时钟) 含义 典型场景
ACK(应答) 低电平 接收成功,可以继续发送下一字节 从设备地址匹配、数据写入成功
NACK(非应答) 高电平 接收失败或传输结束 地址无匹配、从设备忙、主设备读操作结束

2.4.1 ACK 产生时序

ACK/NACK 应答时序 SCL SDA D7 D6 D5 D4 D3 D2 D1 D0 ACK SDA=0 发送方在第 9 个 SCL 时钟释放 SDA,接收方拉低 SDA 表示 ACK

2.4.2 NACK 处理策略

  • 地址 NACK: 主设备发送从设备地址后未收到 ACK,应立即产生停止条件,结束传输。
  • 数据 NACK: 主设备作为接收方时,在最后一个数据字节后发送 NACK,通知从设备停止发送。
  • 从设备忙 NACK: 从设备正在处理内部操作(如 EEPROM 写入)时,会回复 NACK,主设备应重试。
驱动调试常见问题: 如果 I²C 通信总是卡在地址阶段收到 NACK,请检查:① 设备树中 reg 属性配置的地址是否正确(7 位地址 vs 8 位地址);② 从设备是否上电并释放了总线;③ SCL 时钟频率是否超出从设备支持范围。

2.5 完整数据传输流程示例

以下是一个完整的 I²C 写操作流程,主设备向地址为 0x50 的 EEPROM 写入一个字节 0xA5。

完整 I²C 写操作流程(地址 0x50,数据 0xA5) 起始条件 S 发送地址 0x50 发送写位 W=0 等待 ACK 发送数据 0xA5 等待 ACK 停止条件 P 时序参数对应关系 • tLOW(SCL 低电平时间):决定每位传输周期,标准模式 ≥ 4.7 µs • tHIGH(SCL 高电平时间):标准模式 ≥ 4.0 µs • tSU;DAT(数据建立时间):SCL 高电平前 SDA 需稳定,标准模式 ≥ 250 ns • tHD;DAT(数据保持时间):SCL 低电平后 SDA 保持时间,标准模式 ≥ 0 ns

2.6 时序参数汇总

以下表格列出了标准模式(100 kHz)和快速模式(400 kHz)下的关键时序参数,驱动开发者在设备树中配置 clock-frequency 时,需确保硬件能够满足这些参数要求。

参数 符号 标准模式(100 kHz) 快速模式(400 kHz) 说明
SCL 时钟频率 fSCL 100 kHz 400 kHz 由主设备产生
SCL 低电平时间 tLOW ≥ 4.7 µs ≥ 1.3 µs 决定时钟占空比
SCL 高电平时间 tHIGH ≥ 4.0 µs ≥ 0.6 µs 决定采样窗口
起始条件保持时间 tHD;STA ≥ 4.0 µs ≥ 0.6 µs SCL 高电平后 SDA 低电平保持
起始条件建立时间 tSU;STA ≥ 4.7 µs ≥ 0.6 µs SCL 高电平前 SDA 低电平建立
数据建立时间 tSU;DAT ≥ 250 ns ≥ 100 ns SCL 高电平前数据稳定
数据保持时间 tHD;DAT ≥ 0 ns ≥ 0 ns SCL 低电平后数据保持
停止条件建立时间 tSU;STO ≥ 4.0 µs ≥ 0.6 µs SCL 高电平前 SDA 高电平建立
总线空闲时间 tBUF ≥ 4.7 µs ≥ 1.3 µs 停止条件到下一个起始条件
设备树配置示例: 在设备树中设置 I²C 控制器时钟频率时,应同时考虑总线上所有从设备的最大支持频率。例如,若从设备仅支持标准模式,则 clock-frequency 应设置为 <100000>。过高的频率会导致从设备无法正确采样,表现为随机 NACK 或数据错误。

2.7 本章小结

  • 起始条件(S) 和 停止条件(P) 是总线状态转换的标志,由 SCL 高电平时 SDA 的跳变定义。
  • 数据有效性 要求 SDA 在 SCL 高电平时保持稳定,仅在 SCL 低电平时允许变化。
  • 字节传输 以 MSB 优先,每个字节 8 位后跟 1 位应答位,共 9 个 SCL 时钟周期。
  • ACK/NACK 机制 是协议可靠性的保障,驱动开发中应正确处理 NACK 重试和错误恢复。
  • 时序参数 是硬件调优的核心,设备树中的 clock-frequency 配置必须满足所有从设备的最小/最大时序要求。