三态门、总线与上拉下拉
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,其余高阻,就不会冲突。
2.2 上拉/下拉电阻
输入引脚悬空时电平不定(像天线拾取噪声)。上拉电阻把悬空电平拉到 VCC(读默认高),下拉电阻拉到 GND(读默认低)。
2.3 开漏输出与线与
开漏(Open-Drain, OD)输出只能主动拉低,不能主动拉高——要靠外部上拉电阻才能输出高。多个 OD 输出接一起,只要任意一个拉低,总线就低;都释放时上拉电阻拉高。这叫"线与(Wired-AND)",是 I²C 总线的物理层原理。
3. 静态分析(三态真值表)
三态缓冲器真值表:
| EN | D | Y |
|---|---|---|
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 0 | × | Hi-Z(高阻,断开) |
开漏输出真值表:
| 输入 | 输出 MOS | 总线状态(带上拉) |
|---|---|---|
| 0 | 截止(释放) | 被上拉拉高 = 1 |
| 1 | 导通(拉低) | 主动拉低 = 0 |
4. 动态分析(总线竞争与上拉速率)
总线上接了多个芯片时,如果两个 EN 同时为 1,一个推高、一个拉低,就是总线竞争(Bus Contention),瞬间大电流。正常工作时 EN 互斥,切换要"先关后开"(避免同时为 1)。
开漏总线上拉电阻决定上升沿速度:上拉电阻 和总线电容 构成 RC,上升沿时间 。 太大则上升沿慢(I²C 高速模式受限); 太小则拉低时电流大、功耗高。
观察:上拉电阻越小,上升沿越快,但稳态拉低电流越大()。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. 完整设计示例
- 需求:I²C 标准模式 100kHz,总线挂 3 个从机,每个引脚电容 10pF,走线电容 50pF,总电容 pF。
- 选上拉电阻:I²C 规范要求上升沿时间 ≤ 1000ns。ns。
- 算 R 上限:。
- 算 R 下限:拉低时灌电流 (V_OL=0.4V),。
- 取值:,取标准 4.7kΩ,兼顾上升沿和功耗。
- 验算:ns < 1000ns ✓;拉低电流 mA < 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 的物理层。
- 开漏输出只能拉低、不能主动拉高。
- 任一 OD 导通 → SDA 低;都截止 → 上拉电阻把 SDA 拉高。
- 逻辑上等于"线与":(任一拉低即低)。
- 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 规范与用户手册