Skip to content
进阶#三态门#总线#上拉电阻#下拉电阻#开漏#I2C

三态门、总线与上拉下拉 ​

1. 设计动机 ​

<>

普通逻辑门输出只有 0 和 1 两态,不能两个门的输出直接接在一起——一个输出 1、另一个输出 0,等于把 VCC 和 GND 短路,大电流烧毁芯片。

但实际系统里,多个芯片要共用一根总线(比如地址总线、数据总线、I²C 的 SDA),怎么办?答案是:三态门(Tri-State Buffer)——输出除了 0/1,还有第三态"高阻(Hi-Z)",相当于断开。不工作的芯片输出高阻,把总线让给正在工作的那一个。

总线空闲(所有芯片都高阻)时电平不定,容易拾取噪声,所以要加上拉/下拉电阻把空闲电平固定住。

本章讲:三态门、共享总线、上拉/下拉电阻、开漏输出与线与。这是 I²C、并行总线、GPIO 设计的基础。

2. 原理与逻辑图 ​

2.1 三态门 ​

三态缓冲器有数据输入 D、使能 EN、输出 Y。EN=1 时 Y=D(像普通缓冲);EN=0 时 Y 高阻(相当于断开)。多个三态门输出接同一根总线,任一时刻只一个 EN=1,其余高阻,就不会冲突。

三个三态门驱动共享总线:EN1/EN2/EN3 互斥,任一时刻只一个有效
三个三态门驱动共享总线:EN1/EN2/EN3 互斥,任一时刻只一个有效

2.2 上拉/下拉电阻 ​

输入引脚悬空时电平不定(像天线拾取噪声)。上拉电阻把悬空电平拉到 VCC(读默认高),下拉电阻拉到 GND(读默认低)。

2.3 开漏输出与线与 ​

开漏(Open-Drain, OD)输出只能主动拉低,不能主动拉高——要靠外部上拉电阻才能输出高。多个 OD 输出接一起,只要任意一个拉低,总线就低;都释放时上拉电阻拉高。这叫"线与(Wired-AND)",是 I²C 总线的物理层原理。

3. 静态分析(三态真值表) ​

三态缓冲器真值表:

ENDY
100
111
0×Hi-Z(高阻,断开)

开漏输出真值表:

输入输出 MOS总线状态(带上拉)
0截止(释放)被上拉拉高 = 1
1导通(拉低)主动拉低 = 0

4. 动态分析(总线竞争与上拉速率) ​

总线上接了多个芯片时,如果两个 EN 同时为 1,一个推高、一个拉低,就是总线竞争(Bus Contention),瞬间大电流。正常工作时 EN 互斥,切换要"先关后开"(避免同时为 1)。

开漏总线上拉电阻决定上升沿速度:上拉电阻 RR 和总线电容 CC 构成 RC,上升沿时间 ≈0.7RC\approx 0.7RC。RR 太大则上升沿慢(I²C 高速模式受限);RR 太小则拉低时电流大、功耗高。

观察:上拉电阻越小,上升沿越快,但稳态拉低电流越大(VOL/RV_{OL}/R)。I²C 标准模式 100kHz 用 4.7k,快速模式 400kHz 要更小(2.2k)。

5. 总线结构与驱动能力 ​

  • 总线宽度:数据总线并行多位,地址总线单向输出。
  • 驱动能力:每个三态门能驱动的总线电容有限,挂太多芯片要加缓冲器(Buffer/Line Driver)。
  • 端接:高速总线要端接阻抗匹配(见 PCB 篇),低速 I²C 不需要。
  • 线与优势:开漏天然支持多主(多设备同时拉低不会冲突),这是 I²C 多主仲裁的基础。

6. 元件取值与工程权衡 ​

  • 上拉电阻取值:I²C 常用 4.7k(标准模式)~2.2k(快速模式);GPIO 默认上拉一般 10k~100k。
  • 上拉 vs 内部上拉:MCU 内部弱上拉(~50k)省电阻但驱动弱,长线/多设备要外部强上拉。
  • 三态使能互斥:软件切换总线主从时,先关旧 EN、延时、再开新 EN,避免竞争。
  • 下拉 vs 上拉默认电平:按键按下接地,默认要高,用上拉(按下读低);别用下拉(按下读高会短路 VCC)。

7. 完整设计示例 ​

<>
  1. 需求:I²C 标准模式 100kHz,总线挂 3 个从机,每个引脚电容 10pF,走线电容 50pF,总电容 CL=80C_L=80pF。
  2. 选上拉电阻:I²C 规范要求上升沿时间 ≤ 1000ns。tr=0.847⋅R⋅CL≤1000t_r=0.847\cdot R\cdot C_L \le 1000ns。
  3. 算 R 上限:R≤1000ns/(0.847×80pF)≈14.8kR \le 1000\text{ns}/(0.847\times80\text{pF}) \approx 14.8\text{k}。
  4. 算 R 下限:拉低时灌电流 IOL=3mAI_{OL}=3\text{mA}(V_OL=0.4V),R≥(3.3−0.4)/3mA≈967ΩR \ge (3.3-0.4)/3\text{mA} \approx 967\Omega。
  5. 取值:967Ω≤R≤14.8k967\Omega \le R \le 14.8\text{k},取标准 4.7kΩ,兼顾上升沿和功耗。
  6. 验算:tr=0.847×4.7k×80pF≈318t_r=0.847\times4.7\text{k}\times80\text{pF}\approx318ns < 1000ns ✓;拉低电流 (3.3−0.4)/4.7k≈0.62(3.3-0.4)/4.7\text{k}\approx0.62mA < 3mA ✓。

8. 仿真与实验 ​

在 Logisim 中:

  • 放 3 个三态缓冲器,输出接同一根总线,各自 EN 接拨码开关,验证任一时刻只一个 LED 亮。
  • 故意把两个 EN 同时拨 1,观察 Logisim 提示总线冲突。
  • 用一个开漏缓冲器 + 上拉电阻,输出接 LED,验证只能拉低、高电平靠上拉。
  • 在面包板上用 MCU GPIO 开漏模式 + 4.7k 上拉接 I²C 传感器,示波器看上升沿。

扩展与变种电路 ​

扩展1:上拉电阻与下拉电阻 Pull-up / Pull-down ​

把悬空输入固定到默认电平,防止噪声误触发。

上拉(悬空读高)与下拉(悬空读低)接法对比
上拉(悬空读高)与下拉(悬空读低)接法对比
<>
  • 上拉:输入经 R 接 VCC,外部按键按下接地时读低、松开时被 R 拉高。
  • 下拉:输入经 R 接 GND,外部按键接 VCC 时读高、松开时被 R 拉低。
  • 取值 10k 左右:太大抗噪差、太小耗电。
  • 按键输入默认要高(按下接地读低)→ 用上拉;不要用下拉(按下会短路 VCC)。

设计要点:按键、使能、片选默认电平由上拉/下拉决定。取值/对比:上拉 vs 下拉——看默认要高还是要低。适用:按键、未用引脚、片选默认;不适用:高速信号(电阻加 RC 拖慢边沿)。

<>
  • 现象:悬空输入像天线拾取噪声,输出乱跳、芯片发热。
  • 原因:CMOS 输入阻抗极高,悬空电平不定,中间区让输出级上下管同时导通,穿电流大。
  • 解决:未用输入引脚必须接上拉/下拉,或配成输出,不能悬空。

扩展2:开漏输出线与 Open-Drain Wired-AND ​

多个开漏输出接一根线,天然实现"只要任意一个拉低就低",是 I²C 的物理层。

两个开漏输出并接 SDA,共用一个上拉电阻:任一拉低则总线低
两个开漏输出并接 SDA,共用一个上拉电阻:任一拉低则总线低
<>
  • 开漏输出只能拉低、不能主动拉高。
  • 任一 OD 导通 → SDA 低;都截止 → 上拉电阻把 SDA 拉高。
  • 逻辑上等于"线与":SDA=OD1‾⋅OD2‾SDA = \overline{OD_1}\cdot\overline{OD_2}(任一拉低即低)。
  • I²C 的 SDA/SCL 都是开漏 + 上拉,多主设备不会因为同时输出而短路。

设计要点:开漏适合双向/多主总线。取值/对比:开漏 vs 推挽——推挽能主动拉高、速度快;开漏速度靠上拉、但天然多主。适用:I²C、1-Wire、电平转换;不适用:高速点对点(用推挽)。

<>
  • 现象:两个推挽输出并接,一个推高一个推低,大电流烧毁引脚。
  • 原因:推挽能主动拉高能主动拉低,并接就是 VCC-GND 短路。
  • 解决:多设备共享总线必须用三态门(分时)或开漏(线与),不能推挽直并。

9. 常见坑与故障现象 ​

<>
  • 两个三态门同时使能:总线竞争,大电流、数据错乱。软件切主从要"先关后开"。
  • 总线空闲电平不定:所有芯片高阻时没人驱动,电平飘。加合适上拉/下拉固定空闲电平。
  • 上拉电阻取值过大:I²C 上升沿太慢,高速模式通信失败。按总线电容和速率算 R 上限。
  • 未用 CMOS 引脚悬空:输入悬空拾取噪声、输出级穿流发热。未用脚必须接死。

10. 自测题 ​

三态门 EN=0 时输出是什么状态?能直接把两个三态门输出并接吗?

EN=0 时输出是高阻(Hi-Z),相当于断开。多个三态门输出并接成总线是可以的,但任一时刻只能一个 EN=1,其余高阻;如果两个同时 EN=1,一个推高一个推低,就是总线竞争短路。

I²C 的 SDA 为什么用开漏 + 上拉,而不是推挽?

I²C 是多主总线,多个设备都可能驱动 SDA。推挽输出如果一个设备推高、另一个推低就短路烧毁。开漏输出只能拉低,多设备同时驱动也只是"一起拉低",不会短路;高电平由共用上拉电阻产生。这天然支持多主和线与。

按键接 MCU GPIO,按下时接地,应该用上拉还是下拉电阻?

按键按下接地,松开时引脚悬空。我们希望松开时读高、按下时读低,所以用上拉电阻(松开被拉到 VCC=高,按下接地=低)。如果用下拉,松开读低、按下要接 VCC 才读高,按下瞬间会把 VCC-GND 短路。

11. 参考资料 ​

  • TI 逻辑电路应用笔记(三态总线与上拉电阻选型)
  • NXP I²C-bus 规范与用户手册