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。换小一点的上拉电阻,频率才提上去。
3.3 数据建立时间 tSU;DAT
这个参数的意思是:在SCL上升沿(数据被采样)之前,SDA上的数据必须提前稳定下来。标准模式要求250ns,快速模式要求100ns。
为什么会这样?因为从机芯片内部需要一小段时间来锁存SDA上的电平。如果数据在时钟沿来临时还在跳变,采到的值可能是错的。
实际调试中,我建议这样看:
- 用示波器同时抓SCL和SDA
- 把光标放在SCL上升沿位置
- 往回看SDA最后一次跳变,测量两者之间的时间差
- 这个差值必须大于tSU;DAT
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了——从机可能根本识别不到。
3.6 时序参数关系图
下面这张图把SCL一个完整周期内的时序参数标了出来。调试时对着波形看,每个参数的位置一目了然。
3.7 调试时的实测方法
纸上谈兵没用,咱们说说怎么用示波器实际测这些参数。
我的标准操作流程:
- 抓SCL和SDA——通道1接SCL,通道2接SDA,地线夹子尽量靠近探头尖
- 触发设置——用SCL下降沿触发,时基调到2μs/div(快速模式)或10μs/div(标准模式)
- 测量频率——直接用示波器的频率测量功能读SCL的实际频率
- 测量上升时间——用光标量SCL从10%到90%的上升沿时间
- 测量建立时间——把光标放在SCL上升沿,往回找SDA最后一次跳变,读时间差