你有没有想过一个问题:同样是GPIO输出,为什么有的叫“推挽”,有的叫“开漏”?推挽能输出高电平,也能输出低电平。开漏只能输出低电平,高电平要靠外面的电阻“拉”上去。开漏这么“弱”,为什么芯片设计者还要留着它?因为“弱”,恰恰是它最大的优势。

那个“能推能拉”的推挽(对应教程3.3节)推挽输出,内部有两个MOS管:一个接VCC,一个接地。

  • 输出高电平:上面的MOS管导通,下面的关断——把引脚“推”到VCC
  • 输出低电平:上面的关断,下面的导通——把引脚“拉”到地

它能主动输出高电平,也能主动输出低电平,所以叫“推挽”。推挽的驱动能力强,可以直接点亮LED(教程中用正向驱动点亮LED,电流可达25mA)。但它有个问题:多个推挽输出不能直接连在一起。

如果一个输出高电平(3.3V),另一个输出低电平(0V),两个引脚直接短接——3.3V和0V打架,电流无穷大,烧引脚。推挽适合“点对点”,不适合“多对一”。

那个“只会放手”的开漏(对应教程3.4节)开漏输出,内部只有一个接地的MOS管。

  • 输出低电平:MOS管导通,引脚拉到地
  • 输出高电平:MOS管关断,引脚什么都不接——悬空

它不能主动输出高电平,只能“放手”。要让引脚变成高电平,必须在外面接一个上拉电阻,把引脚拉到VCC。它不会和别的引脚打架,因为它根本不会主动输出高电平。

那个“电平转换”的魔法(对应教程3.4节),开漏配合上拉电阻,可以实现电平转换。比如,3.3V的单片机和5V的芯片通信。把开漏引脚接到5V芯片的输入端,上拉电阻接5V。

  • 单片机输出低电平(MOS管导通)→ 引脚被拉到0V → 5V芯片读到0
  • 单片机输出高电平(MOS管关断)→ 引脚被上拉电阻拉到5V → 5V芯片读到1

3.3V的单片机,用开漏输出,直接驱动5V的芯片。不需要电平转换芯片,不需要三极管,一个电阻就够了。

那个“线与”的逻辑(对应教程3.6节)开漏的第二个妙用:多个开漏输出可以接在一起,形成“线与”逻辑

比如I2C总线的SDA和SCL,都是开漏输出。任何一个设备把线拉低,整条线就是低电平。所有设备都“放手”,线才被上拉电阻拉高。多个设备共享同一条总线,不会互相打架。

那个“悬空”的危险(对应教程3.6节),开漏输出高电平时,引脚是悬空的。教程中强调:永远不要让引脚浮空。浮空的引脚像一根天线,会接收空间中的电磁干扰。电压不确定,可能被误读,甚至损坏设备。教程中举了个例子:浮空的引脚控制激光切割机,可能造成安全事故。所以,开漏输出必须接上拉电阻,给引脚一个确定的电平。

这个故事的启示,为什么开漏“只能输出低电平”反而是优点?因为它不争不抢。推挽输出像一只紧握的手——要么推出去,要么拉回来。开漏输出像一只张开的手——可以拉回来,也可以放开。它不强求电压,所以可以适应不同的电平标准。它不主动输出高电平,所以可以和别人共享一条线。这就是开漏的哲学:有所不为,才能无所不能。

写在最后,下次你需要连接不同电压的芯片,或者让多个设备共享同一条总线。想想开漏输出。上拉电阻一接,电平转换搞定。那个“不会输出高电平”的缺陷,恰恰是它最强大的地方。


(本文灵感源于于振南《新概念ARM32单片机》教程第3.3节“GPIO输出模式之推挽输出”、第3.4节“GPIO开漏模式与电平匹配”和第3.6节“开漏模式下外部上拉电阻的关键性”,感谢作者将GPIO电气特性讲得如此通透。)


如果您觉得这个故事对您有启发,欢迎点赞、转发,让更多工程师看到这个藏在开漏背后的“放手”哲学。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐