概述
嵌入式系统经常需要集成电路之间的通信。举个例子,一个数字温度传感器向主控芯片报告房间的环境温度。通常情况,这种数据会通过一个串行接口来传输。
那么,什么是串行接口? 在最基本的角度来说,串行接口是一个移位寄存器,每次将数据移入/移出一个比特。 下面的插图显示了移位寄存器的数据先通过并行方式加载,比如内存拷贝。在并行加载完成后,数据被逐位移出,从最小有效位开始。
那么,为什么我们要使用一个串行接口而不是并行接口呢? 如果我们想用并行接口传输一个32位的值,我们需要在微处理器上至少有32个引脚。并行总线的速度非常快,但它们需要大量的外部引脚,只为此单独接口使用的引脚。在设备上添加额外的引脚会增加微处理器的材料成本和物理尺寸。
使用串行接口的动机是,一个串行接口只由几个引脚组成。 使用少量的引脚,我们可以传输任何大小的数据。 如果我们需要的数据是32位而不是8位,我们只需要增加时钟周期。 减少引脚的数量也使印刷电路板(PCB/printed circuit board)的开发变得更加容易,因为需要在设备之间布线的引脚少得多。
我们在这里要研究的串行接口被称为UART。 术语UART是指通用异步接收/发送器(Universal Asynchronous Receiver/Transmitter)。 UART通常用于与没有图形显示功能的设备连接。 UART可以向终端程序提供输入/输出功能,使用户能够监控状态并提供输入功能。
UART基本构造(Infrastructure)
-
需要的引脚(Pin)
UART接口由两个引脚组成:Rx和Tx引脚。 Rx引脚用于接收数据。 Tx引脚用于传输数据。 当两个设备使用UART连接时,一个设备的Rx引脚与第二个设备的Tx引脚相连。
-
通用寄存器(Common Registers)
Rx和Tx引脚通常连接到独立的移位寄存器(一个用于移出数据,一个用于移入数据)。 两个独立的移位寄存器允许UART在同一时间发送和接收数据。
除了移位寄存器外,还有一个或多个状态寄存器。 软件通过检查状态寄存器来确定发送移位寄存器何时为空。 当发送寄存器为空时,下一个字节的数据可以被加载到发送移位寄存器中。 状态寄存器也会有一个状态位,指示何时收到新的数据字节。 另一方面,软件可以读取接收寄存器,并触发删除数据操作,并允许下一字节的数据被移入。
UART可以有额外的寄存器,允许软件对UART的行为进行配置。 通过软件可以设置接收发送数据的速率,还有所传输数据的格式。比如设置传输速度的波特率,每字节数据是否包含校验位。
数据包结构(Packet Structure)
UART的关键特征之一是其名称中的 "A"。 A "代表异步的意思。 UART在本质上是异步的,因为设备之间没有共享的时钟。 相反,两个设备必须就正在发送的数据的结构和数据的发送速度达成一致。 这种协议允许UART接口对数据线进行过度采样(over sample),并将原始数据重新构建为一个数据包。 我们将研究构成UART数据包的三个特性。
-
数据速率(Data Rate)
为了在两个UART之间正确发送数据,两个UART必须被配置为以相同的数据速率接收和发送数据。 这通常被称为UART的波特率(baud rate)。 通过设置相同的波特率,UART的内部状态机可以设置移位寄存器工作的合适速率。 常见的数据速率包括9600和115200波特,但一些UART支持更高的数据速率,可达几兆比特/秒。比如使用CC2564c的蓝牙芯片,上面的UART,带硬件流控的,设置的波特率可达3Mbit/s。
-
奇偶校验(Parity)
在某些情况下,数据包可能包含一个奇偶校验位。 奇偶校验位被接收设备用来确定在传输过程中是否发生了任何数据损坏。 如果一个数据包被配置为偶数奇偶校验,包括奇偶校验位在内的1的总数应该是偶数。 如果一个数据包被配置为奇数奇偶校验,那么包括奇偶校验位在内的1的总数应该是一个奇数。
-
数据帧(Data Framing)
为了使微处理器能够检测到数据开始发送,我们需要定义没有数据被发送时,Rx/Tx线的行为。 在大多数情况下,当没有数据被发送时,Rx/Tx线都将被驱动为高电平。 当一个设备发送数据时,发送过程的开始是一个起始位(start bit)。 UART将拉低Tx线使之处于低电平,持续时间是一个时钟周期,根据数据传输速率而定的时钟周期,表明数据的传输即将开始。
在起始位之后,数据根据定义好的数据传输速率逐位移出(shifted out),直到所有的数据传输完毕。 UARTs首先传输数据的最小有效位。 一旦所有数据传输完毕,就会发送奇偶校验位(此位可选,两边设备的配置一样即可),然后是停止位。 UART通过拉高Tx线,保持高电平达1个周期来产生一个停止位,这个周期根据数据传输速率而定。许多UART可以被配置为产生1或2个停止位。
下图展示了如何使用偶数和奇数奇偶校验来传输数值0x71。
发送的数据如果没有起始位或停止位,就会出现成帧错误。 UART可能会简单地丢弃这些数据,或者更有可能通过在状态寄存器中设置一个状态位来显示一个错误情况。 在大多数情况下,如果有大量的电磁干扰使传输中的数据失效,就会发生成帧错误。
8N1
UARTs最常见的配置之一被称为8N1。 这代表了8个数据位,没有奇偶校验位,和一个停止位。 8N1每传输10个比特,就会传输8个比特的数据。 增加一个奇偶校验位和额外的停止位会增加每个数据包的开销,并降低实际数据的总体吞吐量。
参考:
1,UART basics
UART Basics – ECE353: Introduction to Microprocessor Systems – UW–Madison