英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
软件模拟USART
[打印本页]
作者:
winnie
时间:
2009-3-21 14:45
标题:
软件模拟USART
在用单片机开发各种嵌入式应用系统时,异步串行通信是经常要用到的一种通信模式,很多应用中还要求实现多路异步串行通信。大家平时熟悉的各种厂家的单片机,绝大部分片上只提供一个硬件
UART
模块,利用它可以方便实现一路串行通讯。
PIC
系列单片机也不例外,在其丰富的产品家族成员中,除高端系列(
PIC17/18
)一些型号片上带有两路硬件
UART
模块外,其它大部分型号片上只有一路
UART
,一些低端廉价的
PIC
单片机甚至还不带硬件
UART
。为了提高系统的性能价格比,就要求设计工程师用软件增加实现一路或多路异步串行通信。很多工程师对用软件实现的
UART
在可靠性和效率方面持怀疑态度,其实关键问题是看软件采用何种方式来实现可靠的
UART
功能。
在讨论具体实现方式前,我们先来简单回顾一下异步串行通信的格式定义。发送一个完整的字节信息,必须有“起始位”、“若干数据位”、“奇偶校验位”和“停止位”;必须定义每位信息的时间宽度——每秒发送的信息位个数,即为“波特率”。单片机系统中常用的波特率从
300
~
19 200 b/s
。当波特率为
1200b/s
时,每个信息位的时间宽度为
1/1200
≈
833
μ
s
;无数据通信时,数据线空闲状态应该是高电平,“起始位”为低电平,数据位低位先发且后跟奇偶校验位(若有),“停止位”为高电平,如图
1
所示。
[attach]544[/attach]
按图
1
最基本的异步串行通信时序,软件实现
UART
在不同架构的单片机上有多种方法。其中数据接收是关键,因异步通信没有可参照的时钟信号,发送方随时都可能发送数据,任何时刻串行数据到来时,系统都应该及时准确地接收。比较而言,本机发送串行数据相对容易,只要对发送出去的电平做持续时间的定时即可。按不同的接收技巧并针对
PIC
单片机的特点,这里介绍两种常用且十分可靠的方法。
1
三倍速采样法
三倍速采样法顾名思义就是以三倍于波特率的频率对接收引脚
Rx
进行采样,保证检测到“起始位”,又可以调整采样的时间间隔;将有效数据位的采样点控制在码元的中间
1/3
处,最大限度地减少误码,提高接收的准确性。我们把图
1
的起始位和部分数据位放大,如图
2
所示,把每个信息位分成三等份,每等份的时间宽度设为
ts
,以方便分析。
以三倍频对信息位进行采样时,每个信息位都将可能被采样到三次。当处于空闲状态并检测起始位时,最早检测到起始位低电平的时刻必将落在
S0
阴影区,虽然每次具体的采样点会在此
S0
阴影区随机变化。检测到起始位低电平后,间隔
4
×
ts
时间,正好是第一位数据位的中间
1/3
处(图
2
中
Ds
阴影区)。此后的数据位、校验位和停止位的采样间隔都是
3
×
ts
,所有采样点均落在码元的中间
1/3
处,采样数据最可靠。
[attach]545[/attach]
PIC
单片机采用此法实现软件
UART
时,硬件上只要任意定义两个
I/O
引脚,分别初始化成输入(串行数据接收)和输出(串行数据发送)即可;软件上只要实现定时采样,定时时间间隔在中档以上有中断机制的单片机上可以用不同的定时器(
TMR0
、
TMR1
、
TMR2
等)通过定时中断实现,在低档无中断的
PIC
单片机上可以控制每次主循环所耗的时间来实现。对于
1200 b/s
波特率,码元宽度为
833
μ
s
,采样时间间隔即为
278
μ
s
。整个串行接收或发送是一个过程控制问题,用状态机方式实现最为高效简易。图
3
给出了串行接收的参考状态机转移过程。
[attach]546[/attach]
本刊网络补充版(
www.dpj.com.cn
)中,介绍了简单的
C
语言参考源程序。此段程序实现
1200b/s
全双工串行通信,
1
位起始位,
8
位数据位,无校验位,
1
位停止位,没有帧错误等判别。编译环境为
HITECH-PICC
编译器
V8.00PL4
或更高版。
在网络补充版的程序中,关键部分是
TMR0
的中断服务。
TMR0
每隔
278
μ
s
左右中断一次,
TMR0
的中断响应即为软件
UART
接收和发送全双工通信过程的实现。通过
Hitech-PICC
高效的代码编译后,约有
150
条单字指令代码,整个中断服务平均用约
35
个指令周期,即实现一路软件
UART
在
4 MHz
工作频率下占用
MCU
约
12
%的运行带宽。理论上,只要保证
MCU
留有足够的运行带宽给其它任务,在此中断服务程序内把接收和发送的代码再复制一份或多份(数据结构独立),即可实现多路软件
UART
。当然,如果每路的波特率不同,采样频率必须是最高波特率的三倍。不同波特率的采样点间隔独立调整。
此法最大的好处是软硬件配置极其灵活:接收发送的引脚可以任意定义;采样定时可以用不同的定时器实现;利用同一个定时采样可以方便地实现多路软件
UART
等。缺点是:不管有无数据通信,始终占用
MCU
运行带宽;串行通信的波特率不能太高,
4 MHz
工作的
PIC
单片机一般能实现
2400bps
的全双工通信。当然,可以通过提高
MCU
的振荡频率来实现高波特率通信,当
PIC
单片机工作在
20 MHz
时,实现
9600b/s
绰绰有余。
2
起始位中断捕捉、定时采样法
实现此法的硬件条件是
PIC
单片机有外部脉冲下降沿中断触发功能,在中档以上
PIC
单片机中有
RB0/INT
外部中断脚,
CCP1/CCP2
脉冲沿捕捉脚,
PORTB
的第
4/5/6/7
电平变化中断脚等都可以满足。另外需配备一个定时器,以定时中断方式对接收码元正确采样,或发送串行数据流。其关键的异步接收工作原理简介如图
4
所示。
[attach]547[/attach]
设串行数据位宽度为
td
。起始位到来时刻(图
4 A
点)的下降沿触发一个中断并立即响应该中断。在此中断服务中立即关闭本中断使能位(后续的数据流变化无需触发中断),开启定时器,使其在
1.5td
后产生定时中断,用于采样第一个数据位(确保
S0
采样点落在数据位的中心位置处);在处理下降沿中断服务的最后,再检测接收端是否还是
0
电平,以区分窄脉冲干扰。在
S0
点采样到第一个数据位后的所有采样间隔都是
1td
,直到收到停止位后,关闭定时器中断,重新开放下降沿捕捉中断,准备接收下一个字节。
异步数据接收和发送的状态机控制流程,除了起始位判断和定时时间参数设置与前述方式不同外,其它几乎一样,此处不再重复。
此法的好处是可以实现较高的通信波特率。对于通信不是很频繁的系统,此软件
UART
几乎不耗
MCU
运行带宽,
9600b/s
接收或发送在
4 MHz
运行的
PIC
单片机上即可轻松实现;另外
,
由于下降沿中断可以唤醒处于睡眠的单片机,故极易实现通信唤醒的功能。缺点是不能全双工通信(除非另外单独用一个定时器实现发送定时),异步接收的引脚必须有下降沿触发中断的能力。
上面介绍的两种方法在实际产品设计中都得到了很好的验证,最典型的是红外线自动抄表系统。该系统要求收发均为
38 kHz
红外调制,串行数据
1 200bps
半双工通讯。用软件实现此
UART
,并充分利用
PIC
单片机
CCP
模块的脉宽调制
PWM
输出
38 kHz
载波时,在单片机外除了一个一体化红外接收头和一个红外发射二极管,无需其它任何外围器件,即可完成所有设计要求,最大程度地减化了硬件设计,降低了成本,提高了系统的可靠性和性能价格比。
以上的侧重点是基本原理的介绍,希望对大家有所帮助。在接收数据的可靠性处理方面没有太多涉及。有兴趣者可以在采样时刻到来时对数据做多次采样,以消除干扰误码;或有其它处理技巧,欢迎和笔者作进一步交流。
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2