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。
2.2 数据有效性
I²C 协议对数据线上的采样时刻有严格规定,这是保证数据完整性的核心规则。
- 数据稳定规则: 在 SCL 时钟的高电平期间,SDA 上的数据必须保持稳定。
- 数据变化规则: 只有在 SCL 为低电平时,SDA 上的数据才允许发生变化。
- 例外: 起始条件和停止条件属于例外情况,此时 SCL 为高电平,但 SDA 发生跳变。
2.3 字节传输格式
I²C 总线上的数据以字节(8 位)为单位进行传输,每个字节后必须跟随一个应答位(ACK/NACK)。传输时高位(MSB)在前,低位(LSB)在后。
2.3.1 单字节写操作时序
2.3.2 字节传输流程
- 主设备产生起始条件(S),总线进入忙状态。
- 主设备发送从设备地址(7 位或 10 位),高位在前。
- 主设备发送读写位(R/W):0 表示写操作,1 表示读操作。
- 从设备在第 9 个 SCL 时钟周期发送应答位(ACK),拉低 SDA 表示确认。
- 主设备发送/接收数据字节,每个字节 8 位,高位在前。
- 接收方在第 9 个时钟周期发送应答位:主设备发送数据时,从设备应答;从设备发送数据时,主设备应答。
- 主设备产生停止条件(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 产生时序
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。
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 配置必须满足所有从设备的最小/最大时序要求。