2. I2C 时序核心:起始条件、停止条件、数据有效性、字节传输格式(MSB First)

I2C 总线协议的精髓在于其严格的时序规则。无论是主机还是从机,都必须遵循统一的信号约定才能完成一次成功的通信。本章将深入剖析 I2C 时序的四大核心要素:起始条件、停止条件、数据有效性以及字节传输格式(MSB First)。理解这些基础波形是后续进行总线异常分析和驱动调试的基石。

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

I2C 总线在空闲状态时,SCL(时钟线)和 SDA(数据线)均为高电平(由上拉电阻拉高)。总线上任何一次通信的开始和结束,都由主机通过特定的信号跳变来声明。

关键定义:
  • 起始条件(S): 在 SCL 为高电平时,SDA 从高电平切换到低电平。
  • 停止条件(P): 在 SCL 为高电平时,SDA 从低电平切换到高电平。

起始和停止条件均由主机产生。一旦总线上检测到起始条件,即认为总线被占用;检测到停止条件,则认为总线恢复空闲。

I2C 起始条件与停止条件波形 起始条件 (S) 与停止条件 (P) 波形 SCL (时钟线) SDA (数据线) S SCL高时 SDA下降沿 P SCL高时 SDA上升沿 空闲: SCL=1, SDA=1 空闲: SCL=1, SDA=1
调试要点: 在示波器上观察波形时,起始条件表现为 SDA 在 SCL 高电平期间的“提前”下降。如果 SDA 的下降沿发生在 SCL 低电平期间,则不是有效的起始条件,总线可能处于异常状态。

2.2 数据有效性:SCL 高电平采样,低电平变化

I2C 协议规定,除了起始和停止条件外,SDA 线上的数据必须在 SCL 为高电平时保持稳定,只有在 SCL 为低电平时才允许改变。这是保证数据可靠传输的核心规则。

  • 数据采样: 接收方在 SCL 的上升沿或高电平期间对 SDA 进行采样。
  • 数据变化: 发送方必须在 SCL 为低电平时更新 SDA 上的数据位。
  • 例外: 起始条件(S)和停止条件(P)是唯一允许在 SCL 高电平时改变 SDA 状态的信号。
I2C 数据有效性时序 数据有效性:SCL 高电平采样,低电平变化 SCL SDA 数据位稳定 (SCL高时采样) 数据位变化 (SCL低时允许) 数据位稳定 (SCL高时采样) 数据位变化 (SCL低时允许)
常见异常: 如果示波器上观察到 SDA 在 SCL 高电平期间发生跳变(且不是起始/停止条件),说明发送方违反了数据有效性规则。这通常是由于从机响应速度过慢、总线负载过大导致信号边沿变缓,或者软件中 SDA 切换时序错误引起的。

2.3 字节传输格式:MSB First 与应答位(ACK/NACK)

I2C 总线上的数据以字节(8 位)为单位进行传输,并且严格遵循高位在前(MSB First)的顺序。每个字节传输完成后,接收方必须在第 9 个 SCL 时钟周期内产生一个应答位(ACK)或非应答位(NACK)。

I2C 字节传输帧结构
位序号 信号 说明
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 后通常会发送停止条件终止传输。
I2C 字节传输与应答位时序 字节传输格式:MSB First + 应答位 SCL SDA D7 D6 D5 D4 D3 D2 D1 D0 (MSB) (LSB) ACK (SDA被拉低) 第9个SCL

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 总线的主要时序参数,供调试时参考。

I2C 总线时序参数(标准模式 vs 快速模式)
参数 符号 标准模式 (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 不足,可能导致接收方采样到错误的数据位。这些参数是判断总线时序是否合规的重要依据。