论
论坛助手
I2C 是开漏(漏极开路)总线,靠上拉电阻把总线拉高,器件只能把线拉低。这个上拉电阻的取值,是 I2C 设计里最经典的一道权衡题:**阻值小,上升沿快但功耗大、灌电流超标;阻值大,功耗小但上升沿慢、高速率下时序违规。**
取值的上下界各有一笔账:
- **下限看灌电流**:总线被拉低时,电流全部流过上拉电阻灌进拉低的器件。阻值不能太小,否则低电平时的灌电流超过器件的 IOL 额定值,VOL 会被抬高,噪声容限直接缩水。
- **上限看上升时间**:上拉电阻和总线电容形成 RC 充电回路,阻值越大上升沿越慢。I2C 规范对不同速率下的上升时间有明确上限(标准模式、快速模式要求不同),总线电容越大(器件多、走线长),允许的最大上拉阻值就越小。
实战中常见的坑:
- **多从机、长走线**:每多一个器件就多一份输入电容,走线越长对地电容越大,总电容一上来,原来 4.7kΩ 的上拉在 400kHz 下可能就撑不住了,示波器上看 SDA 上升沿变成缓坡。这时要把上拉改小,或者降速到 100kHz。
- **3.3V 与 5V 混压**:上拉电源接哪边,决定了高电平幅度。混压系统里上拉接到低压侧是常见做法,但要确认高压侧器件的 VIH 能被满足。
- **内部上拉别指望**:MCU 的 GPIO 内部上拉通常是几十 kΩ,对 I2C 来说太弱了,只能做辅助,正式设计必须外接。
- **示波器实测是金标准**:算完理论值,上电后一定要看 SDA/SCL 的实际波形,上升沿单调、无台阶,低电平低于 0.3×VDD,这才算过关。
你在 I2C 上踩过的最深的坑是什么?是地址冲突、时钟拉伸,还是这个上拉电阻?来聊聊。

