2. I2C 时序核心:起始条件、停止条件、数据有效性、字节传输格式(MSB First)
I2C 总线协议的精髓在于其严格的时序规则。无论是主机还是从机,都必须遵循统一的信号约定才能完成一次成功的通信。本章将深入剖析 I2C 时序的四大核心要素:起始条件、停止条件、数据有效性以及字节传输格式(MSB First)。理解这些基础波形是后续进行总线异常分析和驱动调试的基石。
2.1 起始条件(S)与停止条件(P)
I2C 总线在空闲状态时,SCL(时钟线)和 SDA(数据线)均为高电平(由上拉电阻拉高)。总线上任何一次通信的开始和结束,都由主机通过特定的信号跳变来声明。
关键定义:
- 起始条件(S): 在 SCL 为高电平时,SDA 从高电平切换到低电平。
- 停止条件(P): 在 SCL 为高电平时,SDA 从低电平切换到高电平。
起始和停止条件均由主机产生。一旦总线上检测到起始条件,即认为总线被占用;检测到停止条件,则认为总线恢复空闲。
调试要点: 在示波器上观察波形时,起始条件表现为 SDA 在 SCL 高电平期间的“提前”下降。如果 SDA 的下降沿发生在 SCL 低电平期间,则不是有效的起始条件,总线可能处于异常状态。
2.2 数据有效性:SCL 高电平采样,低电平变化
I2C 协议规定,除了起始和停止条件外,SDA 线上的数据必须在 SCL 为高电平时保持稳定,只有在 SCL 为低电平时才允许改变。这是保证数据可靠传输的核心规则。
- 数据采样: 接收方在 SCL 的上升沿或高电平期间对 SDA 进行采样。
- 数据变化: 发送方必须在 SCL 为低电平时更新 SDA 上的数据位。
- 例外: 起始条件(S)和停止条件(P)是唯一允许在 SCL 高电平时改变 SDA 状态的信号。
常见异常: 如果示波器上观察到 SDA 在 SCL 高电平期间发生跳变(且不是起始/停止条件),说明发送方违反了数据有效性规则。这通常是由于从机响应速度过慢、总线负载过大导致信号边沿变缓,或者软件中 SDA 切换时序错误引起的。
2.3 字节传输格式:MSB First 与应答位(ACK/NACK)
I2C 总线上的数据以字节(8 位)为单位进行传输,并且严格遵循高位在前(MSB First)的顺序。每个字节传输完成后,接收方必须在第 9 个 SCL 时钟周期内产生一个应答位(ACK)或非应答位(NACK)。
| 位序号 | 信号 | 说明 |
|---|---|---|
| 1 - 8 | D7 (MSB) ... D0 (LSB) | 数据字节,高位先发送。例如发送 0x2A (0010 1010),顺序为 0→0→1→0→1→0→1→0。 |
| 9 | ACK / NACK | 接收方在第 9 个 SCL 周期将 SDA 拉低(ACK)或保持高(NACK)。 |
应答位规则:
- ACK(应答): 接收方在第 9 个时钟周期将 SDA 拉低,表示“已收到,请继续发送下一个字节”。
- NACK(非应答): 接收方在第 9 个时钟周期保持 SDA 为高,表示“无法接收更多数据”或“未找到设备”。主机收到 NACK 后通常会发送停止条件终止传输。
2.4 完整数据帧示例:主机写入从机寄存器
下面以一个典型的 I2C 写操作序列为例,展示起始条件、设备地址、寄存器地址、数据字节和停止条件如何组合成一个完整的数据帧。
// 假设:从机地址 0x3C (7位),写操作,寄存器地址 0x10,写入数据 0xAB
// 帧序列:
// S + 0x3C + W(0) + ACK + 0x10 + ACK + 0xAB + ACK + P
// 对应的位级传输(MSB First):
// 起始条件 (S)
// 地址字节: 0 1 1 1 1 0 0 0 (0x3C)
// 写位: 0
// 应答位: ACK (从机拉低SDA)
// 寄存器地址: 0 0 0 1 0 0 0 0 (0x10)
// 应答位: ACK
// 数据字节: 1 0 1 0 1 0 1 1 (0xAB)
// 应答位: ACK
// 停止条件 (P)
调试技巧: 使用逻辑分析仪抓取 I2C 波形时,可以设置触发条件为“起始条件”或“特定设备地址”。观察数据时,注意检查每个字节后的 ACK/NACK 位。如果某个字节后出现 NACK,说明通信在此处中断,需要检查地址是否正确、从机是否在线或从机是否处于忙状态。
2.5 时序参数速查表
下表汇总了标准模式(100 kHz)和快速模式(400 kHz)下 I2C 总线的主要时序参数,供调试时参考。
| 参数 | 符号 | 标准模式 (100 kHz) | 快速模式 (400 kHz) | 单位 |
|---|---|---|---|---|
| SCL 时钟频率 | fSCL | 0 - 100 | 0 - 400 | kHz |
| 起始条件保持时间 | tHD;STA | 4.0 | 0.6 | µs |
| SCL 低电平时间 | tLOW | 4.7 | 1.3 | µs |
| SCL 高电平时间 | tHIGH | 4.0 | 0.6 | µs |
| 数据建立时间 | tSU;DAT | 250 | 100 | ns |
| 数据保持时间 | tHD;DAT | 0 - 3.45 | 0 - 0.9 | µs |
| 停止条件建立时间 | tSU;STO | 4.0 | 0.6 | µs |
| 总线空闲时间 | tBUF | 4.7 | 1.3 | µs |
异常排查提示: 如果示波器测量到的 tLOW 或 tHIGH 明显小于规格要求,说明时钟频率可能过高或总线电容过大导致信号畸变。如果 tSU;DAT 不足,可能导致接收方采样到错误的数据位。这些参数是判断总线时序是否合规的重要依据。