RENESAS单片机软件模拟UART通信的实现

时间:2022-09-12 04:24:55

RENESAS单片机软件模拟UART通信的实现

摘要:在某些嵌入式系统应用中,需要多个UART串口,从而会限制单片机的选型和使用。本文介绍了一种模拟UART接口的方法,可以实现半双工的UART通信,为以上应用提供一种解决方案。该方案已经在瑞萨M38239GCFP单片机上实现并成熟应用,也可以参考用于其他种类的单片机上。

Abstract: Sometimes more UART ports are needed in some embedded systems which limited the choice of MCU. This paper introduces one method of simulation UART,realizes half-duplex UART communication that provided a method. This method is realized in RENESAS MCU M38239GCFP.It can also be applied to other MCU.

关键词:UART;软件模拟接口;RENESAS

Key words: UART;software simulation ports;RENESAS

中图分类号:TP273文献标识码:A文章编号:1006-4311(2010)15-0156-02

0引言

异步串行通讯(UART)是单片机之间通讯最常用的方式,可以很方便的转化为RS232格式与计算机通讯,转化为RS485实现远距离通讯。很多复杂系统中需要使用不同的单片机组合设计,不同单片机之间的通讯也经常采用异步串行口通讯。这样有时导致单片机的UART通讯端口不够用,需要使用普通的IO口通过软件模拟的方式实现UART通讯的功能。UART通讯的原理并不复杂,本文给出一种普通IO口模拟UART的方法,已经在瑞萨单片机M38239GCFP上实现并成熟应用。

1M38239GCFP单片机资源、特点介绍

此单片机是采用了740族内核的8位单片机,具有LCD驱动控制电路、A/D转换器、1路串行接口、监视定时器以及ROM校正功能等附加功能。

2本系统中M38239GCFP与模拟UART相关的资源配置

系统中需要两路串口,其中一路需要进行实时通讯,因此无法采用分时通讯的方式。需要一路采用软件模拟的方法。

本系统中使用4M外部陶瓷振荡器,2分频作为总线时钟。8位定时器Timer1、Timer3结合作为系统2ms基准定时,用来计算系统中的各种计时。8位定时器Timer2工作在脉冲输出模式,通过P56端口输出方波,用作蜂鸣器驱动。16位定时器TimerX配合外部中断INT0实现红外遥控解码功能;16位定时器TimerY配合外部中断INT3实现模拟UART的接收功能;再加另外一个IO口实现模拟UART的发送功能。

3UART串口介绍

UART串口为异步通信接口,1帧信息为10位或11位,图1所示的是一个帧格式示意图;10位的帧包括1位起始位(0-低电平),8位数据位和1位停止位(1-高电平)。通信双方必须采用同样的波特率,相同的帧格式(起始位、停止位、校验方式),发送端以该波特率依图1的格式发送数据,接收端则以16倍波特率采样RXD管脚的信号。如果一个有效的起始位被发现,则开始数据位的采样,每一位的数值会在8、9、10个采样点被采样三次,其中至少两次相同的值才被确认,并被移入传送移位寄存器中,最后一位必须是1(停止位),否则说明通信有错。

St起始位,总是为低电平,表示开始传输字符。

(n)数据位(0~8):起始位之后需要发送的数据信息。

P校验位,可以选择为奇校验或偶校验,数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。

Sp停止位,总是为高电平,表示一个字节的数据发送完成。

IDLE 通讯线上没有数据传输(RXD或TXD),线路空闲时必须为高电平。

4 软件模拟UART的设计

4.1 读取1个bit的做法,目前主要的做法

①每个bit中点连续读取3次,高电平次数多认为是高电平,低电平次数多认为是低电平;

②每个bit中点连续读取3次,要求3次电平状态都相同,否则报出错;

③每个bit平均分成16份(中间15次),只在第8、9、10次读取接收管脚电平状态,确认是0或者1。

理论上③种做法最好,但需要设定不同的定时器初始值,进入中断的时间是不同的,进入中断后有可能处理不完数据,下一次中断又来了,因此在这里不选用这种做法。②做法比较严格,丢数据包几率增加,但不会误接收数据;①做法与②做法相反,不容易丢数据包,但误接收数据的几率增加。

4.2 本系统需要模拟的UART通讯数据格式说明

波特率600bps,1位起始位,8位数据位,偶校验,1位停止位。使用的芯片资源说明:timerY和INT3,两个普通I/O口;需要注意的是timerY的中断优先级别比INT3的中断优先级别高。

4.2.1 定时器Y:16位定时器使用说明:

①地址tmryh、tmryl;

②计数源为f(Xin)/16--4us,f(Xin)=4MHz;

③设定初始值值为103,计数时间是(103+1)×4us=416us;

④计数起停控制标志位为tycnt_dis 0:start 1:stop;

⑤中断允许位tyint_en 0:enable 1:disable;

4.2.2 外部输入中断INT3使用说明:

①用来检测起始位,检测每一个byte的起始位;

②int3_edge是中断触发沿选择位,0:falling 1:rising

③int3_req是中断请求位;

④int3_en是中断使能位,0:disable 1:enable;

4.3 接收、发送两个管脚

Pin_Mrxd/Pin_Mtxd,其中接收管脚为外部输入中断方式;

4.3.1 发送做法说明:

一旦进入发送状态,调用发送子程序,把要发送的数据增加上起始位、校验位和停止位。发送和接收使用同一个定时器,所以程序在发送和接收之间切换,实现一种半双工方式的通讯。A、B、C进入定时中断的判断点。

在程序主循环中每1秒调用一次发送子程序,准备好要发送的数据后,发送管脚置低电平(平时为高电平),开启定时(TimerY)中断,每四次进入中断(一个bit的时间)根据要发送的数据更改发送管脚电平状态;依次发送起始位、数据位、校验位、停止位。发送完一个字节,判定是否发送完一帧数据,否则发送下一个字节。

4.3.2 接收做法说明:

要正确接收数据,首先要检测起始位。由于接收管脚使用的INT3脚,一旦在INT3上出现下降沿,产生中断。响应中断后,定时器设置定时周期为1/2个bit的时间,以便保证在起始位中间位置定时中断采样INT3引脚。如果采样电平为高电平,可以认为是干扰信号,定时器立即停止定时并退出子程序。如果为低,则认为检测到起始位,关闭外部中断,避免后面数据位中的0信息被误认为是起始位。确认起始位后,定时器设置为1个bit定时周期,保证数据位在中间采样,减少误判断。接收完数据位后,以相同的方式接收校验位,并判定校验位是否正确。如果接收数据正确,接收位计数相关的变量清零,同时打开外部中断捕捉下一个byte的起始位。

每个bit判定三次,由于设置的波特率是600bps,所以每1.667ms/4=416us进入定时中断判断一次输入管脚的电平状态。每个byte都用外部中断检测下降沿的方式捕捉其起始位。检测到起始位后,打开定时中断。接收完每个byte的第10个bit(校验位)时打开外部中断,设置为下降沿触发;接收完每个byte的第11个bit时,停止tymerY计数,禁止tymerY中断。

5总结

使用以上方法做的模拟UART端口,可以实现与单片机硬件UART异步数据完全相同的帧格式,配合单片机内置的异步串口测试,可以满足使用要求。可以有效的解决单片机异步串行口的扩展问题。

参考文献:

[1]陆延丰,常清璞.三菱3850系列单片机原理和应用[M].北京:北京航空航天大学出版社,2000.

[2]耿德根,宋建国,马潮,等.AVR高速嵌入式单片机原理与应用[M].北京:北京航空航天大学出版社,2001.

上一篇:试论花卉业的发展前景 下一篇:多人合作对策中的费用均摊问题