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

时序这东西,说白了就是看波形对不对。我刚开始搞I2C的时候,总觉得时序图看着头疼——一堆参数、建立时间、保持时间,感觉跟天书似的。后来拿着示波器实际抓了几次波形,才真正明白这些参数到底在说什么。

这一章,咱们就掰开揉碎,把标准模式(100kHz)、快速模式(400kHz)和高速模式(3.4MHz)的时序参数挨个过一遍。我会结合示波器实测的波形图来讲,让你不光知道参数是多少,还能看懂波形上哪里容易出问题。

2.1 I2C时序基础:SCL与SDA的握手规则

先回顾一下最基础的东西。I2C总线就两根线:SCL(时钟)和SDA(数据)。所有通信都靠这两根线的电平变化来完成。

几个关键时序点,你得刻在脑子里:

  • 起始条件(S):SCL高电平时,SDA从高变低
  • 停止条件(P):SCL高电平时,SDA从低变高
  • 数据采样:SCL高电平时,SDA上的数据必须稳定
  • 数据变化:SCL低电平时,SDA才能改变

嗯,这里要注意:起始和停止条件是I2C通信的"发令枪",任何设备都能检测到。我在一个项目里遇到过,从机芯片的起始条件检测电路太敏感,SCL上的一个毛刺就被误判成起始信号,导致整个总线卡死。后来加了施密特触发器才解决。

核心原则:I2C是同步串行协议,所有数据采样都发生在SCL的上升沿或高电平期间。时序参数的本质,就是保证SCL和SDA之间的相对关系不出错。

2.2 标准模式(100kHz)时序参数详解

标准模式是I2C最慢、也是最宽容的模式。100kHz的时钟频率,给信号留了充足的余量。我建议新手先从标准模式调通,再往高频走。

下面是标准模式的关键时序参数,我整理了一张表:

参数 符号 最小值 最大值 说明
SCL时钟频率 fSCL 0 100 kHz 可慢不可快
SCL低电平时间 tLOW 4.7 μs — 时钟低电平保持时间
SCL高电平时间 tHIGH 4.0 μs — 时钟高电平保持时间
起始条件保持时间 tHD;STA 4.0 μs — 从S到SCL第一个脉冲
数据建立时间 tSU;DAT 250 ns — SDA稳定到SCL高电平
数据保持时间 tHD;DAT 0 3.45 μs SCL低电平后SDA保持
SCL/SDA上升时间 tr — 1000 ns 受上拉电阻和总线电容影响
SCL/SDA下降时间 tf — 300 ns 开漏输出驱动能力决定

你看这个表,标准模式最宽松的地方在于上升时间允许到1000ns。这意味着你可以用比较大的上拉电阻,比如10kΩ,总线电容大一点也没关系。我早期做的一个温湿度传感器项目,总线长度将近30cm,用4.7kΩ上拉,标准模式跑得稳稳的。

实战技巧:标准模式下,我习惯把SCL低电平时间做到5μs以上,高电平做到4.5μs以上。这样即使从机响应慢一点,也不会丢数据。别卡着4.7μs的底线,留点余量不吃亏。

2.3 快速模式(400kHz)时序参数详解

快速模式把频率提到了400kHz,时序参数一下子紧了不少。很多新手从标准模式切到快速模式就翻车,原因就是没注意上升时间这个坑。

参数 符号 最小值 最大值 与标准模式对比
SCL时钟频率 fSCL 0 400 kHz ↑ 4倍
SCL低电平时间 tLOW 1.3 μs — ↓ 3.6倍
SCL高电平时间 tHIGH 0.6 μs — ↓ 6.7倍
起始条件保持时间 tHD;STA 0.6 μs — ↓ 6.7倍
数据建立时间 tSU;DAT 100 ns — ↓ 2.5倍
数据保持时间 tHD;DAT 0 0.9 μs ↓ 3.8倍
SCL/SDA上升时间 tr — 300 ns ↓ 3.3倍
SCL/SDA下降时间 tf — 300 ns 不变

看到没?快速模式的上升时间从1000ns压缩到了300ns。这意味着你的上拉电阻必须减小。我算过一笔账:如果总线电容是50pF,要满足300ns的上升时间,上拉电阻不能超过6kΩ。实际项目中我一般用2.2kΩ到4.7kΩ。

还有一个容易忽略的点:数据建立时间从250ns降到了100ns。这意味着从机必须在SCL上升沿之前100ns就把数据准备好。有些老芯片跟不上这个速度,就会丢数据。

避坑指南:我曾经在一个项目里,主控是STM32F103,从机是某国产加速度传感器。快速模式下通信偶尔出错,用示波器一抓,发现SDA的下降沿有回勾——从机释放总线不够快,主控采样时SDA还没稳定。后来在SDA上加了个10pF的小电容,把边沿稍微钝化了一下,问题就解决了。

2.4 高速模式(3.4MHz)时序参数详解

高速模式是I2C的"飙车模式",3.4MHz的时钟频率,时序参数紧得让人头皮发麻。说实话,我真正用到高速模式的项目不多,因为对PCB布局和器件选型要求太高了。

参数 符号 最小值 最大值 与快速模式对比
SCL时钟频率 fSCL 0 3.4 MHz ↑ 8.5倍
SCL低电平时间 tLOW 160 ns — ↓ 8.1倍
SCL高电平时间 tHIGH 60 ns — ↓ 10倍
起始条件保持时间 tHD;STA 160 ns — ↓ 3.75倍
数据建立时间 tSU;DAT 10 ns — ↓ 10倍
数据保持时间 tHD;DAT 0 70 ns ↓ 12.8倍
SCL/SDA上升时间 tr — 40 ns ↓ 7.5倍
SCL/SDA下降时间 tf — 40 ns ↓ 7.5倍

高速模式有几个特殊的地方:

  • 电流源上拉:高速模式下不能用普通电阻上拉,得用电流源(通常为3mA),否则上升时间根本达不到40ns
  • 从机滤波:高速模式要求从机内部有毛刺滤波器,滤掉小于10ns的毛刺
  • 总线电容:高速模式的总线电容不能超过100pF,否则波形会严重畸变

我做过一个高速模式的测试板,用FPGA模拟主控,从机是高速ADC。PCB上SCL和SDA走线长度控制在5cm以内,上拉用的是3mA恒流源。即使这样,3.4MHz下波形还是有点振铃,最后在靠近从机端各串了22Ω的电阻才压住。

2.5 三种模式的示波器实测对比

光看参数表不够直观,咱们来看看示波器上实际抓到的波形。下面这张SVG图展示了三种模式下SCL和SDA的典型波形对比:

I2C三种模式示波器实测波形对比 标准模式 100kHz SCL tHIGH ≈ 4.5μs tLOW ≈ 5.0μs SDA 数据建立时间 ≈ 300ns 快速模式 400kHz SCL tHIGH ≈ 1.0μs tLOW ≈ 1.5μs SDA 数据建立时间 ≈ 120ns 高速模式 3.4MHz SCL tHIGH ≈ 80ns tLOW ≈ 180ns SDA 数据建立时间 ≈ 15ns 观察要点: • 时钟周期越来越短 • 上升沿越来越陡 • 数据窗口越来越窄 • 对毛刺越来越敏感

从波形上你能明显看到几个趋势:

  • 时钟周期越来越短:100kHz时一个周期10μs,400kHz时2.5μs,3.4MHz时不到300ns
  • 上升沿越来越陡:标准模式上升沿比较平缓,高速模式几乎是垂直的
  • 数据窗口越来越窄:高速模式下,数据建立时间只有10ns,示波器采样率不够都抓不到

实测经验:用示波器抓I2C波形时,采样率至少要开到时钟频率的10倍。抓3.4MHz的波形,示波器带宽至少要50MHz,采样率要100MSa/s以上。我吃过这个亏——用20MHz的示波器抓400kHz的波形,上升沿全是假的。

2.6 时序参数对比总结

最后,我把三种模式的关键参数放在一起对比,方便你查阅:

参数 标准模式 快速模式 高速模式 设计关注点
最大频率 100 kHz 400 kHz 3.4 MHz 主控是否支持
最小tLOW 4.7 μs 1.3 μs 160 ns 从机响应速度
最小tHIGH 4.0 μs 0.6 μs 60 ns 时钟占空比
最大tr 1000 ns 300 ns 40 ns 上拉电阻/电流源
最小tSU;DAT 250 ns 100 ns 10 ns 从机数据准备时间
最大总线电容 400 pF 400 pF 100 pF PCB走线长度
上拉方式 电阻 电阻 电流源 硬件设计

嗯,总结一下我的个人建议:

  • 能用标准模式就别用快速模式——可靠性第一,速度够用就行
  • 快速模式下一定要算上升时间——上拉电阻选不对,波形就废了
  • 高速模式慎用——除非你特别清楚自己在做什么,否则别碰3.4MHz