通过应用外部器件解决微控制器 I/O 扩展问题

作者:Jacob Beningo

投稿人:DigiKey 北美编辑

设计人员经常面临两个微控制器 I/O 问题。第一个问题是,最适合应用的微控制器不具备合适的 I/O 能力组合。第二个问题是,已推出的产品线需要增加 I/O。

出现第一个问题时,开发人员经常不得不购买更昂贵且功能更强的微控制器。而面对第二个问题时,切换到新的微控制器以及随之而来的软件移植所需的成本及时间可能会多得令人难以承受。

要同时解决这两个问题,一种潜在的解决方案是使用外部 I/O 扩展器件,这种器件通常可连接到微控制器的 SPI 或 I2C 总线。这样就能避免在引脚数以及可能的性能和封装方面,对微控制器做出过多的规定。同时,这种方法还能让产品设计具有前瞻性,以应对功能蠕变、目标市场扩张、客户功能请求和微控制器选择不当(这种情况时有发生)等问题。

本文将讨论典型的微控制器 I/O 要求,并介绍一些合适的外部扩展器件,然后说明如何使用这些片外资源来增加通用输入和输出、存储器存储、脉冲宽度调制 (PWM) 甚至看门狗定时器功能。

选择扩展接口

微控制器配有多个不同的片载外设接口,可用于与外部设备通信。根据微控制器的不同,这些接口可能包括(仅列举几例):

  • 串行外设接口 (SPI)
  • 内部集成电路 (I2C) 总线
  • 通用串行总线 (USB)
  • 通用异步接收器/发送器 (UART)
  • 控制器区域网络 (CAN)
  • Wi-Fi

其中最适合与外部扩展设备通信的接口是 I2C 和 SPI。

I2C 是一种两线总线,传统的运行速率为 100 千位/秒 (kb/s) 或 400 kb/s,但也有一些可支持 1 Mb/s 或更快速度的高速设备。其中一条线是专用的时钟引脚,而另一条线则用于主设备和从设备之间的双向通信。通常情况下,微控制器充当主设备,外部设备充当从设备。从设备可使用 7 位或 10 位寻址方案进行寻址。

SPI 是一种三线总线接口,运行速率介于 1 Mb/s和 12 Mb/s 之间。SPI 总线配有专用的主设备输出数据线、从设备输出数据线和时钟。微控制器同样配置为主设备,使用“从设备选择”线与从设备通信。每个与微控制器连接的从设备都需要一个专用输出引脚,用于选择它进行通信。不难想象,如果开发人员有很多想要连接的外部设备,他们可能很快就会用尽 I/O 线,然后选择从设备。

例如,如果开发人员使用 STMicroelectronicsSTM32L011D4P7,可供使用的 I/O 线共有 11 条(图 1)。仅 SPI 数据和时钟就需要三条 I/O 线,剩下的八条线除了与从设备通信,还需要执行系统所需的所有其他功能。虽然这完全可以满足许多应用的要求,但某些时候,设计人员仍可能需要对 I/O 进行扩展。

STMicroelectronics 的 STM32L011D4P7 Arm® Cortex®-M7 处理器图片

图 1:STM32L011D4P7 是一款 Arm® Cortex®-M0+ 处理器,其 I/O 引脚数限制为 11 个。(图片来源:STMicroelectronics)

一般情况下,经验法则非常简单:添加以下功能时使用 I2C 总线:

  • I/O
  • PWM
  • EEPROM
  • 看门狗定时器

SPI 总线应该用于增加诸如为 SD 卡提供高速存储器访问等功能。

扩展通用 I/O

有相当多的集成电路可支持通过 I2C 接口来扩展输入和输出。以下是一些有趣的示例:

PCA8574 是一款特别有趣的器件,因为它只包含一个用于执行输入和输出的寄存器。单个寄存器极大地精简了配置器件以及读写引脚所需的软件数量(图 2)。微控制器通过 I2C 与 PCA8574 通信,并根据 A0 至 A2 引脚的配置方式对此器件进行寻址。这一特性增加了设计的灵活性,因此开发人员可以为 PCA8574 选择从设备地址,并且可在一个设计中使用多个从设备地址。

NXP 的 PCA8574 8 位 I/O I2C 扩展器示意图

图 2:NXP 的 PCA8574 是一款准双向 8 位 I/O I2C 扩展器。该扩展器只有一个 I2C 寄存器可供读写,从而在其引脚上执行 I/O 功能,因此是一款非常简单、精巧的器件。(图片来源:NXP Semiconductors)

默认情况下,P0 至 P7 在上电时配置为输入。读取单个内部寄存器时将为器件上的各个引脚指定状态,无论该引脚配置为输入还是输出。PCA8574 允许引脚同时用作输入和输出,因此对寄存器的写入也会设置相应的位输出。

输出驱动由微弱的内部电阻器上拉,该电阻器很容易因输入值而过载。如果任何一个输入状态发生变化,INT 引脚将切换为低电平,让微控制器知道输入状态发生了变化。然后,微控制器可以调用 I2C 来读取新值。

扩展 PWM

PWM 扩展器是一款非常有用的扩展器件。该器件在驱动 LED 时特别有用。当微控制器未执行任何操作时,可将其设为休眠模式,此时 PWM 扩展器可负责驱动 LED 状态。

关于如何使用 PWM 扩展器的完美范例经常出现在 RGB 按钮电路中,该电路可使用 E-SwitchPV6F240SSG RGB 按钮或 Schurter Electronic Components3-101-399 SPST RGB 按钮(图 3)。

Schurter 的 RGB 按钮图片

图 3:Schurter 的 RGB 按钮在按钮周围配有红绿蓝 LED,可允许开发人员创建亮色图案。这些类型的器件非常适合由 PWM 扩展芯片进行驱动。(图片来源:Schurter)

Schurter 的 RGB 按钮在 SPST 按钮周围配有红绿蓝 LED,可允许开发人员创建亮色图案。这些类型的应用非常适合 PWM 扩展芯片。

Maxim IntegratedMAX7315 便是一款适用于 I2C 接口的 PWM 扩展芯片。MAX7315 配有 8 个 PWM 端口,并具有 LED 强度控制功能,这样可以轻松涵盖驱动 RGB 开关所需的 3 个通道,使得单个器件能够驱动若干开关和一些独立的 LED。此外,MAX7315 还有第 9 个端口,可以用作转换检测中断或通用输出。

MAX7315 I2C 接口比 NXP 的 PCA8574 稍微复杂一些,因为它包含多个寄存器。因此,开发人员必须寻址从设备,提供其有兴趣读取或写入的存储器地址,然后执行写入或读取。MAX7315 的存储器映射如图 4 所示。

寄存器 地址代码(十六进制) 自动增量地址
Rad 输入端口 0x00 0x00(无变化)
闪烁相位 0 输出 0x01 0x01(无变化)
端口配置 0x03 0x03(无变化)
闪烁相位 1 输出 0x09 0x09(无变化)
主设备,O8 强度 0x0E 0x0E(无变化)
配置 0x0F 0x0F(无变化)
输出强度 P1、P0 0x10 0x11
输出强度 P3、P2 0x11 0x12
输出强度 P5、P4 0x12 0x13
输出强度 P7、P6 0x13 0x10

图 4:MAX7315 PWM 控制器配有 8 个输出端口,其中包括 LED 强度功能。该器件的寄存器映射非常简单,允许轻松访问高级 PWM 功能。(图片来源:Maxim Integrated)

MAX7315 的寄存器映射非常简单,允许轻松访问高级 PWM 功能。

配有 WDT、EEPROM 和 PWM 的组合型扩展器

如图所示,I2C 总线 I/O 扩展器在用作独立器件时可能非常强大。也就是说,这种扩展器只包含诸如 I/O 或 PWM 等特定功能。例如 Cypress Semiconductor 的 CY8C9520A 多端口 I/O 扩展器,这类扩展器在一个 IC 封装中包含了多个外设扩展。CY8C9520A 共有三种扩展形式:20 位、40 位或 60 位扩展。然后可将这些引脚配置为输入、输出或 PWM(图 5)。

Cypress Semiconductor 的 CY8C9520 示意图

图 5:Cypress Semiconductor 的 CY8C9520 是一款配有 EEPROM 的 20 位、40 位或 60 位 I/O 扩展器。该扩展器允许将扩展引脚配置为输入、输出或 PWM。(图片来源:Cypress Semiconductor)

除 I/O 扩展外,CY8C9520 还配有 EEPROM,可用于存储重要的应用设置(如序列号)以及其他重要的配置参数。

仔细查看图 5,您会看到 GPort 2 上的 WD6 引脚。该引脚是一个看门狗定时器输出引脚,可在微控制器无法通信时用于复位微控制器,以及操控 CY8C9529 看门狗。看门狗设置是完全可配置的,并且可用于为应用程序代码增加额外的稳健性。

扩展微控制器功能的技巧和诀窍

目前有许多技术可帮助扩展微控制器的功能。以下是一些有帮助的技巧和诀窍:

  • 使用 I2C 连接外部设备。该接口只需两个引脚,并且支持多个从设备。
  • 在将某个零件设计成硬件之前,先购买一个开发板,或将芯片焊接到扩展板上,测试其能否满足您的系统需求。
  • 使用 I2C 总线工具与扩展器件连接,并了解其工作情况,这样可大幅提升软件的开发速度。
  • 在软件开发过程中,使用总线分析器监视与外部设备的通信,最大限度缩短调试时间。
  • 如果可能,选择配有外部看门狗定时器的器件,这可以作为一种工具,为系统设计增加稳健性。
  • 在连接片外存储器获取数据(非配置数据)时,请使用 SPI 等高速接口。
  • 如果设备返回否定应答 (NAK) 信号,或者总线受到拖累,请确保微控制器的 I2C 驱动程序可以处理此类问题。对于这些驱动程序来说,在收到意外响应时忽略错误并进入无限循环的情况并不罕见。

结论

当设计进展到微控制器无法继续提供更多 I/O 时,开发人员无需将现有的设计推倒重来。相反,他们可以使用外设芯片,以便为系统增加额外的功能。

 

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Jacob Beningo

Jacob Beningo 是一位嵌入式软件顾问,目前与十几个国家的客户保持合作,通过帮助客户改善产品质量、降低成本和加快上市时间来大幅改变他们的业务。Jacob 先后发表了 200 多篇关于嵌入式软件开发技术的文章,是一位广受欢迎的演讲者和技术培训师。他拥有三个学位,其中包括密歇根大学的工程硕士学位。如有需要,欢迎随时通过 jacob@beningo.com 与其联系,也可访问其网站 www.beningo.com,并订阅其月度 Embedded Bytes Newsletter

关于此出版商

DigiKey 北美编辑