点击阅读原文,获取更多优质内容,请关注公众号--通信射频老兵:一文讲透串行通信---UART基础
通用异步收发传输器,也就是我们常说的UART模块,是一种串行通信外设,它允许用户将其与其他兼容UART的设备进行连接。UART模块具有高度的可编程性,它提供了诸如带过采样功能的可编程波特率发生器、可配置的数据位大小(5位、6位、7位或8位)等特性。对于单主多从总线方案,还实现了第9位。
其他特性,比如奇偶校验位的生成和检测、线路中断检测以及硬件流量控制,在大多数微控制器的UART中都是标准配置。所有的UART都会有一个单独的数据缓冲区,用于发送和接收数据。有些UART可能会包含固定大小或可编程大小的先进先出(FIFO)缓冲区,以减轻CPU中断服务的负载。
从功能层面来看,UART有三个主要特性,即发送器、接收器和时钟发生器。发送器有一个发送缓冲区和移位寄存器,用于执行并行到串行的转换。一个字节被加载到UART的发送缓冲区中,然后通过移位寄存器一位一位地进行转换和发送。
发送控制逻辑输出串行比特流,根据控制寄存器中的程序配置,该比特流以起始位开头,接着是数据位、奇偶校验位和停止位。当发送缓冲区为空时,发送逻辑也会通知CPU,并且至少会有一个发送数据缓冲寄存器。其他的可能会提供多个缓冲区,带有固定或可编程的阈值,也就是我们所说的FIFO。这些FIFO缓冲区有助于减轻CPU中断服务的负载。
接收器也有一个移位寄存器和一个接收缓冲区,在接收器控制逻辑检测到有效的起始位后,对接收到的比特流执行串行到并行的转换。溢出、奇偶校验、帧错误检查以及线路中断检测也由控制逻辑来执行。在检测到停止位后,这些位会被重新组合成一个数据字节,并放入接收缓冲区中。当接收到数据时,控制逻辑会通知CPU。
发送和接收移位寄存器以及逻辑的时钟定时由UART的时钟发生器提供。时钟发生器接收一个输入的系统时钟,并生成两个输出时钟,一个时钟用于发送部分,通常被称为位时钟或波特率时钟,而一个更快的时钟则被接收器用于位采样。
发送器和接收器模块也有控制逻辑,它为每个模块以及UART所支持的各种协议提供状态信息和控制,这里就不详细介绍这些协议了。
UART的发送模块负责将一个数据字节转换为比特,并将每个比特从UART的发送数据引脚(TXD)串行发送出去。这一功能通过一个缓冲区、串行移位寄存器以及发送状态和控制逻辑来实现。
UART的缓冲区大小可以是一个数据字节,也可以是先进先出(FIFO)队列中的多个数据字节,具体取决于UART本身。该缓冲区可减少CPU管理UART发送缓冲区所需的时间。发送控制逻辑负责管理每个数据字节向UART移位寄存器的移动。数据的并行到串行转换是通过将数据逐位从TXD引脚移出实现的。
要发送一个字节,CPU会检查发送缓冲区标志,查看缓冲区是否为空。如果发送缓冲区为空,CPU会将一个字节写入发送缓冲区。如果UART有多个缓冲区或采用FIFO结构,CPU可以持续加载额外的字节,直至FIFO被填满。
若移位寄存器为空,缓冲区中的第一个字节会立即从缓冲区转移到移位寄存器中。控制逻辑会启用位时钟,开始将比特从发送引脚输出。当移位寄存器中的最后一位被移出后,缓冲区或FIFO中的下一个字节会自动转移到移位寄存器中,如此循环往复。
和发送器一样,UART的接收模块也有一个串行移位寄存器、接收缓冲区和控制逻辑,其职责是将传入的串行比特流组合成一个并行的数据字节,以便CPU读取。这个过程始于将传入的比特移入移位寄存器。
由于UART的异步特性,接收模块会对接收数据引脚(RXD)进行采样,以此判断何时有比特到达,并准确判定该比特是0还是1。接收逻辑能够通过检测比特流中第一个比特(即起始位)的下降沿,与每个新比特流的起始同步。
当移位寄存器被填满时,这些比特会被转移到接收器的输入缓冲区或FIFO中,同时设置一个标志。CPU可以监控接收缓冲区标志,从而知晓何时从接收缓冲区读取数据。
时钟发生器的时钟源通常来自系统时钟。借助分频器和过采样特性,UART的时钟发生器会生成两个时钟,一个供发送器使用,称为比特率时钟或波特时钟;另一个供接收器使用,在文中,我们称之为采样时钟。
虽然发送器以比特率时钟频率运行,但接收器需要更高的时钟频率,通常是比特率时钟频率的数倍。接收器逻辑利用这个更高频率的采样时钟,通过在每个比特周期内多次采样逻辑电平,来确定到达RXD引脚的每个比特的值。
如上图所示,接收器需要一个高于发送时钟频率的时钟频率来生成采样时钟。这个采样时钟通常是发送时钟的3倍、8倍或16倍。
这个更高频率的采样时钟使接收器的移位寄存器和控制逻辑能够在一个比特时钟周期内对RXD引脚上的输入电压电平进行多次采样。接收器利用这些采样结果来判断输入的比特是有效的1还是0。
在此,我们给出一个时序图示例,展示了16倍过采样时钟与以波特时钟频率到达RXD引脚的接收比特之间的关系。此示例中涉及的概念同样适用于3倍和8倍过采样情况。
在解释时序之前,要明白对于每个发送的字节,数据位之前总是有一个单独的起始位。起始位表现为RXD引脚上的高到低的跳变,它标志着一个 UART数据包的开始。
在接收数据包的间隙,接收器会在每个采样时钟周期持续评估RXD引脚上的电压电平,等待检测起始位的下降沿。当检测到RXD引脚的下降沿时,接收器的采样时钟就会与UART数据包同步。每次接收到数据包都会进行这种同步,所以这为发送器和接收器的同步提供了一种简单的方法。
接下来的操作被称为“多数原则”,不同的UART可能会有所不同。但通常情况下,接收器会在第7、第8和第9个采样时钟周期对RXD引脚进行采样。如果在这三次采样中,RXD引脚都为低电平,那么这个比特就被判定为0。
另一方面,如果在这三次采样中,RXD引脚都为高电平,那么这个比特就被判定为1。需要注意的是,在某些UART中,起始位可能会被采样多次而非三次,并且可能会在比特周期的更早阶段进行采样。
那么,使用哪种过采样率最好呢?这取决于具体情况。不过要考虑到,使用16倍过采样时,功耗可能会比使用8倍或3倍过采样时更高。使用16倍采样时钟时,还有一个需要考虑的因素,即采样部分的比特边沿与实际接收到的边沿之间存在1/16的时间差。这意味着在比特周期的1/16(即6%)处就可能已经出现误差了;而使用8倍采样时钟时,这个误差是1/8(即12.5%)。
一般来说,与使用8倍过采样相比,使用16倍过采样时,不同UART之间的波特率频率差异可以更宽松一些。使用8倍过采样时,不同UART之间的波特率差异必须控制得更严格。由于任意两个UART的系统时钟源存在差异,将UART配置为以相同的波特率频率运行并不能保证它们的频率完全相同。
实际上,在大多数情况下,频率永远不会完全相同,尤其是考虑到一个或两个UART的频率可能会随温度变化,或者可能会引入一些时钟抖动。如果这些差异较小,是很容易被容忍的,因为接收器会在每个比特的中点附近进行采样。
在这部分内容中,我们了解了如何配置UART的分频器和过采样特性,以实现所需的传输波特率和接收器采样频率。如前文所述,分频器的目的是降低输入时钟频率,以支持各种较低的发送波特率。
UART的分频器通常由两个除数组成。一个是整数除数,我们称之为整数波特率除数(IBRD);另一个是小数除数,即小数波特率除数(FBRD)。它们共同构成了UART的除数,即波特率除数(BRD)。根据输入频率和除数的组合,通常可以达到所需的波特率。
某些输入时钟和除数的组合可能无法产生所需的确切波特率。除数的小数部分用于帮助实现非常精确的时钟频率,而仅使用整数除数是无法做到这一点的。
计算波特率除数很简单。将UART的输入时钟除以过采样配置值(16、8或3)与目标波特率的乘积。让我们来看一个例子,假设我们希望以16倍过采样、输入时钟频率为20Mhz的条件实现19200bps。
根据所示的公式,计算出的波特率除数是65.104。因此,整数部分65就是IBRD的值。但小数部分0.104必须转换为可以在FBRD中使用的格式。有关如何处理小数格式的详细信息,请参考你所使用的UART的文档。
在最后这部分内容中,我们来看看UART通常是如何相互连接的。大多数 UART应用支持两线接口。发送数据引脚(TXD)用于发送数据,而接收数据引脚(RXD)用于接收数据。为了让两个UART进行通信,两个UART的TXD引脚都必须连接到另一个UART的RXD引脚,就像这里的图示一样。首先要检查TXD和RXD引脚是否与通用输入输出(GPIO)引脚或其他功能复用,如果有必要,相应地配置这些引脚。
在这种配置下,UART可以一次发送和接收一个数据,这被称为半双工通信;也可以同时发送和接收数据,这被称为全双工通信。两个UART 必须使用相同的频率或速率来发送和接收数据,这个频率或速率就称为波特率。
一些UART还可以支持四线接口,通过另外两个引脚 —— 请求发送引脚(RTS)和清除发送引脚(CTS)来进行流量控制。RTS输出信号表示 UART 已准备好接收数据,而CTS信号则控制来自发送UART的数据流。和TXD与RXD引脚一样,UART的RTS和CTS引脚在两个UART之间也是交叉连接的。
请注意,在许多微控制器(MCU)中,UART的引脚输入和输出并不总是在专用的输入输出引脚上。相反,UART的信号会与其他输入和输出功能复用,比如定时器输出、模拟数字转换器(ADC)输入以及通用输入输出功能。对于引脚数量较少的器件来说尤其如此。如果是这种情况,请按照微控制器文档中的建议配置输入输出引脚。
总结:
UART是一种串行通信外设,具有高度可编程性,提供如可编程波特率发生器、可配置数据位大小等特性,支持单主多从总线方案。其功能模块包括发送器、接收器和时钟发生器,分别负责数据发送、接收和时钟定时。发送器将数据字节转为比特流,接收器将串行比特流组合为数据字节。UART时钟发生器生成发送和接收时钟,接收器利用更高频率的采样时钟确定比特值。UART通过两线或四线接口通信,支持半双工或全双工模式,且引脚常与其他功能复用,需按文档配置。