应对嵌入式系统设计中的接口不兼容性
自上世纪 60 年代初 IBM 推出具备 8 位 ASCII 代码存储的计算机,以及 Gordon Bell 设计出可让 PDP 系列计算机在 MCU 和外设之间传输数据的通用异步收发器 (UART) 以来,数字通信协议的数量就在不断增长。UART 的主要特点是简单易用,标准通用,使用寿命长,而且通过编程选项可以提供多通道的灵活性。UART 通过内置的故障检查机制来管理通信通道,而且通过 FIFO 在发送/接收前后对数据进行缓冲, 从而减轻 MCU 的工作负载。
随后,出现了被认为与 UART 具有兄弟关系的 I2C 和 SPI 标准,二者自 1980 年以来都很受青睐。都便于进行设计和故障调试、测试非常迅速、因为信号线较少,因而占用的 PCB 面积也较小。不过由于二者在功能和实施方案方面比较相似,所以在用于特定应用时,工程师们常常不知道如何在这两种通用且高效的接口中做出选择。
以下,我们就不同应用要求给出一些可资借鉴的小窍门:
SPI 与 I2C 不一样,不限于 8 位接口,因此能发送具有任意内容和用途的各类消息。相对于 I2C 而言,SPI 还能支持较高的数据传输速率,而这主要归功于其双工功能。
SPI 接口不需要上拉电阻,因而可降低功耗。
I2C 的线路较少,更加简单,因此桥接到 IC 所需的引脚较少。而与此形成对比的是,SPI 需要 4 条线。
I2C 不需要片选信号线来进行从机确认,具有支持带内寻址的优势。利用 SPI,主机可不用向任何一方发送数据且无需确认。
系统管理总线 (SMBus) 和电源管理总线 (PMBus) 是上世纪 90 年代中期开发的 I2C总线的两种常见衍生标准。二者的数据传输速率、超时和最小时钟速度、电压电平、上拉电阻值和电流大小等都不尽相同。SMBus 为系统和电源管理相关任务提供了控制总线。采用 SMBus 的系统在器件间发送消息,而非断开单条控制线路;而 PMBus 器件则必须使用实施于业界标准 SMBus 串行接口之上的 SMBus Version 1.1。PMBus 协议有助于符合标准的功率转换产品的编程、控制和实时监控[1,2]。
接下来出现的就是我们都颇为熟悉的通用串行总线 (USB) 标准了,自 1995 年以来该标准就取代陈旧的 RS-232 接口而不断受到设计工程师的青睐。这是一种简单而精致的通信技术,能实现多达 126 个互联设备的通信,其采用的协议定义完善,可确保通过统一的标准化接口插槽连接多个外设。此外,它还通过热拔插支持即插即用功能。USB 为四线电缆接口,无需另外的电源线(USB 电缆本身即可供电)。
设计挑战
几乎任何嵌入式系统(如医疗设备、电信设备、销售点系统及其他不同种类应用)的设计都会采用上述各种接口中的一种或多种。此外,每种接口标准都在不断发展,带来更多可供设计人员应用的衍生接口。例如,此前必须的时钟拉伸特性现在已经成为可选特性了,从而可让主从机的 SCL 线保持在低电平,以阻止总线上的数据事务处理(也就是说没有 SCL 驱动器的从机不能拉伸时钟)。再如,大多数微处理器生成的 RS-232 信号电压为 0 至 5 伏特之间的 TTL 水平,这通常需要电平转换器芯片(如 MAX232)将 0 至 5 伏特的电压转换到标准的 RS-232 电压水平(-15V 至 +15V)。如前所述,UART 在 I2C、SPI 和 USB 出现之前一直在串行数据事务处理接口领域占据着主导地位,由于设计人员已经很熟悉 UART 且习惯于以这种标准进行设计工作,从而导致了许多系统只支持 UART 这一种接口。因此,我们现在需要确保 UART 能与其他数据协议相互兼容,这样才能让这种系统与其他系统桥接起来。
设计人员面临的挑战是如何在不改变目前的 CPU 或 ASIC 的情况下解决传统系统和新系统之间的不兼容性问题(比如,这些系统采用了不同的接口)。例如,I2C 和 SPI 之间的桥接问题。I2C 接口的数据控制 (SDA) 和时钟 (SCL) 信号通过桥接到两个专门的 GPIO 引脚提供给外部I2C接口。通过轮询和中断实现固件同步。SPI 主机可通过 Tx 缓冲、Rx 缓冲实施。SPIM 硬件从主出从入 (MOSI) 信号上的主 SPI 器件发送数据,并同时从主入从出 (MISO) 信号上选定的从 SPI 器件接收数据。同样的 SCLK 信号还用于主从数据的发送和接收。I2C 与 SPI 桥接时将I2C 作为从机,将 SPI 作为主机,其从I2C主机接收命令,并根据接收到的命令向 SPI 从机写入或读取数据。
还有一个突出的例子就是 SPI 到 UART 的桥接。UART 接口通过 Rx 线路接收数据。数据通过 SPI 接口发送到 SPI 从机。从 SPI 从机接收到的数据通过 UART 的 Tx 线路发送回 “UART 主机”。
- Linux嵌入式系统开发平台选型探讨(11-09)
- 嵌入式系统中文输入法的设计(03-02)
- 基于MPC755的嵌入式计算机系统设计(05-10)
- WinCE下光电编码器的驱动程序设计(04-12)
- 为什么嵌入式开发人员要使用FPGA(05-13)
- VxWorks几种常用的延时方法介绍(05-16)