摘要:I2C 通讯失败,示波器一看 SDA/SCL 上升沿是个圆弧?别急着换芯片,90% 的情况是你的上拉电阻在“偷懒”。本文不只讲理论,更教你如何用示波器 30 秒定乾坤。
一、问题描述(现象)
**I2C 频率标称 400kHz,示波器测出来只有 100kHz;
或者波形看着还行,但读数据偶尔丢 ACK。**
很多工程师的选值是:
照抄开发板,选 10kΩ。
为了“稳一点”,选 4.7kΩ。
甚至为了省事,直接用 MCU 内部上拉。
结果: 量产时一批货出问题,研发和生产互相甩锅。
二、原理分析(为什么要这么选?)
1. 物理模型
I2C 总线是开漏输出(Open Drain)。
VCC -> [Rp] -> SDA/SCL -> [NMOS] -> GND
2. 核心参数
-
Tr (Rise Time):信号从 0.3VCC 上升到 0.7VCC 的时间。
-
Cb (Bus Capacitance):PCB 走线 + 从机引脚的寄生电容。
RC 充电公式:
Tr ≈ 0.847 × Rp × Cb
3. 反直觉真相(新手 vs 老鸟)
为什么开发板用 10k 能跑,你的一上量产就挂?
-
开发板:EEPROM 就在 MCU 旁边,连线短,电容 Cb 极小。
-
你的板子:加了排线、插座、3 个传感器,Cb 直接翻倍。
这时候你还用 10kΩ,上升时间 Tr 直接超标,波形变成圆弧,ACK 自然读不到。
三、工程级解决方案
方案 1:按公式计算(最靠谱)
以 400kHz I2C 为例,标准要求 Tr ≤ 300ns。
假设总线电容 Cb = 200pF(常见值):
Rp_max = Tr / (0.847 × Cb)
= 300ns / (0.847 × 200pF)
≈ 1.77 kΩ
结论: 400kHz 下,1.8kΩ 是理论最大值。
方案 2:经验速查表(建议收藏)
|
100 kHz |
10 kΩ |
板内通信,电容小 |
|
400 kHz |
4.7 kΩ |
工业标准值 |
|
1 MHz |
2.2 kΩ |
必须计算,不建议拍脑袋 |
方案 3:降低电容(硬件解法)
如果必须用高频 I2C:
-
缩短走线长度。
-
减少从机数量(< 8 个)。
-
不要使用插座或排针。
四、选型避坑建议
千万别用 MCU 内部上拉:通常 30kΩ~50kΩ,完全带不动总线电容。
电源电压:
-
3.3V 系统:上拉到 3.3V。
-
5V 系统:上拉到 5V(注意电平兼容)。
多设备冲突:多个从设备分散在不同板子上,总电容会叠加。
五、总结 Checklist
-
[ ] 是否用示波器看过上升沿时间?
-
[ ] 上拉电阻是否小于 1.8kΩ(400kHz 下)?
-
[ ] 是否排除了排针/插座带来的寄生电容?
-
[ ] 是否计算了所有从机输入电容的总和?
六、写在最后(关注我,少走弯路)
我是 XXX,一个拒绝调包、专注底层逻辑的嵌入式工程师。
做项目时,最怕的不是代码写不出,而是硬件行为诡异:
-
I2C 读数据全是 0xFF?
-
DMA 传输莫名错位?
-
示波器波形看着对,逻辑就是不通?
这些“玄学问题”往往要查好几天。
关注我的专栏《嵌入式底层避坑指南》,我会把多年踩过的坑和对应的示波器波形图整理出来。
关注我,下次遇到问题,直接翻历史文章就能救急。
👉 下一篇预告:《I2C 死锁了?SDA 一直被拉低?别复位 MCU,试试这 3 种救活方法》
References
-
NXP UM10204 – I2C-bus specification and user manual
-
TI Application Report SLVA689 – I2C Bus Pull-Up Resistor Calculation
如果你曾被 I2C 的波形折磨过,欢迎在评论区晒出你的示波器截图,我们一起分析。
原创文章,转载请注明出处。



