1.通用异步串行收发传输器UART简介
-
通用异步串行收发传输器。
全称为Universal Asynchronous Receiver/Transmitter,简称URAT,也是一种调制解调器。
发送机能够以字节(byte)形式接收数据,并以比特(bit)形式将数据从数据的最低位(LSB)到最高位(MSB)发送给接收机;同理,传输机串行接收比特(bit)数据,并将其以字节(byte)形式保存。
通常情况下,UART的发送机和接收机是更大的系统中的一部分。远程通信系统中,接收机无法得到发送机的数据发送时钟,所以URAT的接收和发送单元彼此不同步、是异步的。
-
波特率。
严格来说波特率和比特率并不划等号,但是在UART系统中,将两者看作是同一个概念则比较好理解。波特率(或者说比特率)是每秒钟传输的bit数。例如:1秒钟的时间传输了100bit的数据,则其传输的波特率为100bit/s。而UART协议中常用的波特率为:9600、19200、115200等。
UART的接收机和发送机之间不通过系统时钟直接进行数据传输,而是根据波特率进行数据的传输。波特率的产生需要借助系统时钟来实现,即需要在发射机和接收机的内部维护一个计数器,通过配置计数器清零时的值来间接实现所需要的波特率。
例如,常用的FPGA的系统时钟为50MHz,假若所需的UART波特率为9600bit/s,则我们每发送一位数据需要5208(50000000/9600=5208.333)个系统时钟周期。
-
数据的发/收格式。
UART对数据格式是有要求的,一帧数据包含了:起始位、数据位、奇偶校验位、停止位。
-
起始位:通常情况下,数据线在空闲状态下是处于1的,所以当其从1变成0的时候就意味着数据传输的开始。
-
数据位:数据位紧接在起始位之后,数据位的个数可以是4、5、6、7、8等,只要构成一个ASCII字符即可,并且数据位从低位开始进行传送。
-
奇偶校验位:检验数据在传输过程中有没有发生错误,这个奇偶校验位是可选的。偶校验:“1”的位数应该为偶数;奇校验:“1”的位数应该为奇数。
-
停止位:一次传输的结束,这个停止位可以是1位,也可以是1.5位,甚至是2位。通信过程中两台设备间可能会出现小小的不同步,因此停止位不仅仅是表示传输的结束,同时也提供计算机校正时钟同步的机会,停止位的位数越多,不同时钟同步的容忍程度越大,但相应的数据传输速率也就越慢了。
-
2.发送机
相较于UART接收机,UART发送机的逻辑更为简单一些,需要注意的有以下几点:
-
产生符合协议需求的波特率,并根据波特率进行数据的发送。
-
数据的发送是以起始位为标志的,数据线在空闲时一直保持“1”态,所以当数据线从“1”变为“0”的时候就表明此次发送的开始。
-
一般情况下,可以在发送机内部设计一个移位寄存器来完成数据从LSB到MSB的串行发送,但是每发送完一个数据后,高位需要补“1”。另外,复位之后的移位寄存器是全“1”的。
-
需要用一个计数器来记录已经发送的数据的位数。
3.接收机
UART接收机的操作稍微复杂一些。接收机需要负责串行接收比特流,去掉其起始位和结束位后再将数据以字节的形式保存下来。由于接收机无法获得发送机发送数据的时钟,所以需要根据协议中的波特率来接收数据。
一个UART接收机需要注意的有以下几点:
-
UART接收机可以通过标准波特率来接收数据流。但有时同步问题仍然存在,这种情况下我们可以利用一个更高频率的本地时钟来采样数据线上的变化,以此保证数据的完整性。但无论哪种方式,都需要维护一个采样计数器。
-
检测到数据线上的起始位后开始接收数据。
-
内部需要有一个计数器记录已经接收到的数据的位数。
网友评论