3. I2C时序参数详解:标准模式与快速模式

做I2C驱动,说白了就是在跟两根线上的时间赛跑。SCL和SDA上的每一个跳变沿,都有严格的时序要求。我见过不少工程师,代码逻辑完全正确,但LCD就是不出字,最后抓波形一看——建立时间差了那么几十纳秒。

这一节,我们把I2C的时序参数掰开揉碎。标准模式100kHz和快速模式400kHz,到底差在哪?

3.1 两种模式的核心差异

先看一张总表,把关键参数拉出来对比。我个人习惯把这几个数字贴在示波器旁边,调试时一眼就能对上。

参数 符号 标准模式 (100kHz) 快速模式 (400kHz) 单位
SCL时钟频率 fSCL 0 ~ 100 0 ~ 400 kHz
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
SCL/SDA上升时间 tr 1000 300 ns
SCL/SDA下降时间 tf 300 300 ns

嗯,这里要注意:快速模式的上升时间要求比标准模式严了三倍多。你想想看,400kHz的周期才2.5μs,如果上升沿拖到300ns以上,留给数据采样的窗口就被压缩得很厉害。

3.2 SCL时钟频率——节奏的基准

SCL是I2C总线的心跳。标准模式100kHz,快速模式400kHz。但这不是说你把定时器配成100kHz就完事了。

实际SCL频率取决于两个因素:

  • 主控的时钟分频配置——MCU内部定时器或I2C外设的预分频器
  • 总线上拉电阻和负载电容——RC常数直接影响上升时间,进而拉低实际频率

我在项目中遇到过一件事:用STM32的硬件I2C配了400kHz,示波器一抓只有320kHz。查了半天,发现是PCB走线过长,总线电容超过了40pF。换小一点的上拉电阻,频率才提上去。

调试技巧: 不要只看代码里配的寄存器值。用示波器量SCL的实际周期,算出真实频率。如果低于目标值20%以上,检查上拉电阻和总线电容。

3.3 数据建立时间 tSU;DAT

这个参数的意思是:在SCL上升沿(数据被采样)之前,SDA上的数据必须提前稳定下来。标准模式要求250ns,快速模式要求100ns。

为什么会这样?因为从机芯片内部需要一小段时间来锁存SDA上的电平。如果数据在时钟沿来临时还在跳变,采到的值可能是错的。

实际调试中,我建议这样看:

  1. 用示波器同时抓SCL和SDA
  2. 把光标放在SCL上升沿位置
  3. 往回看SDA最后一次跳变,测量两者之间的时间差
  4. 这个差值必须大于tSU;DAT
避坑指南: 我曾经调试一块LCD模组,写寄存器地址时偶尔失败。抓波形发现SDA在SCL上升沿前只稳定了80ns,而LCD要求的建立时间是100ns。差这20ns,数据就丢了。后来在I2C时序里加了一个小延迟,问题解决。

3.4 数据保持时间 tHD;DAT

保持时间与建立时间相反——它要求SCL上升沿之后,SDA上的数据还要再维持一段时间。标准模式是0~3.45μs,快速模式是0~0.9μs。

注意这里的"0":理论上保持时间可以为0,也就是说SCL上升沿一过,SDA可以立刻变化。但上限是有的,你不能把数据保持太久,否则会干扰下一个字节的传输。

我个人习惯把保持时间控制在200~500ns之间。太短了怕从机来不及锁存,太长了又怕影响后续时序。这个区间在两种模式下都安全。

3.5 上升时间与下降时间

上升时间tr和下降时间tf,反映的是信号边沿的陡峭程度。标准模式允许上升时间最长1μs,快速模式只有300ns。

这两个参数主要受三个因素影响:

  • 上拉电阻值——电阻越大,上升越慢
  • 总线电容——走线越长、分支越多,电容越大
  • 驱动能力——主控IO口的输出电流

你想想看,如果上升时间太长,SCL的高电平宽度tHIGH就会被压缩。本来快速模式要求tHIGH至少600ns,如果上升沿占了300ns,有效高电平就只剩300ns了——从机可能根本识别不到。

警告: 快速模式下,上拉电阻建议选2.2kΩ~4.7kΩ。如果用了10kΩ,上升时间很容易超标。标准模式可以用4.7kΩ~10kΩ。具体选多大,用示波器实测上升时间再定。

3.6 时序参数关系图

下面这张图把SCL一个完整周期内的时序参数标了出来。调试时对着波形看,每个参数的位置一目了然。

I2C时序参数关系图(一个SCL周期) SCL SDA tLOW tHIGH tSU;DAT tHD;DAT tr tf SCL上升沿采样SDA数据,建立时间在上升沿之前,保持时间在上升沿之后

3.7 调试时的实测方法

纸上谈兵没用,咱们说说怎么用示波器实际测这些参数。

我的标准操作流程:

  1. 抓SCL和SDA——通道1接SCL,通道2接SDA,地线夹子尽量靠近探头尖
  2. 触发设置——用SCL下降沿触发,时基调到2μs/div(快速模式)或10μs/div(标准模式)
  3. 测量频率——直接用示波器的频率测量功能读SCL的实际频率
  4. 测量上升时间——用光标量SCL从10%到90%的上升沿时间
  5. 测量建立时间——把光标放在SCL上升沿,往回找SDA最后一次跳变,读时间差
小技巧: 很多示波器有"自动测量"功能,可以直接显示上升时间、下降时间、频率等参数。但建立时间和保持时间,我建议还是用手动光标量——自动测量有时会把噪声跳变也算进去。