一、基本介绍
UART(Universal Asynchronous Receiver/Transmitter),即通用异步收发传输器,它是一种通用的串行、异步通信总线,有两条数据线,可以实现全双工的发送与接收,常用于微处理器和其它设备之间的异步通信。
UART因为是异步通信,所以不包括同步信号中的时钟线,其两条数据数据线TX和rRX分别用来发送和接收数据。UART负责处理串行端口与发送接收数据总线见的串并转换,并规定了数据包格式,TX和RX采用相同的数据包格式和波特率就可以进行数据传输。
为了方便电平比较,在实际中h还经常会接一根共地线。
图1-1 UART传输示意图
二、协议原理
2.1 基础知识
发送端UART将要发送的数据组装成一个数据包通过TX端口串行将数据发送出去,接收端UART通过其RX端口串行对数据包的数据进行采集,从数据包中恢复出发送端发送的数据。
图2-1 UART数据包
UART的数据包包括1个开始位、5到9位数据(取决于UART设置),1个奇偶校验位,1或者2个停止位。
开始位:UART数据传输线空闲时保持高电平,开始发送数据时,发送端UART将数据线从高拉到低一个时钟周期(其长短根据波特率决定)。当接收端UART探测到下降沿时,开始根据波特率读取数据。
数据帧:数据帧中为要传输的真是数据,如果使用奇偶校验位,数据帧中可包含5到8位数据,如果不适用奇偶校验位的话,数据帧中最长则可包含9位数据。在多数情况下,从数据的LSB位开始发送。
奇偶校验位:奇偶校验位用于在接收端UART来显示传输过程中是否有数据被改变。在传输过程中,位数据可能因为电磁辐射、不匹配的波特率、或者长距离传输等原因被改变。当接收UART读取完数据帧后,计算其中1的个数,并且检查1的总个数是奇数还是偶数。如果奇偶校验位是0,则数据帧中1的个数应该是偶数个,如果奇偶校验位是1,则数据帧中1的个数则应该是奇数个。当奇偶校验位的值与数据位帧相匹配时,则UART认为传输中没有错误(具有局限)。但是如果奇偶校验位是0,数据帧的1的总个数是奇数;或者奇偶校验位是1,数据帧中1的共个数是偶数,则UART则会知道帧数据已经被改变。
停止位:为了表示传输包的结束,发送端UART将数据传输线从低电平拉到高电平至少1到2个数据位宽。
前面已经对数据包/数据发送时序进行了介绍,下面在对波特率以及与其容易混淆的比特率的基础知识进行补充。
波特率定义是:每秒钟传送的符号(码元)数量,单位波特(Baud、B,即symbol/s)。
比特率定义是:每秒钟传送的位(比特)数量,基本单位是比特每秒(bps,bit per second)。.
从两者的定义可以看出要想知道波特率和比特率的关系,就首先的弄清楚码元数量和比特数量的关系。此处引用参考资料2中的解释:把通信系统中码元类比为公共交通车辆,例如公交车、地铁、的士……。通信系统所传输的比特数量类比为出行的人,则比特率为出行人口流动速度,波特率就是发车率。就像例子中提及的公交车、地铁、的士可以搭乘不同数量的出行人员一样,不同码元也可以用不同位数的比特表示。码元所需要的比特位数,由码元支持的状态数量确定。我们知道1个比特可以表示0、1两种状态,假设码元状态为N,则此码元所需要的比特位数如下:
比特率与波特率之间的关系则为:
UART中每个码元就是一位数据,存在两种状态,也即波特率单位变为每秒位数,与比特率定义相同,可以理解为此处的波特率就是比特率,一些常见的波特率为4800bps、9600bps、19200bps、115200bps。
2.2 波特率偏差
拿9600bps举例来说。 每1位的传输时间为1(s)/9600=104166.67ns。以FPGA常用的50M时钟来算,使用计数器的话需要520.83次,在一些设计中 通常不进行小数计数而是直接取整,而在取整过程中便会引入波特率误差,当误差大到一定程度后便会引起传输错误,因此在使用uart时需要注意。
三、UART小结
UART优点:只使用两根数据线、不需要时钟信号、具有奇偶校验位进行数据检测,传输数据包可以调整(发送和接收须保持一致)、应用范围广。
UART缺点:数据帧最大位数被限制为9位、不支持多主机或者多从机系统、两边的波特率徐保持一致。
图3-1 UART小结
四、参考资料
1. Basics of UART Communication (circuitbasics.com)
2. 知乎