广告

基于微控制器的软件UART设计

2007-02-06 Aaron Minor 阅读:
通用异步收发器(UART)是一种串行接口,许多微处理器和微控制器中都包含这种外设接口。异步串行接口提供了一种简单的途径,使两个器件无需共享同一个时钟信号就能进行通信。如果再加入一个合适的电平转换器,串口还能用在RS-232和RS-485网络中通信,或者与计算机的COM端口连接。串口只需两根信号线(Rx和Tx)即可实现,而且只要两端器件都采用同样的位格式和波特率,那么它们无需其它任何对方的信息就可以成功传输数据。

通用异步收发器(UART)是一种串行接口,许多微处理器和微控制器中都包含这种外设接口。异步串行接口提供了一种简单的途径,使两个器件无需共享同一个时钟信号就能进行通信。如果再加入一个合适的电平转换器,串口还能用在RS-232和RS-485网络中通信,或者与计算机的COM端口连接。串口只需两根信号线(Rx和Tx)即可实现,而且只要两端器件都采用同样的位格式和波特率,那么它们无需其它任何对方的信息就可以成功传输数据。

软件UART的意义

如今,可提供功能完善的硬件串口的微控制器比比皆是,那么我们为什么还要费力地用微控制器的端口管脚来实现软件UART呢?主要有以下几个原因:

首先,尽管确实有许多微控制器都包含了硬件UART,但仍有许多没有包含这种接口。在系统设计中,选择微控制器时,可能很难找到一款各方面都很理想的产品。例如,电压范围合适的微控制器可能内部存储器不够大,而存储器大小足够的可能又没有足够的端口管脚,无法满足设计需求。因此,通过软件方式实现某些系统需要的外设接口,从而弥补一款微控制器性能上的缺陷,就能增加可供设计选择的微控制器的数量和种类,从而增大设计的灵活性。

第二,即便一款微控制器包含了一个功能完善的硬件UART,由于某种原因,这对即将进行的设计来说可能仍然不够。例如,可能是微控制器需要与之通信的外设所用的协议与串口协议稍有不同,也可能是硬件UART所提供的位数、奇偶校验功能或输入和输出缓存无法完全满足应用的要求。这时,通过构建一个软件UART接口,我们在定义UART的功能和串口协议的细节上就更灵活。

第三,一款微控制器的硬件UART也许能够很好地满足应用的需求,但只是数量不够。例如,微控制器包含两个UART,而设计中的应用却需要三个。此时,我们不必仅仅为了增加串口的数量就另外增加一块新的芯片,而只需增加一个与该微控制器上现有的UART具备同样功能和特性的软件UART。

需要注意的问题

此外,还有一个很重要的问题是,软件UART会从主应用中占用多大带宽?因为采用硬件UART(或其它硬件串行通信接口)的一个主要原因首先就是将微控制器解放出来,使其无需费时去处理串口协议底层的细节。像位采样(bit-sampling)、时隙计算以及输入输出移位这类繁琐的操作都在硬件中完成,然后UART通过中断或其它标志位的方式告诉主微控制器,它已经收到了一个字符或者已经发送完一个字符。接着,微控制器就可以快速地从UART缓存中上载数据或者向缓存中下载数据,然后返回继续执行其核心任务。

如果实现一个软件UART时,在UART检查端口管脚的串行活动时,需要占用大量时间,让应用程序停滞,这会使得软件UART没有意义。好在情况并非如此,我们来看看标准的10位异步串行协议(包含一个起始位,一个停止位和8个数据位)收发一个字符时的情况(如图1所示)。


图1:标准的10位异步串行协议收发字符时的时序图。

在启动一次发送或接收操作之后,串行UART(不论是软件还是硬件形式的UART)并不需要连续监控I/O线。在发送一个字符时,每个位周期,UART只需驱动一次发送信号线的状态,从起始位到8个数据位直到结束位依次设置每个位的电平。在接收一个字符时,UART在第一个下降沿开始工作,之后只需在每个位时隙的中央对接收线上的信号状态进行一次采样。

我们可以用一对状态机来表征软件UART的行为,一个状态机用于发送字符,另一个用于接收字符。对一个全双工的UART而言,这两个状态机是并行运行的,需要两个独立的定时器中断。这两个状态机都有主动和被动两种模式。发送状态机在收到一个需发送的字符时跳出空闲状态,在结束位发送之后回到空闲状态。接收状态机在检测到接收线上的一个下降沿时跳出空闲状态。在检测到这个初始的低电平状态之后(该状态指示起始位已经开始),开始对位时隙进行递减计数,同时按要求采样信号线上的每个信号位,包括停止位。

为了避免不必要地占用主应用过多的时间,UART状态机应该由一些周期性的基于定时器的中断来激活。接收线上初始下降沿的检测需要利用一个边沿触发的外部中断单独处理。如果一个状态机的定时器被设置为每个比特周期发出一个中断请求,那么该状态机在每次中断被触发时能够执行任何需要的操作(而且如果需要,还能进入到下一个状态)。用于实现状态机的代码应尽可能优化,因为只要软件UART处于活动状态,这些代码就会在后台连续运行。

基于MAXQ3210实现UART

下面我们以美信公司的微控制器产品MAXQ3210上实现的一款软件UART为例,具体讨论一下软件UART需要多大处理能力。MAXQ3210是一款5V、28脚的微控制器,运行速度大约为3.57MIPS,有15个端口管脚,没有内置硬件UART,但包含一个我们需要的能够产生中断供发送和接收状态机使用的周期定时器,和一个可用于接收线下降沿检测的外部中断。但由于MAXQ3210中只有一个周期定时器,所以其上实现的软件UART只能是半双工的,也就是说在某个时刻只能要么发送要么接收字符,而不能同时实现收发。对于许多通信和控制协议而言,这并不存在问题。

在MAXQ3210上,接收和发送状态机加上设置工作模式和上载、下载字符所需的支持程序,都可以用总指令数为171字的指令实现。例如,发送状态机只有三个状态(数据位、停止位以及范围空闲状态),见下面的程序段:

move GRH, PSF

move GRL, AP

move T2CNB.3, #0; Clear timer 2 overflow flag

move AP, #5

rrc; Start with least significant bit

jump C, intTX_bit_one

move TXDO, #0

jump intTX_bit_next

move TXDO, #1

jump intTX_bit_next

djnz LC[1], intTX_bit_done

move IV, #intTX_stop

move AP, GRL

move PSF, GRH

reti

move T2CNB.3, #0; Clear timer 2 overflow flag

move TXDO, #1; Float high

move IV, #intTX_idle

reti

move A[4], #SER_MODE_TX_IDLE

move T2CNB.3, #0; Clear timer 2 overflow flag

move T2CNA.7, #0; Disable timer 2 interrupts

move T2CNA.3, #0; Stop timer

reti

这其中任何一个状态的中断代码路径最长为19个指令周期,我们可以据此估计软件UART在最坏情况下需占用的带宽(随波特率不同而不同,见表1)。


表1:软件UART需要占用的带宽估计

需要注意的是,这种最坏情况下的带宽只适用于字符连续发送或接收的情况。一旦一个字符发送完之后,UART就关闭,在下一个字符发送开始之前,主应用就可以无中断地运行。

我们的测试采用的是一款相对低速的微控制器,因此我们可以保证其它更高速的微控制器,例如MAXQ2000或高速的8051,也能在不占用过多主应用带宽的前提下,实现不只一个半双工或全双工UART(甚至更复杂的串行通信外设接口)。只要微控制器上有足够空闲的端口管脚可供使用,本文讨论的技术细节可用于实现从SPI到SMBus到I2C的各种串行接口。而有了这些软件通信接口,我们就可以更新通信协议的任何一个方面,保持与其他器件中的协议或与发展的标准同步,从而更快更灵活地创建新的设计。

作者:

Aaron Minor

高级工程师

美信公司

本文为EET电子工程专辑 原创文章,禁止转载。请尊重知识产权,违者本司保留追究责任的权利。
您可能感兴趣的文章
相关推荐
    广告
    近期热点
    广告
    广告
    可能感兴趣的话题
    广告
    广告
    向右滑动:上一篇 向左滑动:下一篇 我知道了