09 UART串行通信协议介绍
软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA
登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!
1 概述
本节我们主要学习内容是URAT,对于最简单和常见的通信方式,UART、RS232、RS485经常放到语句中同等位置,初学者可能搞不清几个名词区别,这里就做一个简单介绍。
UART (Universal Asynchronous Receiver/Transmitter)代表通用异步接收器/发送器。也叫是我们经常所说的串口,基本都用于调试。UART的主要目的是发送和接收串行数据。串口只需要2根线就可以实现首发,TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式),通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,可以完成通信过程(收发不同步,所以是异步串行通信)。
若加入一个合适的电平转换器,如SP3232E、SP3485,UART 还能用于RS-232、RS-485 通信,或与计算机的端口连接。UART 应用非常广泛,工控的人机界面HMI、手机、PC 等应用中都要用到UART。
RS-232标准:RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文"推荐标准"的缩写,232为标识号。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。RS-232、RS422、RS-485并不是标准通信协议,仅仅作为UART通讯的一个机械和电气接口标准(仅仅是标准协议中物理层面),RS485是RS-232升级版。
RS485采用物理非标准接口,根据实际情况。RS232采用点对D9标准接口:
2 RS-485/ RS-422标准差分与性能对比
1、RS-232 采取不平衡传输方式,即所谓单端通讯。而 RS485 则采用平衡传输,即差分传输方式。RS232接口为全双工数据通讯模式,而RS485接口为半双工数据通讯模式,数据的收发不能同时进行,为了保证数据收发的不冲突,硬件上是通过方向切换来实现的,相应也要求软件上必须将收发的过程严格地分开。
2、电平特性和抗干扰性:RS232:传输电平信号接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容。需要使用转换电路方能与TTL电路连接,其抗干扰性差。RS485:传输差分信号(lvds)逻辑"1"以两线间的电压差为+(2—6) V表示,接口信号电平降低,就不易损坏接口电路的芯片,且该电平与TTL电平兼容。
3、传输距离和速率:RS232传输距离有限,最大传输距离标准值为15米,最大传输速率最大为20KB/S。RS485最大传输距离为1219米。 最大传输速率为10Mbps,在100KB/S的传输速率下,才可以达到最大的通信距离。
4、通信节点:RS232串行接口可以连接两个设备,一个发射机和一个接收机。而RS485串行接口可以用一台设备控制32个至多128个。
对比示意图:
RS232 |
RS485 |
RS422 |
|
传输方式 |
单端通讯 |
差分传输方式 |
差分传输方式 |
负载 |
1收1发 |
1发128收 |
1发128收 |
传输距离 |
15米 |
1219米 |
1219米 |
工作模式 |
单工/全双工 |
单工/半双工 |
全双工 |
接线方式 |
点对点 |
多点(非固定) |
多点(非固定) |
抗干扰能力 |
弱 |
强 |
强 |
最高传输速率 |
20kbps |
10Mbps |
10Mbps |
信号线数 |
D9 |
2根(收发) |
4根(2收2发) |
最大驱动电压 |
+/-25V |
+/-6V |
+/-6V |
接收灵敏度 |
+/-3V |
+/-200mV |
+/-200mV |
还有RS422,电气性能与RS-485完全一样。主要区别在于RS-422 有4 根信号线:两根发送、两根接收,能够做到同时收发(全双工)。RS-485 只有2 根信号线,所以只能工作在半双工模式。
3 电平标准
RS232、RS485、TTL同属于异步串行通信(UART用的是TTL电平标准),这三种通信方式本质上是电平逻辑的区别,都是一种逻辑电平的表达方式。下面简单介绍一下各自的供电电源、电平标准以及使用场景。
3.1 RS232电平
RS232电平采用负逻辑,多用于电脑串口,早期目前使用DB25线的接口后来IBM将标准改成D9线接口。
电压范围 |
电平逻辑 |
-15V ~ -3V |
代表逻辑1 |
+3V ~ +15V |
代表逻辑0 |
-3V ~ +3V |
无意义 |
3.2 RS485电平
RS485电平标准如下图,RS485由于采用差分电平,传输是两根线,两根信号线电压的差值来确定电平逻辑。
端口 |
电压范围 |
电平逻辑 |
输出端 |
+2V ~ +6V |
代表逻辑1 |
-2V ~ -6V |
代表逻辑0 |
|
其他 |
无意义 |
|
输入端 |
> +200mv |
代表逻辑1 |
< -200mv |
代表逻辑0 |
3.3 TTL电平
TTL电平标准如下图,TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术。电路、数字电路、微机原理与接口技术、单片机等课程中都有所涉及。
端口 |
电压范围 |
电平逻辑 |
输出端 |
<0.8v |
代表逻辑0 |
>2.4v |
代表逻辑1 |
|
输入端 |
<1.2v |
代表逻辑0 |
>2.0v |
代表逻辑1 |
TTL电路的速度快,传输延迟时间短(5-10ns),但是功耗大。2.4V和5V之间还有较大的电平裕量,增加了系统的功耗,同时影响了速度。所以后来升级有了LVTTL,常见的LVTTL为3.3V、2.5V,甚至更低的电压LVTTL。在LVTTL中Vcc=3.3V中,电平标准:
端口 |
电压范围 |
电平逻辑 |
输出端 |
<0.4v |
代表逻辑0 |
>2.4v |
代表逻辑1 |
|
输入端 |
<0.8v |
代表逻辑0 |
>2.0v |
代表逻辑1 |
4 URAT串口通信协议
UART是典型的异步通信,在一次串口通信过程中,数据接收与发送双方没有共享时钟,因此,双方必须协商好数据传输波特率。波特率即数据传输速率。根据双方协议好的传输速率,接收端即可对发送端的数据进行采样。串口通信由发送端和接收端构成,两根信号线实现,一根数据发送,一根数据接收。一开始高电平,然后拉低表示开始位,接着 8 个数据位,然后校验位,最后拉高表示停止位,并且进入空闲状态,等待下一次的数据传输。
下面是urat串口的几个要点:
4.1 通信格式
异步串行方式的数据格式:
发送数据包格式如下图所示:发送起始位(Start)+数据位(data)+奇偶校验位+结束位。
其中各位的意义如下:
起始位:先发出一个逻辑"0"信号,表示传输数据的开始,低位有效。
数据位:可以是5~8位逻辑"0"或"1"。
校验位:数据位加上一位后,使得"1"的位数应为偶数(偶校验)。
奇偶校验位就是插入数据块中的一些冗余信息,虽然影响传输效率,如果传输出错就会被检测出来。
结束位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位:处于逻辑"1"状态,表示当前线路上没有资料传送。(一般忽略)
4.2 传输速率
根据双方协议好的传输速率,接收端即可对发送端的数据进行采样。就是每秒中传输9600bit也就是相当于每一秒中划分成了9600等份。
常见的波特率标准为300bps,600bps,800bps,9600bps,19200bps,38400bps,115200bps等。当然更快的速度意味着对采样的要求更高,有可能误码率会逐渐提高。
通常对串口进行数据采样,采用更高频的时钟。这样做的目的是采用高频时钟来锁存低频时钟,减少数据的误码率,增加接收模块的自纠错能力。产生多高的波特率有外部晶振决定。
波特率计算方法:例如我们开发版的系统时钟为50M时钟,所使用的波特率为115200,传输1bit需要计数( 50_000_000 / 115200 ) = 434
4.3 数据处理(串行和并行)
Urat是一种采用异步串行通信方式的通用异步收发传输器,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。至于为什么这里涉及采用串并转换,笔者作为一个简单延伸。
1、并行数据传输:
并行数据传输就是将多bit以成行的状态在同一时钟周期下在不同线路上传输,并行传输数据一般为8bit 16bit等。并行数据发送为了能够在接收端被正确接收,每行数据(8bit 16bit)必须保持时钟同步(源同步、系统同步)。
2、串行数据传输:
串行传输指的是发送方和接收方的数据直接在单根通信线上逐位顺序传送,每一位数据都占据一个固定时间,时钟频率相同。
在低速短距离情况下,并行数据传输结构是非常高效的数据传输方式,所以可以用于微机系统。可当传输数据速度提高时,并行数据传输的弊端就出现了,总线吞吐量=数据线位数×数据速率,传输数据要不提高系统时钟,要不数据多位并行传输。
并行传输当系统时钟的频率增加之后,数据发送端发送数据(data)和时钟(clk )要保持一定的相位关系,同时要保证接收端数据(data)和时钟(clk)满足一定的建立时间和保持时间,这些建立时间和保持时间必须有足够的余量来计算,来满足时钟分配路径延迟到接收端芯片的差异。
在较高的时钟频率,可以在芯片中使用(PLL)锁相环来调整相位,来补偿芯片内时钟分配延迟,并满足电压和温度物理条件的变化,但是当时钟频率足够高时,难以保证稳定统一的时序,不可能建立共同时钟总线可靠地传输数据。数据接收接口同步电路难以实现。
串行数据传输,分时复用在一根或几根线上传输,串行通信在发送端通过数据编码技术把时钟信号嵌入到数据信号中,在接收端使用时钟恢复技术,从数据中提取同步时钟信号来恢复数据,满足了数据传输的时序同步要求,相对稳定可靠,实现单通道的数据传输速率10GB/S以上,如GTX、GTH。并行采用单端信号,串行差分信号,因为两根差分走线之间的耦合很好,当外界存在噪声干扰时,几乎是同时被耦合到两条线上,而接收端关心的只是两信号的差值,所以外界的共模噪声可以被完全抵消。由于两根信号的极性相反,外辐射的电磁场可以相互抵消。单端信号依靠电压阈值判断,差分变化位于信号交点,受温度、工艺等物理因素影响小,降低时序误差。
3、并行数据传输与串行数据传输各自的优势
并行传输优势:近距离传输数据速度快
串行传输优势:设计复杂度成本更低,功耗低、抗干扰强、时序稳定可靠速度快。
5 串口通信种类
通信的方式和种类有很多种,前面笔者提到了串行通信和并行通信的区别,接下来分享同步和异步,单工和全双工、半双工的区别。
5.1 同步通信和异步通信
同步通信:发送端在发送串行数据的同时,提供一个时钟信号,按照一定时序约定(在时钟信号的上升沿、下降沿、低电平、高电平的时候)将数据发送出去,接收端根据发送端提供的时钟信号和时序约定接收数据。
异步通信:接收端和发送端有自己的时钟,发送端发出数据后,不等接收方发回响应,接着发送下个数据包,接受端并不知道数据何时到来,接收端在信号的起始位和停止位下实现信息同步。本节UART就是典型异步通信,数据是一个一个字符传输,数据位后为奇偶校验位,以"起始位"开始,以"停止位"结束,数据位一般为5~8位,数据传输信号的宽度和波特率有关,波特率越高,宽度越小,传输前双方要统一波特率。
5.2 同步通信和异步通信对比
1.同步通信接收端和发送端时钟频率相同,时钟信号和数据信号发送同步。异步通信发送端和接收端时钟频率可以不一样,发送端的数据发送可以不连续,任意时间间隔可以发送下一个数据包。
2.同步通信可以同时挂载多设备,异步通信只适用于一对一通信接收发送。
3.同步通信时钟效率高,异步通信效率相对低。
4.同步通信时钟效率高,允许时钟误差范围小,同步通信相对异步通信精准度高。
5.3 单工和全双工、半双工
单工是指:数据传输和发送只能在一个方向,同一时间只有一端接受数据或者一端发送数据。
半双工指: 指数据可以在一个信号载体的两个方向上传输,但是不能同时传输,但某一时刻只允许信号在一个信道上单向传输。(相当于可以切换方向的单工)
全双工指:同一时间数据传输和发送同时在两个方向上传输,有独立发送和独立接收数据的能力,实现双向通信。(相当于两个单工)
6 常见串行通信方式分类
通信协议 |
通信方式 |
通信方向 |
URAT |
异步通信 |
全双工 |
SPI |
同步通信 |
全双工 |
IIC |
同步通信 |
半双工 |
RS485 |
异步通信 |
半双工 |
RS232 |
异步通信 |
全双工 |
RS422 |
同步/异步 |
全双工 |
7 串口通信数据位校验
在串口传输数据时,通讯距离过长、波特率高、噪声等因素会影响通信的稳定性,虽然不能解决通信过程中出现的问题,但是可以发现数据错位,在串口通信中一般会引入一种检验方式来监控传输中的数据以便及时发现错误。
笔者这里主要介绍几种常见的检验方式,即奇校验ODD、偶校验EVEN、累加和校验、CRC循环冗余码校验。奇偶校验码分两种,事先定义好采用奇校验还是偶校验。
7.1 奇校验ODD
奇校验:使完整编码(有效位和校验位)中的"1"的个数为奇数个;
如果原来信息中1的个数为奇数个,则校验位为0,这样所有信息中还是奇数个1;
如果原来信息中1的个数为偶数个,则校验位为1,这样所有信息中还是奇数个1;
常见的串口通信格式是(8位数据位+1位奇数校验位)。
以发送字符:10010101为例
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
7.2 偶校验EVEN
偶校验:使完整编码(有效位和校验位)中的"1"的个数为偶数个;
如果原来信息中1的个数为奇数个,则校验位为1,这样所有信息中还是偶数个1;
如果原来信息中1的个数为偶数个,则校验位为0,这样所有信息中还是偶数个1;
常见的串口通信格式是(8位数据位+1位偶数校验位)。
以发送字符:10010101为例
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
7.3 奇偶校验总结
1.奇偶校验的正确率只有一半不到,如果有两位数据位同时改变,则无法发现数据传输错误,如果只有偶数位能检测到,奇数位变化则无法检测到。
2.一般数据为8位+1位校验,数据传输效率降低,损失11%效率。数据位短损失更多。
3.能发现错误,无法纠正错误。
4.检验方法简单,代码表述容易。
7.4 累加和校验
所谓的累加和校验有很多种,最常见的一种是在每次通信数据包最后都加一个字节的校验数据,这个校验字节里的数据是通信数据包里所有数据的不进位累加和 。基本格式:传输数据+校验数据。下面以一个示例说明情况。
累加和校验:发送数据包位:06H、56H、C6H
进行不进位累加和的检验字节方式:92H
06H+56H+C6H=192H→舍去进位92H
所以最后发送数据包为:06H、56H、C6H、92H
接收方接收到数据后同样对一个数据包的数据进行不进位累加和计算,如果累加出的结果与校验位相同的话就认为传输的数据没有错误。
7.5 累加和校验总结:
1.检验方法简单,代码表述容易。
2.能发现错误,无法纠正错误。
3.校验正确率一般,字节是以求和舍进位方式,多一个或者少一个字节,检测不到。
基于FPGA的实现,当然还有检错能力极强的CRC,由于实际应用中CRC的校验表直接存储在ROM中,进行索引查找,常见的CRC表可以自行去查找,笔者这是简单介绍定义。
循环冗余校验 (Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。
本文来米联客(milianke),作者:米联客(milianke),转载请注明原文链接:https://www.cnblogs.com/milianke/p/17934396.html