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

相关推荐
羽获飞23 分钟前
从零开始学嵌入式之STM32——29.通用定时器-输入捕获模式测量信号的周期和频率
stm32·单片机·嵌入式硬件
421!35 分钟前
ESP32学习笔记之GPIO
开发语言·笔记·单片机·嵌入式硬件·学习·算法·fpga开发
惶了个恐42 分钟前
嵌入式硬件第二弹——51单片机(2)
单片机·嵌入式硬件·51单片机
LCG元1 小时前
STM32实战:基于STM32CubeMX的串口通信与DMA传输优化
stm32·单片机·嵌入式硬件
heanyu1 小时前
STM32学习 1 ----串口通讯--阻塞式收发+支持printf
stm32·嵌入式硬件·学习
莎士比亚的文学花园1 小时前
硬件入门——51单片机
单片机·嵌入式硬件·51单片机
2501_918126912 小时前
学习所有6502写游戏动作的语句
汇编·嵌入式硬件·学习·游戏·个人开发
Suifqwu2 小时前
stm32进阶-FLASH存储优化
stm32·单片机·嵌入式硬件
2501_918126912 小时前
学习所有6502游戏的系统
java·汇编·嵌入式硬件·学习·游戏
LCMICRO-133108477465 小时前
长芯微LD9689完全P2P替代AD9689,是一款双通道、14位、2.0 GSPS/2.6 GSPS模数转换器(ADC)
网络·单片机·嵌入式硬件·网络协议·fpga开发·硬件工程·高速adc