4. I2C传输模式:标准模式、快速模式、高速模式与超快速模式对比

I2C总线从诞生到现在,速度一直在往上提。我最早接触I2C时,用的还是100kHz的标准模式,那时候觉得够用了。后来项目里挂的传感器越来越多,数据量越来越大,100kHz就开始捉襟见肘了。

说白了,这四种模式就是I2C在不同时期的“档位”。你选哪个档位,取决于你的从设备支不支持,以及你的PCB走线能不能扛得住。咱们一个一个来看。

4.1 标准模式(Standard-mode,Sm)

这是I2C最原始的模式,时钟频率上限是100kHz。Philips在80年代推出I2C时就是这个速度。嗯,放在今天看确实慢,但它的兼容性最好——几乎所有I2C设备都支持标准模式。

我在一个老项目的维护中遇到过这种情况:主控MCU换了新款,默认把I2C配成了快速模式,结果板子上一个老掉牙的EEPROM死活不响应。查了半天手册才发现,那颗EEPROM只支持标准模式。最后只能降速跑。

我的建议:做兼容性设计时,先把总线初始化成标准模式,探测到所有从设备后再切换到高速模式。这样能避免一上来就“握手失败”。

4.2 快速模式(Fast-mode,Fm)

快速模式把时钟频率提到了400kHz。这是目前最常用的模式,没有之一。你想想看,现在市面上90%的I2C传感器、ADC、DAC都支持400kHz。

快速模式和标准模式在电气特性上基本一致,只是时序要求更严格了。上升时间和下降时间都要控制得更短。我个人的习惯是,只要从设备支持,我就用400kHz。除非总线长度超过20cm,或者线上挂的设备超过8个,我才会考虑降速。

参数 标准模式(Sm) 快速模式(Fm)
最高时钟频率 100 kHz 400 kHz
SCL低电平时间(min) 4.7 µs 1.3 µs
SCL高电平时间(min) 4.0 µs 0.6 µs
上升时间(max) 1000 ns 300 ns
下降时间(max) 300 ns 300 ns
上拉电阻典型值 4.7 kΩ 1.5~2.2 kΩ
注意:快速模式下上拉电阻不能太大。我曾经在一个项目里用了10kΩ的上拉,结果400kHz时SCL的上升沿变成了梯形,从设备采样出错。换成2.2kΩ后问题解决。

4.3 高速模式(High-speed mode,Hs-mode)

高速模式把频率推到了3.4MHz。这个模式有点特殊——它需要一个“握手桥接”的过程。

具体来说,主设备要先在400kHz下发送一个特殊的“主设备码”(00001XXX),然后才能切换到3.4MHz。从设备收到这个码后,会打开自己的高速模式接收器。这个过程叫“Hs-mode handshake”。

我参与过一个FPGA与高速ADC通信的项目,用的就是3.4MHz的I2C。说实话,这个速度下PCB走线已经不能随便画了。SCL和SDA必须等长,而且要走内层,避免外部干扰。

关键点:高速模式下,SCL和SDA的驱动方式也变了。标准/快速模式用的是开漏输出加外部上拉,而高速模式在SCL上增加了一个“电流源上拉”机制,用来加速上升沿。这个电流源只在高速传输阶段激活。

4.4 超快速模式(Ultra Fast-mode,UFm)

超快速模式是I2C家族里最年轻的成员,频率达到了5MHz。但它有一个巨大的变化——它变成了单线模式,而且不再使用开漏输出。

说白了,UFm把SDA去掉了,只用SCL和一条单向数据线。数据线是推挽输出,不再需要上拉电阻。这意味着UFm只能用于主设备到从设备的单向传输,不能用于双向通信。

我个人觉得UFm的应用场景比较窄。它适合那些只需要写数据、不需要读数据的场景,比如配置寄存器、更新固件等。但如果你需要从设备回传数据,UFm就无能为力了。

特性 标准/快速/高速 超快速(UFm)
最高频率 100 kHz / 400 kHz / 3.4 MHz 5 MHz
数据线数量 2(SCL + SDA) 1(仅数据线)
输出类型 开漏 推挽
是否需要上拉电阻 是 否
双向通信 支持 不支持
多主设备支持 支持 不支持

4.5 四种模式的选型建议

选哪种模式,其实就三个问题:

  1. 从设备支持哪种模式?——查手册,这是硬约束。
  2. 总线长度和负载是多少?——线长了、设备多了,速度就得降。
  3. 你需要双向通信吗?——如果需要读数据,UFm直接排除。

我个人的经验是:能用400kHz就别用100kHz,除非遇到兼容性问题。3.4MHz和5MHz虽然快,但PCB设计成本和调试难度会明显上升。你想想看,为了省那几百微秒的传输时间,花两天调波形,值不值?

避坑指南:我曾经在一个项目里把I2C配成了高速模式,结果发现从设备虽然支持,但它的输入引脚有5pF的电容,加上PCB走线的寄生电容,总线上电容超过了400pF。3.4MHz下波形完全畸变。后来加了总线缓冲器才搞定。所以,高速模式一定要算总线电容。
I2C四种传输模式对比 标准模式 Sm 100 kHz 开漏 + 上拉 快速模式 Fm 400 kHz 开漏 + 上拉 高速模式 Hs-mode 3.4 MHz 开漏 + 电流源 超快速模式 UFm 5 MHz 推挽(单向) 关键特性对比 双向通信: Sm ✓ Fm ✓ Hs-mode ✓ UFm ✗(仅单向) 多主支持: Sm ✓ Fm ✓ Hs-mode ✓ UFm ✗ 上拉电阻: Sm 需要(4.7kΩ) Fm 需要(1.5~2.2kΩ) Hs-mode 需要 + 电流源 UFm 不需要 适用场景: Sm:兼容性优先,低速传感器/EEPROM Fm:通用场景,90%的I2C设备首选 Hs-mode:高速ADC/DAC,FPGA通信 UFm:单向配置/固件更新,无需回读

最后说一句:不管选哪种模式,上拉电阻的计算都不能偷懒。标准模式用4.7kΩ没问题,快速模式就得降到1.5~2.2kΩ。高速模式更讲究,除了上拉电阻,还得考虑SCL上的电流源设计。UFm虽然不需要上拉,但推挽输出的驱动能力也得算清楚。