在利用单片机开发各种嵌入式应用系统时,异步串行通信是常用的一种通信模式,有的应用中还要求实现多路异步串行通信。人们平时所应用的各种厂商的单片机,绝大部分片上只提供一个UART(通用异步收发器)硬件模块,利用它可以方便地实现一路串行通讯。PIC系列单片机也不例外,在其丰富的一系列产品中,除高端系列(PIC 17/18)一些型号片上带有2路UART硬件模块外,其他大部分型号片上只有1路UART,一些低端廉价的PIC单片机甚至还不带硬件UART。为了提高系统的性价比,要求设计者用软件实现1路或多路异步串行通信。很多人对用软件实现的UART在可靠性和效率方面持怀疑态度,其实关键问题是采用何种方式来实现可靠的UART功能。
1 串行异步通信的基本协议
1.1 起止式协议的原理
起止式异步协议是串行异步通信的基本协议,特点是逐个字符传输,并且传送单个字符总是以起始位开始,停止位结束,字符之间没有固定的时间间隔要求,它的数据格式是靠起始位和停止位来实现字符界定的,故称为起止式协议。
起止式协议的格式定义为:对于一个完整的字符信息,必须包括起始位、若干数据位、奇偶校验位和停止位;必须定义每位信息的时间宽度—— 每秒发送的信息位个数,即为波特率。单片机系统中常用的波特率为300 bit/s~19200 bit/s。当波特率为1200 bit/s时,每个信息位的时间宽度为1/1200≈833(us);无数据通信时,数据线空闲状态应该是高电平,起始位为低电平,数据位低位先发且后跟奇偶校验位(若有),停止位为高电平,如图1所示。
图1 起止式串行异步通信的格式
1.2 起止式协议的优劣
起止式协议是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以该异步串行通信的可靠性高。但由于要在每个字符中加上起始位和停止位这样一些附加位,使得传输效率变低,只有约80%。因此,该通信协议一般用在数据速率较慢的场合(小于19.2 kbit/s)。在高速传送时,一般要采用同步协议。
按图1最基本的异步串行通信时序,软件实现UART在不同架构的单片机上有多种方法。其中数据接收是关键,因异步通信没有可参照的时钟信号,发送方随时都可能发送数据,任何时刻串行数据到来时,系统都应该及时准确地接收。比较而言,本机发送串行数据相对容易,只要对发送出去的电平做持续时间的定时即可。按不同的接收技巧并针对PIC单片机的特点,下面介绍一种常用且十分可靠的方法——三倍速采样法。
2 三倍速采样法
2.1 三倍速采样法的实现
三倍速采样法就是以3倍于波特率的频率对接收引脚Rx进行采样,保证检测到起始位,又可以调整采样的时间间隔;将有效数据位的采样点控制在码元的中间1/3处,最大限度地减少误码,提高接收的准确性。将图1的起始位和部分数据位放大,如图2所示,把每个信息位分成三等份,每等份的时间宽度设为t ,以便于分析。
图2 三倍速采样法格式
以三倍频对信息位进行采样时,每个信息位都可能被采样到3次。当处于空闲状态并检测起始位时,最早检测到起始位低电平的时刻必将落在S0阴影区,虽然每次具体的采样点会在此S0阴影区随机变化。检测到起始位低电平后,间隔4ts时间,正好是第1位数据位的中间1/3处(图2中Ds阴影区)。此后的数据位、校验位和停止位的采样间隔都是3ts ,所有采样点均落在码元的中问1/3处,采样数据最可靠。
PIC单片机采用此法实现软件UART时,硬件上只需要任意定义两个I/O引脚,分别初始化成输入(串行数据接收)和输出(串行数据发送)即可。软件上只要实现定时采样,定时时间间隔在中档以上有中断机制的单片机上可以用不同的定时器(TMR0、TMR1、TMR2等),通过定时中断实现;在低档无中断的PIC单片机上可以控制每次主循环所耗的时间来实现。对于1200 bit/s波特率,码元宽度为833us,采样时间间隔即为278us。整个串行接收或发送是一个过程控制问题,用状态机方式实现最为高效简易。图3给出了串行接收的参考状态机转移过程。
图3 状态机转移流程
接收端空闲状态为高电平,当收到低电平确认为起始位后,间隔4ts采样第1个数据位,然后每间隔3ts采样其它数据位,最后接收高电平确认停止位,数据接收完后回到空闲状态。如果起始位或停止位确认不对,程序均转入帧错误执行,回到空闲状态重新接收。
2.2 三倍速采样法实际应用
文中对中档单片机PIC12F675进行了软件异步串行通信设计,在程序设计中,关键部分是TMR0的中断服务。当通信波特率为1200 bit/S时,TMR0采用278us左右中断一次,TMR0的中断响应就为软件UART接收和发送通信过程的实现。通过MPLAB高效的代码编译后,约有150条单字指令代码,整个中断服务平均用约35个指令周期,实现一路软件UART在4 MHz工作频率下占用MCU约12%的运行带宽,通信过程比较可靠。理论上,只要保证MCU留有足够的运行带宽给其他任务,在此中断服务程序内把接收和发送的代码再复制1份或多份(数据结构独立),即可实现多路软件UART。当然,如果每路的波特率不同,采样频率必须是最高波特率的3倍,不同波特率的采样点间隔要独立调整。
该方法还在实际产品设计中都得到了很好的验证 最典型的是红外线自动抄表系统。该系统采用38 kHz红外调制,波特率为1200 bit/s的半双工串行异步通信。用软件实现此UART,并利用PIC单片机CCP模块的PWM输出38 kHz载波,在单片机外只须一个一体化红外接收头和一个红外发射二极管,即可完成所有设计要求,最大程度地减化了硬件设计,降低了成本,提高了系统的可靠性和性价比。
3 结束语
综上所述,三倍速采样法最大的好处是软硬件配置灵活、经济可靠,接收发送的引脚可以任意定义,采样定时可以用不同的定时器实现,利用同一个定时采样可以方便地实现多路软件UART,无需复杂的外围电路,即可实现可靠的串行异步通信。但也有些不足,不管有无数据通信,始终占用MCU运行带宽,串行通信的波特率不能太高,4 MHz频率工作的PIC单片机一般只能实现2400 bit/s的全双工通信。为此,可以通过提高MCU的振荡频率来实现高波特率通信,比如PIC单片机工作在20 MHz时,就可实现9600 bit/s;而且其通信可靠性可通过在采样时刻多次采样、多种校验等方法得到进一步提高。