前言
本文档是对B站视频-5种嵌入式总线协议的笔记记录,若文档内容涉及侵权请私聊我。
1、UART简介
UART(Universal Asynchronous Receiver Transmitter)即通用异步收发器,是一种通用的串行、异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机和辅助设备之间的通信。
2、通信基础
2.1 并行和串行
如下图所示,按照每次发送二进制位的个数的方式我们可以分为并行通信和串行通信。
(1)并行通信:总线在传递数据时可以把数据的多个位一次性传递。
(2)串行通信:总线在传递数据时将数据一个位一个位的传递。
注意:总线本质上传输的是电信号(高低电平信号),而不是传输数据。
并行/串行通信的优缺点:在同等条件下,并行通信的速度比串行通信快一些。但是并行通信也会存在很多问题,例如并行通信使用的总线条数会比较多,会浪费资源,布线难度也会比较大。而且并行总线还会存在它不同数据线之间在进行数据传递的时候,线和线之间都会有一些信号的干扰。所以在实际工作中,一般使用的还是串行总线。
2.2 单工和双工(按照数据传递的方向区分)
半双工:A可以给B发数据,B也可以给A发数据,但是这两个操作不能同时进行。
全双工:A可以给B发数据,B也可以给A发数据,这两个操作可以同时进行。
判断半双工和全双工的方法:可以从总线条数看出。半双工只有一条总线(发送用这根,接收也用这根,所以发送和接收不能同时进行,同时进行的话就乱了),全双工发送和接收都有一根独立的线,所以互不影响,可以同时进行。
2.3 比特率和波特率
- 比特率用于描述串口通信速度,单位是bps(bit per second)即每秒钟传送的bit的数量。
- 波特率是单位时间传输了多少码元,是码元传输速率单位,单位是波特(Baud),码元是一个信号能够传输的信息量。
3、UART帧格式
例子:在A和B之间发送数字0x55。
- Step1:0x55转换成二进制是01010101。在串口通信的时候(通过数据线发送数据的时候),数据线上如果是高电平表示我要发送1,低电平表示我要发送0。
要有空闲位的原因:数据线总有不用的时候,即不发送数据的时候,这时的状态由串口协议规定,数据现在空闲的时候,我们必须把它搞成高电平,也就是在空闲的时候是高电平。 - Step2:由上面的图可知,不能直接发数据,还必须在发送数据前有个起始位,起始位是低电平。
要有起始位的原因:空闲位为高电平,发送数据时无法区分是空闲状态还是数据状态,为消除不确定性,需添加起始位。起始位为低电平,用于通知对方开始发送数据。 - Step3:因为是串行总线,发送的数据一共8位,发送的时候要一位一位的发。在串口协议里规定,发送数据的时候先发低位后发高位,以此类推。所以真正开始发数据的时候是10101010。
- Step4:校验位用于校验数据的正确性。例如A说123,但是B听到的是223,为了避免双方信息传递有误,添加了校验,A的123加起来是6,A说完123后说个6,即1236,B听到的是223,将223三个数字加起来是7,A说的最后一个数字是6,B最后一个数字是7,说明B听到的前面的这三个数肯定有错误。
校验位:
①校验只能尽量避免错误,不能保证消除错误。
②串口里校验经常使用的是奇偶校验。
③使用校验位的话,因为串口它要替你校验前面的数据位是不是产生错误,所以通信速度会慢一些。如果不用校验位,通信速度会快,但是数据产生错误以后没办法进行校验。校验位的电平是不确定的,可以是1也可以是0。(数据传输过程中不可避免出现错误,B站有给视频讲极化码,那个方法可以让数据几乎不可能出错) - Step5:停止位必须有,停止位的电平是确定的,是高电平。停止位表示一次通信的结束。
补充:
1、串口一次最多发一个字节,如果需要发10个字节,需要先发一个字节,发完之后停止下来,停止下来后再去发停止位,再去重复前面的过程。
2、不能发了一个字节后不停止,立即发下一个字节,这种情况是不允许的。
3、通过波特率去确定位数,通过高低电平确每一位的值。
怎么区分发送的是01还是0011:
- 串口通信中,波特率表示每秒传输的二进制位数,用于区分发送的是单个位还是多位。例如,波特率为1时,发送一个0需1秒,发送两个0需2秒,接收方通过计时来判断发送的位数。但如果发送方和接收方的时间基准不同(如发送方为1秒,接收方为0.9秒),会导致累计误差,最终使数据出错。
- 为了避免累计误差,串口通信规定每次最多发送一个字节(8位),这样即使有误差,也基本不会影响后续数据。发送完一个字节后,重新开始计时,之前的误差会被消除。串口通信采用异步时钟,即发送方和接收方各自有自己的时钟,时钟不同步会导致误差。
4、UART硬件连接
串口有两根线,一根是TXD用于发送数据,一根是RXD用于接收数据。
5、UART控制器
一般情况下处理器中都会集成UART控制器,我们使用UART进行通信时候只需对其内部的相关寄存器进行设置即可。