4. 硬件设计要点:上拉电阻计算、总线电容、电平匹配

I2C 通信看着简单,就两根线:SCL 和 SDA。但很多朋友调不出来,十有八九是硬件上出了问题。我这些年调试过的 I2C 故障,至少一半是上拉电阻没选对,或者电平不匹配导致的。今天咱们就把这几个硬骨头啃下来。

4.1 上拉电阻:不是随便焊一个 4.7kΩ 就完事

I2C 总线是开漏输出,高电平全靠上拉电阻拉上去。电阻选大了,上升沿变缓,通信容易出错;选小了,功耗高,从机可能拉不动。说白了,这是个平衡的艺术。

4.1.1 电阻最小值怎么算?

最小值受从机灌电流能力限制。公式很简单:

Rp(min) = (VDD - VOL(max)) / IOL(max)

其中:

  • VDD:总线供电电压(如 3.3V)
  • VOL(max):从机输出低电平的最大值(通常 0.4V)
  • IOL(max):从机灌电流能力(标准模式一般 3mA,快速模式 20mA)

举个例子,3.3V 系统,标准模式:

Rp(min) = (3.3 - 0.4) / 0.003 ≈ 967Ω

所以最小不能低于 1kΩ 左右。快速模式的话,可以小到 150Ω 左右。

4.1.2 电阻最大值怎么算?

最大值由总线电容决定。上升时间必须满足 I2C 规范:

Rp(max) = Tr / (0.8473 × Cb)

其中:

  • Tr:允许的最大上升时间(标准模式 1000ns,快速模式 300ns)
  • Cb:总线上总电容(包括引脚电容、走线电容等)

假设总线电容 50pF,标准模式:

Rp(max) = 1000ns / (0.8473 × 50pF) ≈ 23.6kΩ

经验范围:3.3V 系统、标准模式、2-3 个从机,我一般选 4.7kΩ。如果从机多或者走线长,我会降到 2.2kΩ 甚至 1.5kΩ。

4.2 总线电容:看不见的杀手

总线电容来自三部分:

  • 引脚电容:每个 I2C 引脚约 5-10pF
  • 走线电容:PCB 走线约 1-2pF/cm
  • 线缆电容:如果用了排线,每米约 50-100pF

I2C 规范对总线电容有明确限制:

模式 最大总线电容 最大上升时间
标准模式 (100kHz) 400pF 1000ns
快速模式 (400kHz) 400pF 300ns
快速模式+ (1MHz) 550pF 120ns

我曾经踩过的坑:有次用 1 米长的排线接了 5 个传感器,总线电容轻松超过 400pF。400kHz 下波形完全变形,最后降到 100kHz 才稳定。所以长距离传输,要么降速,要么用 I2C 缓冲器。

4.3 电平匹配:3.3V 和 5V 怎么共存?

STM32 的 I2C 引脚一般是 5V 容忍的,但高电平阈值不同。3.3V 系统 VIH 最低 0.7×VDD ≈ 2.31V,5V 系统 VIH 最低 0.7×5V = 3.5V。如果直接用 3.3V 上拉,5V 从机可能识别不到高电平。

4.3.1 常见电平匹配方案

方案 适用场景 优点 缺点
直接上拉到 3.3V 所有器件都支持 3.3V 最简单 5V 器件可能不识别
上拉到 5V + 电平转换 混合电压系统 兼容性好 需要额外芯片
MOSFET 双向电平转换 多主从、双向通信 自动双向,成本低 对 PCB 布局有要求
专用 I2C 电平转换器 高速、多通道 性能稳定 成本较高

4.3.2 MOSFET 电平转换电路

我个人最常用的是两个 N-MOSFET 加两个上拉电阻的方案。电路很简单:

3.3V 侧         5V 侧
SCL ──┬── Rpu ── VDD3.3    SCL ──┬── Rpu ── VDD5
      │                            │
      └── D ── S ── G ── S ── D ──┘
          MOSFET1      MOSFET2

工作原理:

  • 当 3.3V 侧拉低时,MOSFET 导通,5V 侧也被拉低
  • 当 3.3V 侧释放时,MOSFET 关断,5V 侧由上拉电阻拉到 5V
  • 反过来也一样,双向自动转换

选型建议:MOSFET 选 Vgs(th) 低于 1V 的,比如 BSS138、2N7002。上拉电阻两边可以不一样,我习惯 3.3V 侧用 4.7kΩ,5V 侧用 2.2kΩ。

4.4 知识结构总览

下面这张图把硬件设计的三个核心要点串起来了:

I2C 硬件设计核心三要素 I2C 硬件设计 上拉电阻计算 总线电容控制 电平匹配方案 最小值计算 最大值计算 经验值 4.7kΩ 引脚电容 走线电容 总电容 ≤ 400pF MOSFET方案 专用芯片 BSS138 常用 设计口诀 电阻选中间,电容算总账,电平要匹配,波形用眼看

4.5 实战检查清单

每次画完 I2C 的 PCB,我都会按这个清单过一遍:

  1. 上拉电阻值:计算最小值和最大值,取中间值。多从机用偏小值。
  2. 总线电容估算:引脚数 × 10pF + 走线长度 × 2pF/cm,确保不超过 400pF。
  3. 电平兼容性:检查所有器件的 VIH/VIL 和 VOL,确保在同一个电压域内或做了转换。
  4. 上拉电阻位置:尽量靠近主控端,不要分散在多个从机附近。
  5. 走线长度:SCL 和 SDA 尽量等长,避免差分延迟。
  6. 地线完整性:I2C 走线下方要有完整的地平面。

我的习惯:样板回来后,第一件事不是跑程序,而是用示波器看 SCL 和 SDA 的波形。看上升沿是否陡峭,高电平是否到位。波形对了,软件调试才能事半功倍。