做嵌入式硬件开发的朋友肯定都知道:只要用到 I2C,SDA、SCL 外面必接上拉电阻,而且十有八九都是 4.7K。天天画、天天用,但真要问一句:为啥偏偏是 4.7K?用 1K、10K、100K 不行吗?今天咱们就聊一聊。
一、先搞清楚:I2C 引脚为啥要上拉?
I2C 的 SDA、SCL 引脚,内部都是开漏输出结构。这就造成一个现象:
- 芯片只能把电平拉低
- 不能自己主动输出高电平
想让总线回到高电平,必须靠外部电阻把电压“提上去”。所以,没有上拉电阻,I2C 根本跑不起来。
二、4.7K 不是瞎选的,是权衡出来的
选上拉电阻,本质就是在三个指标里找平衡:
- 上升沿速度(通信速率)
- 功耗
- 抗干扰能力
具体来说,电阻太小(比如 1K),上升沿快,能跑高速,但功耗大、IO 灌电流压力大,干扰也更容易串进来。电阻太大(比如 100K),功耗极低,但上升沿太慢,线稍微长一点波形就变形,很容易被干扰。那么4.7K 为什么常用?它在速度、功耗、抗干扰能力上刚好取中间值,满足标准 I2C 100kHz/400kHz 速率,适配绝大多数芯片、电平、走线长度。
三、背后真正的依据:RC 时间常数
总线上是有寄生电容的,主要有这么几个类型:
- IO 口电容;
- PCB 走线电容;
- 器件引脚电容;
一般总和在 10pF~400pF 之间。上升沿速度大致可以用这个公式估算: t ≈ R × C ;4.7K × 400pF ≈ 1.88μs;这个速度,在 400kHz I2C 里刚好满足时序要求。所以 4.7K 的数值也是有一定的理论基础背书的,不只是随便定义或者试出来的。
四、工程上选型建议
- 标准 I2C、距离不长(<20cm)选 4.7KΩ,比较稳妥;
- 电池供电、低功耗优先、走线不长就选10KΩ;
- 速率较高、走线稍长、环境干扰大选2.2KΩ;
- 从机特别多、总线很长、总电容大1K~2.2KΩ 之间试;
最简单的方法,如果不好确定,可以直接上 4.7K先进行测试。
五、实际工程里的坑点和小技巧
- 上拉电压要和芯片电平匹配,3.3V 系统就拉 3.3V,5V 系统就拉 5V。
- 一条总线上只需要一组上拉,不要每个模块都加,否则等效电阻会变小。
- 干扰大的环境加强技巧:如果是工业环境、电机旁边、走线比较长,电磁干扰比较严重,可以在 SDA、SCL 上各串一个 100Ω~300Ω 电阻,配合引脚寄生电容形成低通滤波,对高频噪声抑制效果非常明显。
4. 如果主设备和从设备电压不兼容时,做电平转换时,两边分别上拉到各自的电压域。
六、总结
I2C 之所以普遍用 4.7K 上拉,核心就几点:
- I2C 是开漏输出,必须上拉;
- 4.7K 是速度、功耗、抗干扰的最佳平衡点;
- 满足标准 I2C 时序与 RC 时间常数要求;
- 长期工程实践下来,成了通用方案;
大多数情况来说, I2C 上拉先上 4.7K,大概率一次跑通。
