3. I2C总线时序分析

I2C(Inter-Integrated Circuit)总线是一种同步、多主从、串行通信总线,其物理层仅由两条线构成:串行数据线(SDA)和串行时钟线(SCL)。I2C 总线定义了三种工作模式:标准模式(Standard-mode, Sm)、快速模式(Fast-mode, Fm) 和 高速模式(High-speed mode, Hs-mode)。不同模式下的时序参数差异显著,直接影响从设备选型、上拉电阻计算以及信号完整性设计。

3.1 I2C 总线基本时序单元

在分析具体模式之前,需要理解 I2C 通信的基本时序单元。一个完整的 I2C 传输由起始条件、数据字节传输、应答位和停止条件组成。下图展示了 I2C 总线的基本时序波形。

I2C 总线基本时序波形图 SCL SDA S 起始 P 停止 MSB D6-D1 LSB ACK 说明:SDA 在 SCL 高电平时被采样,数据在 SCL 低电平时变化。起始条件:SCL 高电平时 SDA 下降沿。停止条件:SCL 高电平时 SDA 上升沿。

关键时序定义如下:

  • 起始条件(S):SCL 为高电平时,SDA 从高电平切换到低电平。
  • 停止条件(P):SCL 为高电平时,SDA 从低电平切换到高电平。
  • 数据有效性:在 SCL 时钟高电平期间,SDA 上的数据必须保持稳定;数据变化只能在 SCL 低电平时进行。
  • 应答位(ACK):每传输 8 位数据后,接收方在第 9 个时钟周期将 SDA 拉低,表示应答。

3.2 标准模式(Sm)时序参数

标准模式是 I2C 总线最基本的操作模式,时钟频率为 100 kHz。该模式兼容性最广,几乎所有 I2C 设备都支持。下表列出了标准模式下的核心时序参数。

参数符号 参数名称 最小值 最大值 单位
fSCL SCL 时钟频率 0 100 kHz
tHD;STA 起始条件保持时间 4.0 - µs
tLOW SCL 低电平时间 4.7 - µs
tHIGH SCL 高电平时间 4.0 - µs
tSU;STA 重复起始条件建立时间 4.7 - µs
tHD;DAT 数据保持时间 0 3.45 µs
tSU;DAT 数据建立时间 250 - ns
tr SDA/SCL 上升时间 - 1000 ns
tf SDA/SCL 下降时间 - 300 ns
tSU;STO 停止条件建立时间 4.0 - µs
tBUF 总线空闲时间(停止到起始) 4.7 - µs
设计要点: 标准模式下,上拉电阻的典型值范围为 4.7 kΩ ~ 10 kΩ。总线电容(包括引脚、走线和寄生电容)应控制在 400 pF 以内,以确保上升时间满足 tr ≤ 1000 ns 的要求。

3.3 快速模式(Fm)时序参数

快速模式将时钟频率提升至 400 kHz,是嵌入式系统中应用最广泛的 I2C 模式。与标准模式相比,快速模式对时序裕量要求更严格,尤其是上升时间和建立时间。

参数符号 参数名称 最小值 最大值 单位
fSCL SCL 时钟频率 0 400 kHz
tHD;STA 起始条件保持时间 0.6 - µs
tLOW SCL 低电平时间 1.3 - µs
tHIGH SCL 高电平时间 0.6 - µs
tSU;STA 重复起始条件建立时间 0.6 - µs
tHD;DAT 数据保持时间 0 0.9 µs
tSU;DAT 数据建立时间 100 - ns
tr SDA/SCL 上升时间 - 300 ns
tf SDA/SCL 下降时间 - 300 ns
tSU;STO 停止条件建立时间 0.6 - µs
tBUF 总线空闲时间 1.3 - µs
注意: 快速模式下,上升时间 tr 的最大值从标准模式的 1000 ns 缩短至 300 ns。这意味着总线电容必须显著降低(通常 ≤ 200 pF),上拉电阻需要减小至 1.5 kΩ ~ 4.7 kΩ 范围。如果使用长走线或多负载,建议使用 快速模式 Plus(Fm+) 驱动能力更强的缓冲器。

3.4 高速模式(Hs-mode)时序参数

高速模式是 I2C 总线规范中定义的最高性能模式,时钟频率可达 3.4 MHz。高速模式引入了特殊的“主从握手”机制:在高速传输开始前,主设备会发送一个“主代码”(00001XXX)来唤醒支持高速模式的从设备,随后切换至高速模式下的开漏输出,并使用电流源上拉来加速信号边沿。

参数符号 参数名称 最小值 最大值 单位
fSCL SCL 时钟频率 0 3.4 MHz
tHD;STA 起始条件保持时间 160 - ns
tLOW SCL 低电平时间 160 - ns
tHIGH SCL 高电平时间 60 - ns
tSU;STA 重复起始条件建立时间 160 - ns
tHD;DAT 数据保持时间 0 70 ns
tSU;DAT 数据建立时间 10 - ns
tr SDA/SCL 上升时间 - 40 ns
tf SDA/SCL 下降时间 - 40 ns
tSU;STO 停止条件建立时间 160 - ns
tBUF 总线空闲时间 160 - ns
I2C 三种模式时序参数对比图 时钟频率 (kHz) 100 标准模式 400 快速模式 3400 高速模式 上升时间 tr (ns) 1000 300 40 Sm Fm Hs 高速模式关键特性 1. 主设备必须先发送主代码(00001XXX)以唤醒高速从设备。 2. 高速传输阶段使用电流源上拉(典型值 2 mA)替代电阻上拉,以加速上升沿。 3. 高速模式下 SCL 高电平时间 tHIGH 仅需 60 ns,对信号完整性要求极高。 4. 总线电容必须 ≤ 100 pF,PCB 走线长度通常限制在 10 cm 以内。 5. 并非所有 I2C 设备都支持高速模式,需要查阅器件数据手册确认。

3.5 三种模式时序参数汇总对比

下表将标准模式、快速模式和高速模式的核心时序参数进行横向对比,便于开发者快速评估不同模式下的设计约束。

参数 标准模式 (Sm) 快速模式 (Fm) 高速模式 (Hs) 单位
最大时钟频率 100 400 3400 kHz
SCL 低电平时间 (tLOW) 4.7 1.3 0.16 µs
SCL 高电平时间 (tHIGH) 4.0 0.6 0.06 µs
数据建立时间 (tSU;DAT) 250 100 10 ns
上升时间 (tr) 1000 300 40 ns
下降时间 (tf) 300 300 40 ns
最大总线电容 (Cb) 400 200 100 pF
典型上拉电阻范围 4.7k ~ 10k 1.5k ~ 4.7k 电流源上拉 Ω

3.6 时序参数对驱动开发的影响

在嵌入式 Linux 的 I2C 驱动框架中,时序参数直接影响以下方面:

  1. 时钟频率配置:I2C 控制器驱动通过 struct i2c_timings 结构体配置时钟频率。内核会根据设备树中的 clock-frequency 属性自动选择对应的时序参数。
  2. 超时计算:I2C 传输超时时间通常基于 tLOW 和 tHIGH 计算。高速模式下,超时值需要相应缩小。
  3. 信号完整性:上升时间 tr 和下降时间 tf 决定了总线是否需要添加串联电阻或使用施密特触发器输入。
  4. 从设备兼容性:如果总线上混用不同模式的设备,主设备必须以最慢设备的时序参数进行通信。
I2C 时序参数对驱动开发的影响链路 设备树配置 clock-frequency 时序参数选择 Sm/Fm/Hs 控制器寄存器 SCL 分频配置 传输超时 adap->timeout 驱动开发中的时序参数处理流程 1. 从设备树读取 clock-frequency,默认值为 100000 (100 kHz)。 2. 根据频率选择对应的时序参数集,调用 i2c_parse_timing() 解析。 3. 配置 I2C 控制器的 SCL 分频寄存器,确保 tLOW 和 tHIGH 满足规范。 4. 设置传输超时时间,通常为 (9 * tLOW * 8) 的倍数,确保最坏情况下的应答等待。

3.7 实际波形测量与调试建议

在嵌入式开发中,使用示波器或逻辑分析仪测量 I2C 总线波形是调试驱动问题的关键手段。以下是基于实际经验的调试建议:

  • 检查起始和停止条件:确保 SDA 在 SCL 高电平时发生跳变。如果起始条件不完整,从设备可能无法同步。
  • 测量 SCL 频率:使用示波器的频率测量功能,确认实际 SCL 频率与配置值偏差在 ±10% 以内。
  • 验证数据建立时间:在 SCL 上升沿之前,SDA 必须已经稳定。如果 tSU;DAT 不足,从设备可能采样到错误数据。
  • 检查应答位:第 9 个时钟周期后,SDA 应被从设备拉低。如果 SDA 保持高电平,表示 NACK(无应答),常见原因包括地址错误、从设备忙或总线冲突。
  • 观察上升沿斜率:如果上升时间 tr 过长,说明上拉电阻过大或总线电容过高。对于快速模式,建议使用 2.2 kΩ 上拉电阻并缩短走线。
调试工具推荐: 在 Linux 环境下,可以使用 i2c-tools 工具包中的 i2cdetect 扫描总线设备,使用 i2cget 和 i2cset 进行寄存器读写测试。对于时序分析,建议使用 Saleae Logic 逻辑分析仪或 Rigol DS1054Z 示波器,配合 I2C 解码功能快速定位问题。