用CPLD实现串行通信时的波特率自动侦测
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用CPLD实现串行通信时的波特率自动侦测
杨李莎1朱华福 2
(1.长安大学研究生部,陕西西安 710064;2.云南昆船设备有限公司昆明 650236)
摘要:本文介绍了一种利用CPLD实现波特率自动侦测的方法,文章最后给出其仿真结果关键词:串行通信波特率自动侦测复杂可编程逻辑器件
Abstract: In this paper, it introduces a way to automatically detect baud rate by using CPLD, and in the end indicates it’s emulation results .
Key words: serial communication baud rate auto detected CPLD
1、引言
串行数据通信是应用极为广泛的技术,通过数据传输控制或监测中心可以对远端设备进行控制和监测设备的工作状态。串行外设都会用到RS-232C 异步串行接口.传统上采用专用的集成电路即UART实现,如TI、EXAR、EPIC 的550、452等系列,但是我们一般不需要使用完整的UART的功能,而且对于多串口的设备或需要加密通讯的场合使用UART也不是最合适的。如今的许多的电器都有串口,主要用于软件的升级或者用于自诊断。通常单机设备的串行通信波特率设置都是采用硬件拨码的方式进行的,对于一些拨码开关特别多的设备来说难于记忆,因此能否寻求一种波特率自适应的方法来解决这个问题呢?回答是肯定的,本文就介绍一种用复杂可编程逻辑器件来实现波特率自动侦测的方法。系统只设计了数据接收模块,利用VHDL语言对其进行编程,最后给出其仿真结果。
2、系统设计
2.1系统介绍
图1所示为数据接收模块结构框图,数据接收模块由波特率发生基准时钟、开始位下降沿检测、接收控制、串并转换器、锁存器、缓冲器等部分组成。为了能准确地侦测出接收数据的波特率,数据接收模块中采用了波特率发生基准时钟,首先用基准时钟对RXD端的数据进行接收采样,然后按波特率自动侦测原理进行波特率自动侦测,最后产生一个与发送端发送的数据相同的波特率,利用波特率进行通信。
1【作者简介】杨李莎(1981—)女,长安大学研究生部04级交通信息工程及控制专业硕士研究生,主要从事高速公路和城市道路的交通控制及管理研究。
图1 数据接收模块结构框图
1) 串行数据接收采样
为了能对位进行正确的操作,以基准波特率16倍的速率采样RXD端的电平,这就把接收一位的时间分成16份,当检测到开始位的下降沿时,就开始进行数据采样。采样的数据为一个位的第6、7、8三个状态,然后三个里面取两个以上相同的值作为采样结果,这样可以避免干扰。
2)串行数据接收控制
当开始位的采样结果不是0的时候就判定为接收出错,把串行接收控制器的位计数器复位。在波特率未侦测之前,当接收完波特率自动侦测原理需要的位数后就进行数据的输出,并把串行数据接收控制器的位计数器复位,等待正式数据的传输开始。当波特率确定之后,按照设计的数据传输格式(开始位、8位数据、停止位、无校验位)当接收完10位数据后就进行数据的输出,并把串行数据接收控制器的位计数器复位,等待下一数据的到来。
2.2 波特率自动侦测原理
众所周知,微机键盘中的回车键(CR)常用于命令的执行,许多程序中的命令都是以回车键来结束的,因此在波特率自动侦测中也采用回车键。因为回车键在ASCII码中的值为0X0D(十六进制),用二进制来表示即为00001101B,在异步传输过程中,数据的传输是以高电平来代表‘1’,用低电平来代表‘0’,在10位数据(1个起始位、8位数据、1个停止位)的格式下传输回车键的传输格式如下:
1
LSB MSB
所以规定在数据发送前,先发送回车字符,数据在传输过程中,低位在前、高位在后,再加上开始位和停止位其二进制表达式为010*******(开始位加数据加停止位,其中数据低位在前、高位在后),根据数据传输格式可看出,只要能测出开始位和数据位的最低位之间的时间间隔,即可知道数据传输的波特率(由波特率的定义知每位数据传输的时间为波特率的倒数,又每位数据的传输时间即为两位数据传输的时间间隔)。因此我们采用一种以“帧”(此处的“帧”为在数据传输过程中,每发送一个字符加上开始位和停止位)为单位来进行波特率自侦测的方法,同样是以回车字符为先导。我们假设设备的通信速率在9600bps~115200bps之间,系统时钟频率为44MHz。根据设备通信的波特率都有一定的规律性,所以我们在9600bps~115200bps之间列出所有常用的波特率:9600bps、14400bps、19200bps、28800bps、38400bps、57600bps、76800bps、115200bps 。在这些波特率当中把9600bps、19200bps、38400bps、76800bps归为第一组;把14400bps、28800bps、57600bps、115200bps归为第二组,在第一组中使用一个波特率基准发生时钟把它称之为基准时钟1,在第二组中也使用一个波特率发生基准时钟把它称之为基准时钟2。两组基准时钟同时对系统接收端的数据进行接收,当任一组接收完10位数据之后,取中间的8位数据(除数据位0和数据位9)然后再根据这8位数据确定发送数据的波特率,其具体过程如下。
取第一组中的基准时钟的波特率为76800bps ,第二组中的基准时钟的波特率为115200bps 。以第一组为例,假设发送数据的波特率为76800bps,则接收的数据为回车字符(0X0D)。若发送数据的波特率为38400bps,则因基准时钟的周期为发送数据的波特率时钟周期的1/2,所以基准时钟每两个时钟周期接收一个数据,故所接收的数据用二进制表示为00110011110000000011B(低位在前,高位在后),取前10位(0011001111),除去第一位和最后一位所得数据为01100111B(0XE6),其它波特率以此类推。下面所示为发送数据的波特率与接收到的数据的关系图。
第一组:
波特率以76800bps速率接收数据字节分频系数76800 0 10110000 1 0X0D 33
38400 0 01100111 1 0000000011 0XE6 65
19200 0 00011110 0 0011111111 0X78 130
9600 0 00000001 1 1111110000 0X80 260
第二组:
波特率以115200bps速率接收数据字节分频系数
115200 0 10110000 1 0X0D 22
57600 0 01100111 1 0000000011 0XE6 43
28800 0 00011110 0 0011111111 0X78 87
14400 0 00000001 1 1111110000 0X80 174 从上面的关系图可看出,第一组中的波特率为9600bps的2n倍(其中n=1、2、4、8);第二组中的波特率为14400bps的2n倍(其中n=1、2、4、8)。虽然第一组和第二组中接收的字节当n相同时是一样的,但是若发送数据的波特率在第一组所列的波特率中,则按第一组来锁定波特率,这时第二组接收的字节就不是关系图中所列的字节。同理,第二组也是一样。其算法如图2所示。在算法中设置标志位FLAG,程序初始化时就设置FLAG为‘1’(默认设置),当接收完10位数之后,取出取中间的8位数据(除数据位0和数据位9)用第一组所列波特率来判断,若不满足置FLAG为‘0’,启用第二组所列波特率来判断。这样便能侦测出第一组和第二组中所列的所有波特率。