关注星标微信官方账号,直达精彩内容
来源:面包板社区
能处理器的GPIO(General Purpose Input and Output)很少有人彻底了解内部结构和各种模式。最近在百度上搜索了很多关于这部分的信息,很多问题都不统一。本文将尽可能IO列出所有涉及的问题,明确解释有明确答案的问题,并提出问题供大家讨论。
概括地说,IO功能模式大致可分为输入、输出和输入输出三类。其中作为基本输入IO,相对简单,主要涉及的知识点是高阻态;作为输出IO,与输入相比,工作模式主要包括开漏(Open Drain)模式和推挽(Push-Pull)模式,这部分涉及更多的知识点;输入输出IO,准双向和双向端口的区别很容易引起怀疑。
以下是每种模式的详细信息。
这里提到的输入IO,指的是只作为输入,没有输出功能。input引脚的要求是高阻(高阻与三态相同)。基本输入电路的类型大致可分为三类:基本输入IO电路、施密特触发输入电路和弱拉输入电路。
首先从最基本的基本输入IO电路如图所示 1所示。
图 1
其中的缓冲器U1是一种具有控制输入端和高阻抗特性的三态缓冲器。一般来说,这种缓冲器具有较高的阻力,相当于物理引脚与内部总线完全隔离,不会影响内部电路。控制输入端的作用是发读Pin状态操作指令。过程如图所示 2所示。
图 2
这种基本电路的一个缺点是在读取外部信号的跳变时会抖动,如下图所示。
图 3
因此,施密特触发输入电路解决了上述抖动问题,施密特触发器后的信号如图所示 4所示。
图 4
对于输入电路还存在另外一个问题,就是当输入引脚悬空的时候,输入端检测到的电平是高还是低?当输入信号没有被驱动,即悬空(Floating)输入引脚上的任何噪音都会改变输入端检测到的电平,如图所示 5所示。
图 5
为了解决这个问题,可以在输入引脚处加一个弱上拉电阻,如图所示 6所示。
图 6
这样,当输入引脚悬空时,就会被悬空RP上拉到高电平,内部总线有一定的状态。
但这种结构存在一些问题。首先,很明显,当输入引脚悬挂时读取1,当输入引脚由高电平驱动时读取1,只有当输入引脚由低电平驱动时读取0。也就是说,阅读1的方法是"读取非零"的方式。
另一个问题是,当外部驱动电路不同时,电路的外部阻力不高,从某种意义上说,它也在向外输出。例如,外部驱动电路如图所示 7.在电路结构中,高电平或低电平可以通过K输出到不同端。
图 7
如果将如图 电路输出低电平,连接到输入引脚,结构如下。
图 8
欧姆定律知道测试点的电平是,所以CPU测量的输入信号较高,而外部驱动电路希望输出的电平较低。错误的原因是该结构的输入电路并不是真正的高阻力,或者该输入IO也在输出,影响外部输入电路。
这种情况也说明了为什么信号前后传输需要输出阻抗小,输入阻抗大。在这个例子中,外围驱动电路的输出阻抗很大,达到100Kohm;输入阻抗不够大,只有10Kohm,所以有问题。如果输入端的输入阻抗真的达到高阻(无限大),如下所示,就不会有问题。
图 9
上述带弱上拉的输入电路,即后续章节中提到的准双向端口。
IO输出电路最重要的两种模式是推拉输出(Push-Pull Output)和开漏输出(Open Drain Output)。
推挽输出(Push-Pull Output)
推拉输出的结构由两个三极管或MOS管道由互补信号控制,两根管道始终保持一根在截止日期,另一根在导通状态。如图所示 10所示。
图 10
推拉输出的最大特点是它能真正输出高电平和低电平,在两种电平下都具有驱动能力。
补充说明:所谓的驱动能力,就是指输出电流的能力。例如,当驱动大负载(即负载内阻越小,负载越大)时IO输出为5V,负载内阻为10ohm,因此,根据欧姆定律,正常情况下负载上的电流可以为0.5A(计算出功率为2.5W)。显然一般的IO不可能有这么大的驱动能力,也就是说,没有办法输出这么大的电流。因此,输出电压将被拉下,达不到标称5V。
当然,如果只是数字信号的传输,理论上下一级输入阻抗最好是高阻,即只需要传输电压,基本没有电流,没有功率,所以不需要很大的驱动力。
对于推拉输出,平时输出高低电流的流向如图所示 11显示。因此,与后面介绍的泄漏输出相比,输出高电平时的驱动能力要强得多。
图 11
但推拉输出的一个缺点是,如果两个推拉输出结构连接在一起,一个输出电平高,即上述MOS导通,下面的MOS关闭时;同时,另一个输出低电平,即上述MOS闭合,下面的MOS导通时。电流将从第一个引脚开始VCC通过上端MOS然后通过第二个引脚的下端MOS直接流向GND。整个通道电阻小,会短路,可能对端口造成损坏。这就是为什么推挽输出无法实现" 线与"的原因。
常说,与推拉输出相对的是泄漏输出。泄漏输出与推拉输出最常见的区别是泄漏输出不能真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成外部驱动。以下是为什么泄漏输出高电平时没有驱动能力,以及与推拉输出的区别。
首先需要介绍一些泄漏输出和开集输出。这两种输出的原理和特性基本相似,区别在于使用MOS管,其中的"漏"指的就是MOS管道漏极;另一个使用三极管,其中"集"指的就是MOS三极管集电极。两者实际上都是与推拉输出相对应的输出模式,因为使用MOS管道的情况很多,经常使用"开漏输出"这个词取代了开漏输出和开集输出。
介绍从开集输出开始,其原理电路结如图所示 12所示。
图 12
图 12左侧的电路是开集(OC)输出最基本的电路输出最基本的电路,NPN三极管导通,Output被拉到GND,输出为低电平;当输入为低电平时,NPN三极管闭合,Output相当于开路(输出高阻)。高电平时输出高电阻(高电阻、三态)floating都是一个意思),此时对外没有驱动力。这是开漏和开集输出的最大特点,如何利用这一特点完成各种功能的后期介绍。虽然该电路已完成开集输出功能,但它将出现input为高,输出为低;input低,输出高。
图 一个三极管用于12右侧的电路。"反相"。当输入为高电平时,第一个三极管导通,第二个三极管的输入端将被拉到GND,因此,第二个三极管关闭,输出电阻高;当输入为低电时,第一个三极管关闭。此时,第二个三极管的输入端将被上拉电阻拉到高电平,因此第二个三极管通,输出将被拉到GND。这样,该电路的输入和输出是相同的。
接下来,介绍泄漏输出电路,如图所示 13.原理与开集输出基本相同,但三极管被取代MOS而已。
图 13
然后说说开泄漏和开集输出的特点和应用。因为两者相似,如果后面没有特别说明,就用开泄漏来表示开泄漏和开集输出电路。
1. 泄漏输出的主要特点是高电平没有驱动能力,需要外部拉电阻才能真正输出高电平,其电路如图所示 14所示
图 14
当MOS管闭合时,开漏输出电路输出高电平,且连接着负载时,电流流向是从外部电源,流经上来电阻RPU,流进负载,最后进入GND。
1)开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。
2)开漏输出的这一特性另一个好处在于可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现电流倒灌,损坏器件。
推挽与开漏输出的区别
图 15
很多处理器的引脚可以设置为双向端口,双向端口的要求就是既可以输出信号,又可以读回外部信号输入。要同时做到这两点从原理上来说有点困难,首先从处理器的开漏输出IO口的内部结构说起,如图 16所示。
图 16
该结构是在图 13的基础上,在三极管之前加入了一个FF,目的是用于控制输出信号的时间。比较常见的一个应用场合是多个IO作为一个总线时,需要总线上的各个引脚同时将数据输出。
对于开漏输出结构,会将FF的输出Q端连接会输入驱动缓冲器,这样的话执行读操作是读的并不是外部引脚的状态,而是自己输出的状态。
但是对图 16的结构稍作修改,如图 17所示时,该结构称为双向开漏IO的结构。所做的改动是将输入驱动缓冲器连接到了PIN上。
图 17
该结构输出为"1"时,T1断开,此时pin对外呈现高阻,作为输入引脚没有任何问题。但是如果该结构输出"0"时,T1导通,此时pin对外短路到地,即无论外部输入什么信号,U2读回的全部是低。所以对于这样的结构,如果需要作为输入引脚使用时,必须给U1输出"1"后才能读取外部引脚数据。
很多文献中还提到了准双向端口,其实准双向端口就是图 17的结构中加了一个上拉电阻,如图 18所示。
图 18
这个结构与图 17相比有以下相同与不同之处:
1) 作为输入引脚使用时,也必须先向U1中写"1",以达到断开T1的目的。所以是否需要提前写"1"并不是双向IO与准双向IO的区别。两者做输入端口时都需要提前写"1"。
2) 双向端口作为输入时是真正的高阻态,而准双向IO作为输入端口时,输入阻抗不为高阻,于是有可能出现如本文图 8所示的问题。
3) 准双向端口读取输入状态,默认为高。也就是判断外部输入信号的方法是"非低则为高"。即该结构只能准确的识别外部的低电平,无法区分悬空和真正的高。于是只要读到的不是0,都认为外部为1。
如果双向端口中的输出部分采用的是推挽输出结构,那么作为输入时必须将上下两个管子全部端口才能成为高阻,作为输入。
在双向端口的讨论中,比较复杂的就是51单片机的P0端口了。这里就详细讨论一下51单片机的P0端口结构和工作原理。
P0端口的内部结构如图 19所示。
图 19
内部结构比较复杂,包括以下这些器件:
1) U1:与门。一个输入连着控制线,另一个输入连接这地址/数据信号。由于与门的特性,当控制线为1时,与门输出与地址/数据信号的电平保持一致;如果控制线为0,则输出恒为。于是控制信号线相当于与门的使能信号。
2) U2:反相器,输出信号为地址/数据信号的反相信号。
3) U3和U6都是具有控制输入端且具有高阻抗特性的三态缓冲器,作用是对于外部呈现高阻态。当控制端使能时可以将外部信号的电平读进数据总线。
4) U4:为锁存器,目的就是控制引脚输出信号的时间。
5) U5:模拟开关,可以控制V2的输入信号是来自锁存器U4的Q非输出还是来自于反相器U2的输出。
6) V1和V2分别是两个MOS管。
了解了各个独立器件之后就开始介绍工作在各个模式下的工作原理:
P0用于地址/数据线时:
在P0作为地址/数据线时,是地址、数据复用总线,P0需要输出地址,同时需要读回数据信号。
当P0需要输出地址信息时,U1的控制信号为0,模拟开关U5接到U2反相器的输出。于是当地址信号线传来的信号为1,与控制线"1"相与之后输出到V1的输入信号为"1",V1截止。地址信号"1"经反相之后,通过模拟开关输出到V2的输入端为"0",V2导通,于是情况如图 20所示,pin输出"0"。
图 20
当地址信号线传来的信号为1,与控制线"1"相与之后输出到V1的输入信号为"0",V1导通。地址信号"0"经反相之后,通过模拟开关输出到V2的输入端为"1",V2截止,于是情况如图 21所示,pin输出"1"。
图 21
于是在作为地址线输出时,V1、V2两个MOS管均使用了,是推挽输出。
当P0在输出低8位地址信息后,将变为数据总线,此时CPU的操作是控制端输出0,模拟开关打到锁存器的Q非端,且向锁存器中打入"1"。于是Q非输出为0,V2截止。同时控制线为0使得与门输出为0,V1截止。由于V1和V2都截止,所以此时pin对外完全呈现高阻,作为输入端口,外部数据通过U6进入内部总线,情况如图 22所示。(相当于将推挽输出的两个MOS管全部断开了)此时由于对外呈现高阻,所以是真正的输入引脚。这就解释了为什么说P0是真正的双线端口。
图 22
在P0作为普通IO并作为输出时,控制信号为0,使V1始终处于截止状态。模拟开关连接到Q非输出,当作为输出时,锁存器的输入端直接输入0或者1,Q非将反相信号输入到V2的输入端。即当输出"0"时,V2输入端为"1",V2导通,pin输出"0";当输出"1"时,V2输入端为"0",V2截止,pin输出高阻的0。即当P0工作在普通IO模式下,输出为开漏输出,且内部没有上拉电阻。
在P0作为普通IO并作为输入时,控制信号为0,使V1始终处于截止状态。模拟开关连接到Q非输出,且CPU自动向锁存器输入端写1,则V2输入端为0,V2截止。与之前在作为地址/数据线,作为输入时一样,也是两个MOS管全部断开,pin直接连接到U6,对外呈现高阻。于是也是真正的输入引脚。
综上P0无论工作在哪种模式下都是真正的双端口IO。
51单片机的其他三个端口的内部结构如图 23所示,与P0相比简单了很多,没有了顶部的MOS管,也没有了地址/数据信号的选项。作为输出时是带有上拉电阻的的开漏输出,作为输入时是有上拉电阻存在的,于是输入端口对外不是高阻。这就解释了为什么P1~P3只能是准双向端口。
图 23
这种情况的发生也说明了:信号前后两级传递,为什么需要输出阻抗小,输入阻抗大的原因。在这个例子中,外围驱动电路的输出阻抗很大,达到了100Kohm;而输入端的阻抗又不够大,只有10Kohm,于是就出现了问题。如果输入端的输入阻抗真正做到高阻(无穷大),如下所示,就不会出现问题。哈哈。一开始认为作者这段话错了。仔细又思考下。作者应该是对的。信号传递确实需要发送信号的设备的输出阻抗小,接收设备的输入阻抗大。但在作者的论述中,所谓的"外围驱动电路"是作为发送信号的设备,而"单片机输入端"是作为接收信号的设备。所以需要外围的设备输出阻抗小(这个例子达到了100k,相比10k属于大了),单片机的输入阻抗又不够大(没有达到高阻抗,只有10k),于是出现了传输错误。我犯的错误是看到“外围设备”就认为是接收设备,看到“单片机的输入端”就认为是发送设备。
关注我的微信公众号,回复“加群”按规则加入技术交流群。
关注程序员编程基地,回复“pdf”获取程序员必读经典书单,一起编程一起进阶。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。