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Ω |
4.3 高速模式(High-speed mode,Hs-mode)
高速模式把频率推到了3.4MHz。这个模式有点特殊——它需要一个“握手桥接”的过程。
具体来说,主设备要先在400kHz下发送一个特殊的“主设备码”(00001XXX),然后才能切换到3.4MHz。从设备收到这个码后,会打开自己的高速模式接收器。这个过程叫“Hs-mode handshake”。
我参与过一个FPGA与高速ADC通信的项目,用的就是3.4MHz的I2C。说实话,这个速度下PCB走线已经不能随便画了。SCL和SDA必须等长,而且要走内层,避免外部干扰。
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 四种模式的选型建议
选哪种模式,其实就三个问题:
- 从设备支持哪种模式?——查手册,这是硬约束。
- 总线长度和负载是多少?——线长了、设备多了,速度就得降。
- 你需要双向通信吗?——如果需要读数据,UFm直接排除。
我个人的经验是:能用400kHz就别用100kHz,除非遇到兼容性问题。3.4MHz和5MHz虽然快,但PCB设计成本和调试难度会明显上升。你想想看,为了省那几百微秒的传输时间,花两天调波形,值不值?
最后说一句:不管选哪种模式,上拉电阻的计算都不能偷懒。标准模式用4.7kΩ没问题,快速模式就得降到1.5~2.2kΩ。高速模式更讲究,除了上拉电阻,还得考虑SCL上的电流源设计。UFm虽然不需要上拉,但推挽输出的驱动能力也得算清楚。