20.IIC通信上拉电阻的计算

这一节我们专门把 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

相关推荐
Brilliantwxx8 分钟前
【STM32】 RTC 实时时钟详解:从概念到预分频器
stm32·单片机·嵌入式硬件·mcu·bash
inrichtt6 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
半杯咖啡半行码7 小时前
Linux字符设备驱动开发基础:从设备号到ioctl的完整实战
stm32·单片机·嵌入式硬件
碧海银沙音频科技研究院8 小时前
基于炬芯ATS3089X的usb U盘/usb audio声卡/usb cdc虚拟串口/录音dump到本地功能实现
stm32·单片机·嵌入式硬件
CC180253944869 小时前
具有强大的图像和语音处理能力的高性能 MCU芯片ESP32-P4NRW32X
单片机·嵌入式硬件
恒锐丰科技林技术员11 小时前
EG1416 低侧栅极驱动芯片:小封装下的功率驱动利器
经验分享·嵌入式硬件·硬件工程
桀人12 小时前
I2C概念引入
stm32·单片机·嵌入式硬件
神一样的老师13 小时前
RA4M2 + AHT20 温湿度传感器实战
单片机·嵌入式硬件
我是人✓14 小时前
STM32上跑FreeRTOS:实时任务调度全解析
stm32·单片机·嵌入式硬件
HQB202616 小时前
EG1195S|屹晶微电子 120V 外置 MOS 异步降压 DC‑DC 控制器
嵌入式硬件·硬件工程