这一节我们专门把 I²C 上拉电阻这件事讲"算清楚 + 看明白" 。
这是 I²C 最容易被忽略、但最致命的点之一。
我按 ①原理 → ②计算方法 → ③工程速算 → ④波形对比 → ⑤调试结论 来。
一、为什么 I²C 一定要上拉电阻(先立住逻辑)
1.1. I²C 是"开漏 + 线与"结构
-
所有器件只能拉低
-
不能主动拉高
-
高电平 = 靠上拉电阻慢慢充电
VCC │ Rpull │ SDA ──── 多个器件(只能下拉)
总结: 没有上拉 = SDA/SCL 永远低 = 总线瘫痪
1.2.上拉电阻直接决定了什么?
| 影响项 | 说明 |
|---|---|
| 上升沿速度 | 由 R × C 决定 |
| 最大通信速率 | 上升沿过慢会违背 I²C 规范 |
| 电流 | R 太小 → 器件拉不动 |
| 稳定性 | R 不合适 → 偶发错误 |
二、I²C 上拉电阻的"数学模型"
2.1. I²C 上升沿是 RC 充电曲线
SDA 从 0 → 1,不是跳变,而是:
V(t) = Vcc × (1 - e^(-t / (R × C)))
I²C 规范关心的是: 上升时间 tr
2.2. I²C 对上升时间的硬性要求(标准)
| 模式 | 速率 | tr 最大值 |
|---|---|---|
| Standard | 100 kHz | 1000 ns |
| Fast | 400 kHz | 300 ns |
| Fast+ | 1 MHz | 120 ns |
📌 超过这个,算违规
2.3.关键公式(工程必背)
I²C 规范给出的近似公式:
tr ≈ 0.8473 × Rpull × Cbus
反推上拉电阻:
Rpull ≤ tr / (0.8473 × Cbus)
三、工程级"上拉电阻计算示例"
示例 1:100kHz,普通 MCU + 2 个从设备
假设:
-
总线电容 Cbus ≈ 100 pF
-
模式:Standard(100kHz)
-
tr ≤ 1000 ns
计算:
R ≤ 1000ns / (0.8473 × 100pF) R ≤ 11.8kΩ
结论
-
4.7kΩ / 10kΩ 都 OK
-
工程上常用 4.7kΩ
示例 2:400kHz,线稍长
-
Cbus ≈ 200 pF
-
tr ≤ 300 ns
R ≤ 300ns / (0.8473 × 200pF) R ≤ 1.77kΩ
结论
-
2.2kΩ 合理
-
4.7kΩ 已经危险
示例 3:1MHz Fast Mode Plus
-
Cbus ≈ 100 pF
-
tr ≤ 120 ns
R ≤ 120ns / (0.8473 × 100pF) R ≤ 1.4kΩ
工程结论
-
1kΩ ~ 1.2kΩ
-
注意电流能力!
四、工程速算口诀(不用算公式)
100kHz → 4.7kΩ
400kHz → 2.2kΩ
1MHz → 1kΩ
前提:总线不超过 200pF
五、不同上拉电阻的"真实波形对比"(重点)
下面是你在示波器 / LA 上看到的典型现象。
5.1.上拉过大(比如 10kΩ @ 400kHz)
波形特征
-
SDA 上升很慢
-
斜坡明显
-
未到高电平就被拉低
_____/‾‾‾\_____
后果:
❌ 从机误判
❌ ACK 丢失
❌ 偶发 NACK
5.2.上拉合适(2.2kΩ @ 400kHz)
波形特征
-
上升沿干净
-
在 SCL 高电平前稳定
_____/‾‾‾‾‾\_____
后果
✅ 稳定通信
✅ ACK 正常
5.3.上拉过小(470Ω)
波形特征
-
上升很快
-
下降沿有"拖尾"
-
低电平不够低
后果:
⚠️ 从设备拉不动
⚠️ 电流过大
⚠️ IO 过载风险
六、拉电流能力检查(常被忽略)
拉低电流:
I = Vcc / Rpull
例如:
- 3.3V / 1kΩ ≈ 3.3mA
⚠️ 你要确认:
-
MCU
-
从设备
都能稳定下拉 ≥ 这个电流
📌 很多传感器只能拉 3mA 左右
七、多个上拉电阻的"暗雷"
⚠️ 常见事故
-
模块自带 4.7kΩ
-
主板又加了 4.7kΩ
👉 等效电阻 = 2.35kΩ
1 / Req = 1/R1 + 1/R2
📌 这会:
-
拉电流翻倍
-
低电平抬高
-
偶发死锁
八、调试 I²C 上拉的"实战步骤"
1️⃣ 万用表量 SDA / SCL 静态电压
2️⃣ 示波器看上升沿时间
3️⃣ 降速(400k → 100k)验证
4️⃣ 更换上拉阻值
5️⃣ 单设备测试(排除某个从设备拖线)
九、一句话工程结论(请记住)
I²C 稳不稳,先看上拉电阻
上升沿 = I²C 的生命线
能跑 100k,不代表能跑 400k