GPIO推挽输出和开漏输出详解
open-drain与push-pull】
GPIO的功能,简单说就是可以根据自己的需要去配置为输入或输出。但是在配置GPIO管脚的时候,常会见到两种模式:开漏(open-drain,漏极开路)和推挽(push-pull)。
对此两种模式,有何区别和联系,下面整理了一些资料,来详细解释一下:
图表 1 Push-Pull对比Open-Drain
| Push-Pull推挽输出 | Open-Drain开漏输出 | |
| 原理 |
输出的器件是指输出脚内部集成有一对互补的MOSFET,当Q1导通 、Q2截止时输出高电平;而当Q1截止导通、Q2导通时输出低电平 . 25pt;border:solid #E3EDF5 1.0pt;mso-border-alt: solid #E3EDF5 .75pt;padding:3.0pt 3.0pt 3.0pt 3.0pt'> 输出的器件是指输出脚内部集成有一对互补的MOSFET,当Q1导通、 Q2截止时输出高电平;而当Q1截止导通、Q2导通时输出低电平 |
开漏电路就是指以MOSFET的漏极为输出的电路。指内部输出和地之间有个N沟道的MOSFET(Q1), 这些器件可以用于电平转换的应用。输出电压由Vcc'决定。Vcc'可以大于输入高电平电压VCC(up-translate) 也可以低于输入高电平电压VCC(down-translate)。 |
| 某老外的更加透彻的解释 |
Push-pull输出,实际上内部是用了两个晶体管(transistor), 此处分别称为top transistor和bottom transistor。通过开关对应的晶体管, 输出对应的电平。top transistor打开(bottom transistor关闭), 输出为高电平;bottom transistor打开(top transistor关闭), 输出低电平。Push-pull即能够漏电流(sink current),又可以集电流 (source current)。其也许有,也许没有另外一个状态:高阻抗 (high impedance)状态。除非Push-pull需要支持额外的高阻抗状态 ,否则不需要额外的上拉电阻。 |
Open-drain输出,则是比push-pull少了个top transistor,只有那个bottom transistor。(就像push-pull中的那样) 当bottom transistor关闭,则输出为高电平。此处没法输出高电平,想要输出高电平, 必须外部再接一个上拉电阻(pull-up resistor)。Open-drain只能够漏电流(sink current), 如果想要集电流(source current),则需要加一个上拉电阻。 ��出低电平 |
|
常见的GPIO的模式可以配置为open-drain或push-pull,具体实现上, 常为通过配置对应的寄存器的某些位来配置为open-drain或是push-pull。 当我们通过CPU去设置那些GPIO的配置寄存器的某位(bit)的时候,其GPIO硬件IC内部的实现是, 会去打开或关闭对应的top transistor。相应地,如果设置为了open-d模式的话, 是需要上拉电阻才能实现,也能够输出高电平的。因此,如果硬件内部(internal)本身包含了对应的上拉电阻的话, 此时会去关闭或打开对应的上拉电阻。 如果GPIO硬件IC内部没有对应的上拉电阻的话,那么你的硬件电路中, 必须自己提供对应的外部(external)的上拉电阻。而push-pull输出的优势是速度快, 因为线路(line)是以两种方式驱动的。而带了上拉电阻的线路, 即使以最快的速度去提升电压,最快也要一个常量的R×C的时间。其中R是电阻, C是寄生电容(parasitic capacitance),包括了pin脚的电容和板子的电容。 但是,push-pull相对的缺点是往往需要消耗更多的电流,即功耗相对大。 而open-drain所消耗的电流相对较小,由电阻R所限制,而R不能太小,因为当输出为低电平的时候, 需要sink更低的transistor,这意味着更高的功耗。(此段原文:because the lower transistor has to sink that current when the output is low; that means higher power consumption.)而open-drain的好处之一是, 允许你cshort(?)多个open-drain的电路,公用一个上拉电阻,此种做法称为wired-OR连接,此时可以通过拉低任何一个IO 的pin脚使得输出为低电平。为了输出高电平,则所有的都输出高电平。此种逻辑,就是“线与”的功能,可以不需要额外的门(gate)电路来实现此部分逻辑。 |
||
| 原理图 |
图表 2 push-pull原理图 须外部再接一个上拉电阻(pull-up resistor)。 Open-drain只能够漏电流(sink current),如果想要集电流(source current), 则需要加一个上拉电阻。 ��出低电平
|
图表 3 open-drain原理图 ��外部再接一个上拉电阻(pull-up resistor)。 Open-drain只能够漏电流(sink current),如果想要集电流(source current), 则需要加一个上拉电阻。 ��出低电平
图表 4 open-drain“线与”功能 �需要加一个上拉电阻。 ��出低电平
|
| 优点 |
(1)可以吸电流,也可以贯电流;(2)和开漏输出相比, push-pull的高低电平由IC的电源低定,不能简单的做逻辑操作等。 |
(1) 的Up-translate和down-translate转换 即“线与”功能,任意一个变低后,开漏线上的逻辑就为0了。这也是I2C, SMBus等总线判断总线占用状态的原理。(3)利用 外部电路的驱动能力, 减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流 经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。 (4)可以利用改变上拉电源的电压,改变传输电平:图表 5 open-drain输出电平 的原理 lang=EN-US>R不能太小,因为当输出为低电平的时候,需要sink 更低的transistor,这意味着更高的功耗。(此段原文:because the lower transistor has to sink that current when the output is low; that means higher 允许你cshort(?)多个open-drain的电路,公用一个上拉电阻,此种做法 称为wired-OR连接,此时可以通过拉低任何一个IO的pin脚使得输出为低电平。 为了输出高电平,则所有的都输出高电平。此种逻辑,就是“线与”的功能 ,可以不需要额外的门(gate)电路来实现此部分逻辑。
IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。 这样我们就可以用低电平逻辑控制输出高电平逻辑了。 |
| 缺点 |
一条总线上只能有一个push-pull输出的器件; :"Times New Roman"; color:#444444;mso-ansi-language:EN-US; mso-fareast-language: ZH-CN;mso-bidi-language:AR-SA'>的逻辑电平由电源Vcc1决定, 而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。 |
开漏Pin不连接外部的上拉电阻,则只能输出低电平。当输出电平为低时, N沟道三极管是导通的,这样在Vcc'和GND之间有一个持续的电流流过上 拉电阻R和三极管Q1。这会影响整个系统的功耗。采用较大值的上拉电阻 可以减小电流。但是,但是大的阻值会使输出信号的上升时间变慢。即上拉 电阻R pull-up的阻值 决定了逻辑电平转换的沿的速度 ine-height:115%;font-family: "Verdana","sans-serif"; Roman";mso-bidi-font-family:"Times New Roman"; mso-ansi-language:EN-US;mso-fareast-language:ZH-CN; mso-bidi-language: 开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。 (3)利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时, 驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。 (4)可以利用改变上拉电源的电压,改变传输电平:图表 5 open-drain输出电平的原理 lang=EN-US>R不能太小,因为当输出为低电平的时候,需要sink更低的transistor, 这意味着更高的功耗。(此段原文:because the lower that current when the output is low; that means higher 而open-drain的好处之一是,允许你cshort(?)多个open-drain的电路, 公用一个上拉电阻,此种做法称为wired-OR连接,此时可以通过拉低任何一个 IO的pin脚使得输出为低电平。为了输出高电平,则所有的都输出高电平。此种逻辑, 就是“线与”的功能,可以不需要额外的门(gate)电路来实现此部分逻辑。 |
| 特点 |
在CMOS电路里面应该叫CMOS输出更合适,因为在CMOS里面的push-pull 输出能力不可能做得双极那么大。输出能力看IC内部输出极N管P管的面积。 push-pull是现在CMOS电路里面用得最多的输出级设计方式。 |
|
【open-drain和push-pull的总结】
对于GPIO的模式的设置,在不考虑是否需要额外的上拉电阻的情况下,
是设置为open-drain还是push-pull,说到底,还是个权衡的问题:
如果你想要电平转换速度快的话,那么就选push-pull,但是缺点是功耗相对会大些。
如果你想要功耗低,且同时具有“线与”的功能,那么就用open-drain的模式。
(同时注意GPIO硬件模块内部是否有上拉电阻,如果没有,需要硬件电路上
添加额外的上拉电阻)
正所谓,转换速度与功耗,是鱼与熊掌,二则不可兼得焉。
ze:9.0pt;line-height:115%;font-family:"微软雅黑","sans-serif";
mso-bidi-font-family:"Times New
Roman";color:#444444;mso-ansi-language:EN-US;
mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA'>功能,
任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。
(3)利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,
MOSFET到GND。IC内部仅需很下的栅极驱动电流。(4)可以利用改变上拉电源的电压,
改变传输电平:图表 5 open-drain输出电平的原理
lang=EN-US>R不能太小,因为当输出为低电平的时候,
需要sink更低的transistor,这意味着更高的功耗。(此段原文:because the lower
transistor has to
sink that current when the output is low; that means higher
power consumption.)而open-drain的好处之一是,
允许你cshort(?)多个open-drain的电路,公用一个上拉电阻,此种做法称为wired-OR连接,此时可以通过
拉低任何一个IO的pin脚使得输出为低电平。为了输出高电平,则所有的都输出高电平。此种逻辑,就是“线与”的功能,
可以不需要额外的门(gate)电路来实现此部分逻辑。
GPIO推挽输出和开漏输出详解的更多相关文章
- 单片机I/O口推挽与开漏输出详解(力荐)
推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...
- STM32的GPIO口的输出开漏输出和推挽输出
本文来自cairang45的博客,讲述了STM32的GPIO口的输出开漏输出和推挽输出, 作者博客:http://blog.ednchina.com/cairang45 本文来自: 高校自动化网(Ww ...
- GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- STM32 GPIO 配置之ODR, BSRR, BRR 详解
STM32 GPIO 配置之ODR, BSRR, BRR 详解 用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能 ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android开发之InstanceState详解(转)---利用其保存Activity状态
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- IIC为什么要配置为开漏输出呢?
开漏输出只能输出低电平,类似于三极管的集电极,要输出高电平需要上拉电阻才能输出 当集电极接上拉电阻后,(1)基极为高电平,三极管导通,集电极的电位就会被拉低: (2)基极为低电平,三极管不导通,集电极 ...
- Android开发之MdiaPlayer详解
Android开发之MdiaPlayer详解 MediaPlayer类可用于控制音频/视频文件或流的播放,我曾在<Android开发之基于Service的音乐播放器>一文中介绍过它的使用. ...
- mysql命令 show slave status\G;命令输出详解
show slave status\G; 命令输出详解 mysql> show slave status\G; *************************** . row ******* ...
随机推荐
- Canvas与javaScript特效笔记
第六章 Canvas与javaScript特效笔记 q <canvas>标签的用途 HTML5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强 ...
- 【BZOJ1558】等差数列(线段树)
[BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了 ...
- VLC1.2 播放视频迟滞卡
用libvlc 提供的示例,用1080p播放本事是720p的视频,会有卡住的现象. 后改用32位播放后正常.(R,G,B的掩码需要适当调换.我在ubuntu上编译两个项目,掩码值都需要调换,不知道为什 ...
- centos6.5 开机自动挂载硬盘
1. 查看硬盘信息 输入命令查询 blkid 查找新添加的硬盘的UUID信息,并且拷贝. 2.编辑系统分区表,加入硬盘自动挂载信息 2.1 打开系统分区表 vim /etc/fstab 进入文件编辑模 ...
- 【LOJ#6282】数列分块6
题目大意:给定一个由 N 个数组成的序列,维护两种操作:单点询问,单点插入.N < 100000 题解:在块内维护一个链表,支持动态插入数字,同时对于非随即数据来说,若块的大小过大,需要重构. ...
- Python基本数据类型——元组和集合
元组 tuple tuple和list非常类似,但是tuple一旦初始化就不能修改.元组采用圆括号表示. 例如: >>> tuple = (1,2,3) >>> t ...
- idea tomcat上传图片,无法显示的问题解决
真是浪费时间啊,之前eclipse下的tomcat 去webapps下找就行了,这倒好,idea下根本没有. 我上传的目录建在项目中的static中了,upload文件夹,上传到这里肯定是找不到了的: ...
- kubectl命令自动补全
kubectl这个命令行工具非常重要,与之相关的命令也很多,我们也记不住那么多的命令,而且也会经常写错,所以命令自动补全是非常有必要的,kubectl命令行工具本身就支持complication,只需 ...
- u-boot移植(十三)---代码修改---支持文件系统及补丁制作
一.烧写文件系统 1.1 jffs2烧写 1.下载文件系统:tftp 30000000 fs_mini_mdev.jffs2 2.擦除文件的块:nand erase.part rootfs 3.烧入文 ...
- PCA whitening
对输入数据,维度为2时,想要把数据降维1维: 数据的主方向就是旋转数据的第一维.因此,若想把这数据降到一维,可令: 数据已经进行预处理(零均值),使得每个特征和具有相同的均值和方差. PCA算法将寻找 ...



