摘要:许多微控制器具有异步UART (串口),为两个器件之间的通信提供了一个简单途径,不需要相同的系统时钟。本应用笔记介绍了一个利用MAXQ3210微控制器的两个标准端口,通过软件实现10位异步UART通信的方案。经过简单修改,还可实现RS-232和RS-485网络通信,或与PC的COM口连接。
本应用笔记介绍了一种利用软件实现通用的10位异步串口的方案,设计实例采用了低功耗MAXQ3210微控制器,该控制器不含硬件串口。当具体应用中无法提供足够的硬件串口时,采用相同方法,可以为任何MAXQ®微控制器,例如MAXQ2000,添加一个或更多的串口。
尽管多数微控制器带有硬件串口,仍然有一些微控制器不具备UART硬件串口。在为系统选择微控制器时,很难找到满足各方面要求的完美方案。所以,通过增加微控制器的软件设计实现某些外设功能可以弥补微控制器的功能“缺陷”,提高设计的灵活性。
有些微控制器具有硬件UART,但出于某种原因,它可能无法胜任具体的设计要求。例如,微控制器需要与一个工作在略有差异的串口协议的外设通信,或者硬件UART所支持的数据位数、奇偶检验、输入/输出缓存器不完全符合应用要求。构建软件UART能够在UART功能定义、串口协议的细节方面提供更大的灵活性。
微控制器可能具有非常适合应用要求的硬件UART,但数量不够。此时,除了添加芯片来增加串口数量以外,还可以简单地增加一个与微控制器UART功能一致的软件UART,以满足系统要求。
软件UART会占用主程序多大带宽也非常重要,使用硬件UART (或其它串行通信外设)的主要原因是微控制器不必花费时间处理串行通信的底层协议。冗长的数据位采样、时隙计数、输入/输出移位均由硬件处理,UART向主微控制器发出指示信号(中断或其它指示标志),表明它已接收到字符或完成一次发送任务。微控制器可根据需要快速装载或卸载UART缓存区的数据,然后返回处理其核心任务。
简而言之,软件UART意味着程序需要花费更多的时间观察端口引脚的串行通信,有些设计不能接受这种费时操作。
庆幸的是,我们可以在设计软件UART时避免过多地占用微处理器的时间和资源,下面我们考虑一个字符的收、发过程,假设采用标准的10位异步串行协议(1个起始位、1个停止位和8个数据位) (图1)。
图1. 10位异步串行通信协议的发送与接收
一旦开始发送或接收操作,串行UART (不论是软件形式还是硬件形式)都不需要连续监视I/O线。发送一个字符时,UART只需要在每个数据位周期驱动一次传输线的状态,依次建立每个数据位的电平,从起始位到数据位再到停止位。接收字符时,UART在第一个下降沿开始启动,下降沿过后,UART仅需要在每位时隙的中间点对传输线的状态采样。
为避免过多占用不必要的主程序时间,应该由定时中断周期性地触发UART状态机。用于数据接收的初始化下降沿检测通过外部边沿触发中断单独处理。如果状态机的定时器设置为在每个数据位启动一次中断,状态机在每次触发中断时可以执行任何所需操作(必要时可以进入下一状态)。应尽可能优化状态机代码,因为软件UART工作时将在后台连续运行这些代码。
对于MAXQ3210,接收和发送状态机以及用于设置模式、加载、卸载字符的子程序可通过171个指令字实现。例如,发送状态机只有三个状态(数据位、停止位和返回空闲),如下所示:
任何情况下,中断代码最多占用19个指令周期,可根据波特率估算出表1所示最差状况下的带宽。注意:最差状况下的带宽是根据连续发送或接收字符的操作估算的。一旦完成字符传输,将关断UART,在开始传输下一个字符之前允许主程序的其它操作。
表1. MAXQ3210实现UART通信需要占用的带宽
这里,我们采用了相对速率较低的MAXQ3210微控制器进行测试,如果使用高速微控制器(如MAXQ2000或高速8051),则可实现1个以上的软件UART,能够配置成半双工或全双工模式(或更复杂的串行通信外设),并且,不会占用更多的主程序带宽。采用软件实现与外设的通信时,可修改协议的任何部分,以便与其它UART设备或相关标准变化保持一致,为新设计提供最大程度的灵活性。
类似文章发表于Embedded Systems Design网络版,2007年2月。
概述
通用异步收发器(UART)或串口,是多数微处理器或微控制器的标准外设。异步串口为两个微控制器之间(或者是微控制器与从机串口器件之间)的通信提供了一种简单方式,无需相同的系统时钟。配合适当的的电平转换器,该串口还可与RS-232、RS-485网络进行通信,或与PC的COM口连接。串口连接仅需2条信号线(Rx和Tx)及可实现全双工通信,只要通信两端设备采用相同的数据位格式和波特率,就能成功传输数据,设备之间无需其它任何信息。本应用笔记介绍了一种利用软件实现通用的10位异步串口的方案,设计实例采用了低功耗MAXQ3210微控制器,该控制器不含硬件串口。当具体应用中无法提供足够的硬件串口时,采用相同方法,可以为任何MAXQ®微控制器,例如MAXQ2000,添加一个或更多的串口。
软件UART的优势
有人可能会问:目前绝大多数微控制器都具备功能强大的硬件串口,为什么还会用微控制器的端口引脚实现软件UART呢?主要原因如下:尽管多数微控制器带有硬件串口,仍然有一些微控制器不具备UART硬件串口。在为系统选择微控制器时,很难找到满足各方面要求的完美方案。所以,通过增加微控制器的软件设计实现某些外设功能可以弥补微控制器的功能“缺陷”,提高设计的灵活性。
有些微控制器具有硬件UART,但出于某种原因,它可能无法胜任具体的设计要求。例如,微控制器需要与一个工作在略有差异的串口协议的外设通信,或者硬件UART所支持的数据位数、奇偶检验、输入/输出缓存器不完全符合应用要求。构建软件UART能够在UART功能定义、串口协议的细节方面提供更大的灵活性。
微控制器可能具有非常适合应用要求的硬件UART,但数量不够。此时,除了添加芯片来增加串口数量以外,还可以简单地增加一个与微控制器UART功能一致的软件UART,以满足系统要求。
软件UART会占用主程序多大带宽也非常重要,使用硬件UART (或其它串行通信外设)的主要原因是微控制器不必花费时间处理串行通信的底层协议。冗长的数据位采样、时隙计数、输入/输出移位均由硬件处理,UART向主微控制器发出指示信号(中断或其它指示标志),表明它已接收到字符或完成一次发送任务。微控制器可根据需要快速装载或卸载UART缓存区的数据,然后返回处理其核心任务。
简而言之,软件UART意味着程序需要花费更多的时间观察端口引脚的串行通信,有些设计不能接受这种费时操作。
庆幸的是,我们可以在设计软件UART时避免过多地占用微处理器的时间和资源,下面我们考虑一个字符的收、发过程,假设采用标准的10位异步串行协议(1个起始位、1个停止位和8个数据位) (图1)。
图1. 10位异步串行通信协议的发送与接收
一旦开始发送或接收操作,串行UART (不论是软件形式还是硬件形式)都不需要连续监视I/O线。发送一个字符时,UART只需要在每个数据位周期驱动一次传输线的状态,依次建立每个数据位的电平,从起始位到数据位再到停止位。接收字符时,UART在第一个下降沿开始启动,下降沿过后,UART仅需要在每位时隙的中间点对传输线的状态采样。
软件UART的功能
我们可将软件UART的功能描述成一对儿状态机:一个用于发送字符,另一个用于接收字符。对于全双工UART来说两个状态机并行工作,需要两个独立的定时中断。两个状态机具有启动模式和停止模式。发送状态机在有字符发送时退出其空闲状态进行数据发送,发送停止位后返回其空闲状态。接收状态机在检测到接收线上的一个下降沿时退出其空闲状态开始接收数据。一旦检测到低电平起始状态(表明起始位已开始),便开始对数据位时隙进行计数,并根据需要对数据线进行采样,包括停止位。为避免过多占用不必要的主程序时间,应该由定时中断周期性地触发UART状态机。用于数据接收的初始化下降沿检测通过外部边沿触发中断单独处理。如果状态机的定时器设置为在每个数据位启动一次中断,状态机在每次触发中断时可以执行任何所需操作(必要时可以进入下一状态)。应尽可能优化状态机代码,因为软件UART工作时将在后台连续运行这些代码。
利用MAXQ3210进行设计
为了了解UART功能需要占用的处理器资源,作为一个范例,我们讨论利用Maxim的MAXQ3120实现的软件UART。该微控制器采用28引脚封装、5V供电,能够运行在大约3.57MIPS,包含15个端口引脚,但没有内部UART。MAXQ3210还包含了适合我们设计要求的其它功能:一个周期性定时器,为发送和接收状态机提供中断;一个外部中断,用于检测接收数据线的下降沿。由于MAXQ3210仅有一个周期性定时器,软件UART将采用半双工模式,即在某一时刻只能发送或接收数据,收、发不能同时进行。实际上,这对于多数通信和控制协议来说不成问题。对于MAXQ3210,接收和发送状态机以及用于设置模式、加载、卸载字符的子程序可通过171个指令字实现。例如,发送状态机只有三个状态(数据位、停止位和返回空闲),如下所示:
intTX_bit: 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 intTX_bit_zer move TXDO, #0 jump intTX_bit_next intTX_bit_one: move TXDO, #1 jump intTX_bit_next intTX_bit_next: djnz LC[1], intTX_bit_done move IV, #intTX_stop intTX_bit_done: move AP, GRL move PSF, GRH reti intTX_stop: move T2CNB.3, #0 ; Clear timer 2 overflow flag move TXDO, #1 ; Float high move IV, #intTX_idle reti intTX_idle: 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可下载(ZIP, 5.6kB)本应用笔记的完整代码。
任何情况下,中断代码最多占用19个指令周期,可根据波特率估算出表1所示最差状况下的带宽。注意:最差状况下的带宽是根据连续发送或接收字符的操作估算的。一旦完成字符传输,将关断UART,在开始传输下一个字符之前允许主程序的其它操作。
表1. MAXQ3210实现UART通信需要占用的带宽
Baud Rate | Cycles per Timer Tick (at 3.57MHz) | Worst-Case Interrupt Cycle Count | Bandwidth Used by UART (%) |
9600 | 372 | 19 | 5 |
19200 | 186 | 19 | 10 |
28800 | 124 | 19 | 15 |
57600 | 62 | 19 | 31 |
结论
本应用笔记介绍了一个简单的通过2个标准端口,利用软件实现10位异步UART通信的方案,只要微控制器空闲端口引脚能够满足需求,上述方案也可用来实现SPI™到SMBus™ 、I²C的任意串口通信。这里,我们采用了相对速率较低的MAXQ3210微控制器进行测试,如果使用高速微控制器(如MAXQ2000或高速8051),则可实现1个以上的软件UART,能够配置成半双工或全双工模式(或更复杂的串行通信外设),并且,不会占用更多的主程序带宽。采用软件实现与外设的通信时,可修改协议的任何部分,以便与其它UART设备或相关标准变化保持一致,为新设计提供最大程度的灵活性。
类似文章发表于Embedded Systems Design网络版,2007年2月。
评论
查看更多