世界上最尴尬的事情是什么?这个我真不知道。但是做电子系统时最尴尬的事莫过于想要增加一个新的功能却发现单片机的引脚不够。
在我们日常的电路设计时,除了最基本的产品需求要满足之外,还需要考虑的就是整个电路设计的成本,在很多公司中,成熟产品的cost down(成本降低)也基本上是个日常日程。产品成本的cost down比起供应链端哥们的努力,设计源头的cost down显然更加直接简单。一个好的电子工程师并不是能设计出多么复杂稳定的电路,而是可以利用最简单最便宜的方案来满足复杂的产品设计要求。
在我们做单片机选型的时候,往往会发现这样一个规律,同一个core的单片机选型时,单片机的引脚越多,其单价就越贵。以STM32为例,LQFP32封装的价格是最便宜的,往上依次是LQFP48封装,LQFP64封装,LQFP100封装,LQFP144封装。在我们选型时,往往单片机的内部资源LQFP48封装的引脚就能满足我们的需求,正当我们决定选用这个芯片时,发现正好少了几个用作IO口的引脚,因此不得不选用更高一级别的LQFP64封装,正由于这个原因,电路的成本增加了好几块RMB。其实解决单片机IO口不够用的情况,除了选用引脚更多的芯片之外,还有一个简单而便宜的方法,那就是IO口扩展。
单片机的IO口扩展一般有以下三种方案。
串转并芯片来扩展单片机的IO可能是成本最低的IO扩展解决方案,而且对于单片机来说可以牺牲最少的端口来获得最多的端口扩展收益。串转并方案所利用的芯片就是我们日常所谓的“移位寄存器”芯片。由于移位寄存器是一种单向器件,因此需要利用只能做串行数据转并行数据的移位输出寄存器芯片和只能做并行数据转串行数据的移位输入寄存器芯片来完成这个单片机IO口的双向传输方案。
首先来讨论单片机输出口的扩展方案。单片机输出口扩展需要利用串行数据转并行数据的移位寄存器芯片,最常用的芯片是74HC595。
74HC595是一个8位串行输入、平行输出的位移缓存器:平行输出为三态输出。我们从它的逻辑框图中可以看到,这个74HC595芯片内部分成三个部分:
图中红色框选出的是移位寄存器单元,这个单元的功能为SER引脚上的数据会在每个SCK上升沿到来时被移位进入移位寄存器。
图中蓝色部分框选出的是数据暂存器单元,其实这里就是8个并联的D触发器,这8个D触发器的输出分别和其对应的前级移位寄存器输出端相连,在每个RCK上升沿到来时就将数据锁存住。
图中黄色框选出的是输出门控电路,这是8个三态门组成的电路,当G非为低电平时,三态门被开启,输出有效,反之芯片输出为高阻状态。
最后一个Q’H引脚,是将串行数据输出的,比如当SCK第8个脉冲到来时,8个移位寄存器正好可以存储一个字节的数据,但是当第9个脉冲到来时,最先来的那个SER上的数据会被最晚到来的第9个脉冲顶出来,顶出来的那一位数据就会出现在Q’H引脚上面,这个引脚的主要目的是用来做74HC595芯片扩展的。
接着来讨论单片机输入口的扩展方案。单片机输入口扩展需要利用并行数据转串行数据的移位寄存器芯片,最常用的芯片是74HC165。
74HC165是8位并行读取或串行输入移位寄存器,可在末级得到互补的串行输出(Q7和!Q7),当异步并行读取引脚(!PL)输入为低时,从D0到D7口输入的并行数据将被读取进寄存器内。而当异步并行读取引脚为高时,数据将在每个时钟脉冲的上升沿从 引脚串行进入寄存器并将现有数据右移一位( 以此类推)。利用这种特性,只要把Q7输出绑定到下一级的输入,即可实现移位寄存器位数的扩展。
74HC165的时钟输入是一个“门控与”结构,CP(时钟脉冲)和CE(时钟允许)共同产生有效时钟输入。只有在CE(时钟允许)为低时,CP(时钟脉冲)才有效。
应当注意的是,在PL上升沿到来前,CP或者CE必须置高,以防止数据在PL的状态尚未稳定时发生移位。
以上就是关于移位寄存器用来扩展单片机IO口的,但是移位寄存器扩展出来的单片机IO口只能用作一些低速设备的驱动扩展,如按键,LED等,无法去驱动一些高速的设备,因为串行数据转并行数据都是通过循环一位一位地移出来的,因此速度都是有限的。
专用的IO扩展芯片很多,这里以NXP的PCF8574为例。
PCF8574是一种硅CMOS电路。它通过双线双向总线(I2C)为大多数微控制器系列提供通用远程I/O扩展。
该器件由8位准双向端口和I2C总线接口组成。PCF8574具有低电流消耗,包括锁存输出,具有高电流驱动能力,可直接驱动LED。它还具有中断线(INT),可以连接到微控制器的中断逻辑。通过在这条线上发送一个中断信号,远程I/O可以通知微控制器其端口上是否有传入数据,而无需通过I2C总线进行通信。这意味着PCF8574仍然是一个简单的从设备。PCF8674具有以下特性:
•工作电源电压2.5至6 V
•待机电流消耗低,最大10µA
•I2C到并行端口扩展器
•漏极开路中断输出
•I2C总线的8位并行I/O端口
•兼容大多数微控制器
•锁定输出,具有高电流驱动能力,可直接驱动LED
•通过3个硬件地址引脚寻址,最多可使用8个设备(PCF8574A最多可使用16个)
•DIP16或节省空间的SO16或SSOP20封装。
说到专用的IO扩展芯片,其大致功能和移位寄存器相似,细节上还是有很多不同,当然专用的IO扩展芯片功能更加强大,比如PCF8574的IO口能同时支持输入输出功能。这些细致的功能用起来虽然更加顺手,方便,但是跟其昂贵的售价比起来,这些功能显然性价比太低。
以上就是两种单片机IO口扩展的方案,孰优孰劣,一目了然。