开漏输出:只拉低不推高,靠上拉电阻“借”高电平
短文标题:开漏输出:只拉低不推高,靠上拉电阻“借”高电平

你有没有想过一个问题:I2C总线上多个设备的SDA引脚连在一起,为什么不会短路?因为它们用的是开漏输出,不是推挽。 谁都能拉低,但谁也不主动推高。大家都“放手”时,总线被上拉电阻拉到高电平。开漏输出的内部结构,开漏输出内部只有一个接地的NMOS管:
- 输出低电平(0):MOS管导通,引脚拉到0V
- 输出高电平(1):MOS管关断,引脚悬空——必须靠外部上拉电阻提供高电平
开漏的“漏”是指MOS管的漏极开路(Open-Drain)。线与逻辑,多个开漏输出接在同一条线上:

任何一个设备拉低,总线就是低电平。全部“放手”,总线才被上拉至高电平。——这就是“线与”逻辑。上拉电阻阻值怎么选?上拉电阻是三要素的平衡:上升时间、功耗、总线电容。
I2C规范:400kHz用1.5~2kΩ,100kHz用4.7~10kΩ。开漏的三个应用场景
1. 线与逻辑(多设备共享总线)
I2C总线、1-Wire总线基于此原理。多个设备共享同一条数据线,不会短路。
2. 电平转换(3.3V ↔ 5V)
上拉电阻接5V,3.3V单片机开漏输出即可驱动5V设备。电平由上拉电压决定。
3. 双向通信
开漏引脚既可作为输出(MOS管拉低或放手),也可作为输入(读取引脚电平)。同一条线实现双向传输。

STM32内部上拉
内部上拉电阻约40kΩ,通过GPIOx_ODR寄存器控制:
GPIOA->CRL |= (0x08 << 0); // 上拉/下拉输入模式
GPIOA->ODR |= (1 << 0); // 使能内部上拉
内部上拉驱动弱(上升沿慢,适合几百kHz内),I2C高速仍需外部上拉。
这个故事的启示,开漏输出不强,但“合群”:不主动推高,才能协作共享。上拉电阻是开漏的灵魂,没它就“飘”了。写在最后,I2C总线用开漏,不是因为它强,是因为它“合群”。选好上拉电阻,速度和功耗兼得。开漏+上拉=共享总线的黄金搭档。
(本文灵感源于于振南《新概念ARM32单片机》教程第3.4节、第3.6节。)
觉得有用?点赞、转发,让更多人看懂开漏输出的总线共享智慧。

更多推荐



所有评论(0)