2. I2C时序分析:标准模式、快速模式与高速模式

I2C的时序,说白了就是SCL时钟和SDA数据线之间怎么配合。很多工程师调不通I2C,问题往往就出在这里——不是速率配错了,就是上升沿时间超了。我个人习惯,拿到一个I2C器件,第一件事就是翻数据手册的时序表。

先看一张总览图,把三种模式的核心参数串起来。

I2C 三种模式时序参数对比 标准模式 (100kHz) f_SCL = 100 kHz t_f = 300 ns max t_HD:DAT = 0 ns min 快速模式 (400kHz) f_SCL = 400 kHz t_f = 300 ns max t_HD:DAT = 0 ns min 高速模式 (3.4MHz) f_SCL = 3.4 MHz t_f = 120 ns max t_HD:DAT = 0 ns min 关键时序参数对比表 参数 标准模式 快速模式 高速模式 t_LOW 4.7 μs 1.3 μs 0.16 μs t_HIGH 4.0 μs 0.6 μs 0.06 μs t_r / t_f 1000 ns 300 ns 120 ns t_HD:DAT 0 ns 0 ns 0 ns

2.1 标准模式(100kHz)—— 最稳妥的选择

标准模式是I2C最基础的速率。SCL时钟频率100kHz,一个位周期10μs。这个模式下,几乎所有I2C器件都能正常工作。

关键参数:

  • t_LOW:SCL低电平时间,最小4.7μs
  • t_HIGH:SCL高电平时间,最小4.0μs
  • t_r / t_f:上升/下降时间,最大1000ns
  • t_HD:DAT:数据保持时间,最小0ns(实际上就是0)
我的经验:调试初期,我建议先用标准模式。为什么?因为100kHz下时序裕量最大,示波器一看就清楚。我曾经在快速模式下死活调不通一个温湿度传感器,切回标准模式后,波形一抓就发现问题——上拉电阻选大了,上升沿太慢。

2.2 快速模式(400kHz)—— 最常用的速率

快速模式把频率提到了400kHz,位周期2.5μs。现在大部分MCU和传感器都支持这个速率。但要注意,速率翻倍意味着时序裕量减半。

关键变化:

  • t_LOW:降到1.3μs(标准模式的1/3.6)
  • t_HIGH:降到0.6μs(标准模式的1/6.7)
  • t_r / t_f:最大300ns(比标准模式严苛3倍多)
避坑指南:我曾经在一个项目里,PCB走线长了10cm,400kHz下SDA的上升沿直接从200ns拖到了450ns。从机直接不响应了。后来把上拉电阻从4.7kΩ换成2.2kΩ,问题解决。快速模式下,PCB寄生电容的影响会被放大,你想想看。

2.3 高速模式(3.4MHz)—— 高手的领域

高速模式是I2C的极限速率,3.4MHz,位周期不到300ns。这个模式不是所有器件都支持,而且有特殊要求。

高速模式的特点:

  • 需要电流源上拉,不能用普通电阻
  • 从机必须支持高速模式(Hs-mode)
  • 主机发送地址时用快速模式,从机应答后才切到高速模式
  • t_r / t_f:最大120ns,对PCB布局要求极高

核心差异:高速模式下,SCL高电平时间t_HIGH只有60ns。这意味着你的MCU的GPIO翻转速度、中断响应延迟、DMA触发时机,都必须精确到纳秒级。我见过有人用普通GPIO模拟高速模式,结果波形惨不忍睹。

2.4 三种模式的时序参数对比

参数 标准模式 (100kHz) 快速模式 (400kHz) 高速模式 (3.4MHz)
SCL频率 100 kHz 400 kHz 3.4 MHz
t_LOW (min) 4.7 μs 1.3 μs 0.16 μs
t_HIGH (min) 4.0 μs 0.6 μs 0.06 μs
t_r / t_f (max) 1000 ns 300 ns 120 ns
t_HD:DAT (min) 0 ns 0 ns 0 ns
t_SU:DAT (min) 250 ns 100 ns 10 ns
上拉方式 电阻上拉 电阻上拉 电流源上拉

2.5 实际调试中的时序检查方法

说完了参数,聊聊怎么查。我调试I2C时序,一般按这个步骤来:

  1. 抓波形:用示波器同时抓SCL和SDA,触发在SCL下降沿
  2. 测频率:看SCL的实际频率,是不是和目标一致
  3. 测上升沿:看SDA和SCL的上升时间,有没有超过规格
  4. 测建立/保持时间:重点看数据变化是否在SCL低电平期间完成
  5. 看毛刺:有没有因为走线串扰导致的毛刺
小技巧:我习惯把示波器的时基调到每个位周期占屏幕的1/4到1/3。比如400kHz,位周期2.5μs,时基设500ns/div,这样一眼就能看出时序是否合规。

2.6 上拉电阻的选择与影响

上拉电阻直接影响上升时间。公式很简单:

t_r ≈ 2.2 × R_p × C_b

其中R_p是上拉电阻,C_b是总线电容(包括PCB走线、器件引脚电容)。

举个例子:

  • 标准模式:C_b = 100pF,要求t_r ≤ 1000ns → R_p ≤ 4.5kΩ
  • 快速模式:C_b = 100pF,要求t_r ≤ 300ns → R_p ≤ 1.36kΩ
  • 高速模式:C_b = 50pF,要求t_r ≤ 120ns → 必须用电流源
我曾经踩过的坑:一个项目用了10cm的FPC排线连接I2C从机,总线电容直接飙到200pF。快速模式下,4.7kΩ上拉电阻的上升沿超过了500ns。从机偶尔能响应,偶尔不行。后来换成2.2kΩ,问题消失。记住,上拉电阻不是随便选的,要算。

2.7 不同模式下的DMA传输考量

DMA传输和I2C时序的关系,很多人忽略了。我提几个要点:

  • 标准模式:DMA触发间隔10μs,CPU几乎无压力
  • 快速模式:DMA触发间隔2.5μs,注意DMA传输完成中断不能太慢
  • 高速模式:DMA触发间隔不到300ns,普通MCU的DMA可能跟不上

为什么会这样?因为DMA每次传输都需要响应I2C的数据请求。如果DMA响应延迟超过t_SU:DAT,数据就丢了。我建议在快速模式下,DMA优先级要设高,中断服务程序要精简。

一句话总结:标准模式求稳,快速模式求快,高速模式求极限。选哪个模式,取决于你的器件支持、PCB质量和调试能力。我个人建议,除非必要,否则别碰高速模式——那玩意是给专业玩家准备的。