高阻抗(High-Z)状态表示一个引脚既不输出高电平(1),也不输出低电平(0),而是像一个断开的电路,表现得像一个非常大的电阻(几 MΩ 或更高)连接到信号线上;是一种让引脚“退出驱动、让位他人”的机制,换句话说:
该引脚“退出了战斗”,不影响总线电平,也不参与驱动。
1、高阻抗的电气本质
在电路内部,一个 IO 引脚的电平是通过下图这种结构控制的:
Vcc│[PMOS] ← 控制输出高电平│ IO ──────┼─────► 输出引脚│[NMOS] ← 控制输出低电平│GND
在正常“推挽输出”中:
-
PMOS 导通 → 输出高电平
-
NMOS 导通 → 输出低电平
而当进入 高阻状态(High-Z)时:
-
PMOS 和 NMOS 都关闭
-
输出引脚 不连接到电源或地
-
表现为一个断开的端口,称为“三态逻辑”中的第三态(除了高、低之外的“Z”)
2、高阻抗的主要特点
特点 | 描述 |
---|---|
像断路 | 引脚不会驱动任何电压 |
输入高灵敏 | 极易受周围电场、静电、噪声干扰 |
电压不可预测 | 如果悬空,电平是随机的、不稳定的 |
不影响总线 | 多个器件共用信号线时,可通过高阻切换“谁说话” |
常见于三态IO口 | 比如 GPIO、复用接口、总线驱动器、数据总线 |
3、High-Z 状态的典型应用场景
场景 | 原因 |
---|---|
总线共享(如 I²C、SPI、并口) | 多个器件共用数据线,非当前发送器需进入高阻以避免冲突 |
多主设备总线 | 例如多主 I²C,每个主设备在非通信时必须释放总线(High-Z) |
MCU 作为输入时 | 设置为高阻输入状态,以监听电平,不干扰外部驱动 |
开漏/开集电极输出 | 输出“0”时拉低,输出“1”时mos管关闭进入高阻,由上拉电阻拉高 |
三态缓冲器控制信号 | 控制何时一个设备“说话”,何时“闭嘴”(进入高阻) |
三态缓冲器(tri-state buffer)
控制引脚EN = 1 输入信号 ─▶ [缓冲器] ─▶ 输出信号控制引脚EN = 0 输入信号 ─▶ [缓冲器] ─▶ 高阻状态(不影响输出线)
控制电路是否驱动输出,常用于多设备控制同一信号线,如 MCU 总线接口
4、如何“进入”和“退出”高阻抗状态
具体做法取决于你用的是什么平台或设备,但基本分为以下两种常见控制方式:
①MCU(单片机)中的 GPIO 控制
MCU GPIO 引脚常见状态:
模式 | 含义 |
---|---|
输出推挽 | 有源输出高或低(非高阻) |
输出开漏 | 输出 0 时导通;输出 1 时进入高阻 |
输入模式(高阻) | IO 不主动驱动电平,只“监听”电压 |
输入带上拉/下拉 | 高阻 + 内部拉电阻 |
模拟模式 | 也常为高阻,适合ADC采样 |
进入高阻(例:STM32、Arduino、ESP32):
-
把 IO 设置为 输入模式(Input / Floating)
-
或设置为 开漏输出且输出高电平
示例:STM32 HAL 库
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 拉高(开漏) GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 设置开漏输出 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 进入高阻态
示例:Arduino
pinMode(PIN, INPUT); // 高阻态 pinMode(PIN, OUTPUT); // 推挽 digitalWrite(PIN, HIGH); // 推挽输出高 pinMode(PIN, INPUT_PULLUP); // 高阻 + 上拉
②使用三态缓冲器(Tri-state buffer)
硬件逻辑中使用专门的芯片(如 74HC125、74LS245)或 FPGA 驱动:
原理图示意:
输入信号 ──► [三态缓冲器] ──► 总线(共用)▲EN 控制引脚
EN=1 时:
-
缓冲器导通 → 输出信号
EN=0 时:
-
缓冲器输出进入高阻状态,不会干扰总线
4、注意事项
错误用法 | 后果 |
---|---|
引脚悬空但未上拉/下拉 | 电压不稳定,容易误判、高功耗 |
总线多个设备不进入高阻 | 发生“信号冲突”→ 烧芯片 |
忘记退出高阻态输出信号 | 引脚不响应、不工作 |