前两天,开始我们乐创客第一块开发板的设计,当我在进行电路设计时,我发现一些电路设计软件的使用,一些电路设计的方案,一些创新的想法,一些元器件的选型这些都是可以记录成文,并且分享出来一起讨论的。因此从本节文字开始,正式开启电路【电路设计笔记】的更新。当然,这里的部分电路是我用了非常多年的成熟电路,一些电路是我临时创新想出的未经过验证的电路,这些没有被验证的电路我会指出来,大家阅读时如果发现有问题也希望不吝指出。

 

世界上最尴尬的事情是什么?这个我真不知道。但是做电子系统时最尴尬的事莫过于想要增加一个新的功能却发现单片机的引脚不够。

 

在我们日常的电路设计时,除了最基本的产品需求要满足之外,还需要考虑的就是整个电路设计的成本,在很多公司中,成熟产品的 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 扩展芯片

专用的 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 口扩展的方案,孰优孰劣,一目了然。