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的典型波形对比:
从波形上你能明显看到几个趋势:
- 时钟周期越来越短: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