2、SCL与SDA信号特性:上拉电阻、电平转换归纳总结
大家做I2C项目,硬件层面最容易出问题的,就是上拉电阻和电平转换。今天我把这块掰开揉碎了讲。
2.1 开漏输出结构——一切都是为了“线与”
为什么I2C要用开漏?说白了就是多主通信的需要。多个设备都能拉低总线,但不能互相打架。开漏结构下,任何一个设备拉低,总线就被拉低;都不拉时,靠上拉电阻把电平拉回高。我曾经见过一个新手直接把SCL/SDA配成推挽输出,结果两片从设备一通信总线就冒烟——那就是典型的“短路式冲突”。
| 特性 | 开漏(I2C) | 推挽(SPI) |
|---|---|---|
| 输出低电平 | NMOS导通,直接到GND | NMOS导通,同样拉低 |
| 输出高电平 | 高阻,外接上拉电阻抬高 | PMOS导通,直接到VDD |
| 多驱动冲突 | 无损“线与”,支持仲裁 | 不能直连,必须分时 |
| 上升沿速度 | 由上拉电阻和总线电容决定 | 由驱动能力决定(通常快很多) |
2.2 上拉电阻取值——不是随便焊个10k
我入行第二年,做一款手持仪表,I2C跑400kHz,图省事全板用了10kΩ上拉。结果示波器一看,上升沿快2μs了,超了规格书要求。后来换4.7kΩ才搞定。所以说,阻值大小影响的是上升时间。
阻值下限受两个因素限制:
- 灌电流:拉低时流过NMOS的电流不能超过器件最大额定(常见20mA)。
- 输出低电平:电流太大可能导致VOL超出0.4V。
阻值上限主要看总线上电容(线长、引脚数)和希望达到的上升时间。公式很简单:t_R ≈ 0.847 × R_p × C_bus。你想想看,400kHz要求上升时间≤300ns,如果C_bus=50pF,算出来R_p最大7kΩ左右。
| 速率模式 | 标称频率 | 建议电阻范围 | 上升时间要求 |
|---|---|---|---|
| 标准模式 | 100 kHz | 4.7k – 10kΩ | ≤1000 ns |
| 快速模式 | 400 kHz | 2.2k – 4.7kΩ | ≤300 ns |
| 快速模式+ | 1 MHz | 1k – 2.2kΩ | ≤120 ns |
2.3 电平转换——3.3V主控接5V从设备
我做消费电子产品,电源域经常混搭。主控3.3V,一个温度传感器是5V。直接接上去?SCL/SDA的高电平会被3.3V钳位,5V器件可能不认高电平。反过来,5V器件输出高时5V,3.3V主控的引脚耐受不住。
常用的解决方案就两种:
- 分立MOS管自动检测电平转换(成本低、最常用)。
- 集成电平转换芯片(如TXS0102,适合多通道)。
我建议新手直接用集成芯片,省心。但原理层面,你得知道那两颗MOS管是怎么工作的。下面这张图一眼就清楚。
上图里,电平转换器内部通常是一颗N沟道MOSFET。一侧的驱动管拉低时,栅极通过电阻上拉到VDD,另一侧的漏极也会被拉低。这样一来,无论哪一侧先拉低,总线都会变成低电平。高电平时两边的上拉电阻各自拉到自己的VDD。
2.4 上拉电阻与电平转换的协同设计
你想想看,两边VDD不一样,上拉电阻阻值也要分开算。3.3V侧用4.7kΩ,5V侧可能要用10kΩ才能让上升时间匹配。我一般先保证两边上升时间一致,避免总线时序不对称。
还有一个细节:总线电容。片选多的时候,总电容容易超过100pF。这时候别犹豫,上拉电阻往小了调,同时检查灌电流是否超标。我设计过一个24从设备的总线,最后用了1.5kΩ上拉,每路拉低时电流约3.3V/1.5k≈2.2mA,还在安全范围内。
2.5 避坑清单
- 上拉电阻焊成0Ω —— 直接等于把电源和地通过总线短接,一拉低就过流。
- 不同电压域混用一个上拉电阻 —— 比如3.3V主控和5V从设备共用一颗4.7k拉到5V,主控引脚可能被强行拉到5V而烧毁。
- 忘了给从设备加独立上拉 —— 模块内部没上拉,全靠主板上拉,可能造成边缘过缓。
- 电平转换器两侧电容不匹配 —— 严重时导致振荡,总线无法正常建立逻辑电平。