天天看点

uart总结一、前言二、uart协议三、编程策略

uart知识点汇总

  • 一、前言
  • 二、uart协议
  • 三、编程策略

一、前言

很久没有写博客了,不过并没有偷懒~前段时间在准备实习面试之类的,并没有把总结的东西发到博客上,这段时间正好在实习,立个flag,一周总结3-4篇文章,督促下自己。今天开始先从各种协议开始,打算陆续把uart,iic,spi(包括qspi),can,usb等协议都总结一遍,也为接下来的秋招做准备!

二、uart协议

首先,在学习串口的时候总会看到UART和USART,这里对两者做下说明。

UART:(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器

USART:(Universal Synchronous Asynchronous Receiver Transmitter)通用同步异步收发传输器

UART与USART都是单片机上的串口通信,从名字上也可以看出,USART相比于UART还多了一个同步的功能,也就会多了一个用于产生时钟同步信号的线。在不需要时钟信号的时候,USART就可以当做UART来用。

常见串口的电平标准主要有:TTL和RS-232,很久以前电脑上的DB9接口的串口就是采用RS-232的电平标准,在一些常见的电子电路内部则采用的是TTL的电平标准。采用RS-232电平标准的好处则是增加串口通讯的远距离传输及抗干扰能力。这是因为对于RS-232电平标准来说:-15V到-3V为逻辑高电平,3V到15V为逻辑低电平,较大的压差使得其抗干扰能力更强一些(RS-485/422的抗干扰能力更强一些),而TTL电平的传输速率更大一些。一般在芯片间通信时用TTL电平,设备间通信时用RS-232电平。现在的笔记本电脑基本上都用usb来替代了以前的DB9接口,因此通常用串口转usb后再与电脑进行通信。

对于通信协议的学习,我认为火哥的学习思路很好,任何协议无非包括物理层和协议层,所以学习通信协议从这里入手就可。因此,大致分这两个方面进行总结:

首先看物理层,从物理层可以看出通信协议的一些特性,如uart一共只有三个引脚,分别是RX,TX,GND。即有两条信号线,没有时钟线,这就表明了uart是一种异步,全双工的串行通信协议。异步则需要双方按照彼此规定好的波特率进行数据传输,全双工意味着其传输速率会略快一些。GND则是为了防止两个设备的地电平不一致造成数据错误,而使用的公共地。这就是我们从物理层得到的信息。

接下来再看协议层,协议层即数据传输的格式,比如我们要传输一字节的数据,这一字节的数据要经过怎样的加工变成最终发送的数据包。为什么需要进行加工,因为在空闲时数据线也是有电平存在的,如UART就是高电平,那么怎么判断什么时候收到了数据,这就需要起始信号和终止信号来表示数据开始和停止。那么数据又是否由于其他原因产生了异常,这就需要一个校验位来进行验证。对于串口协议来说,相关的数据格式已经在串口的相关寄存器中设定好了,一般情况下包括:起始位,数据位,奇偶校验位和停止位。对于异步通信来说,还要设定好数据传输的波特率,确保通信双方以相同的频率来收发数据。

通常一个数据包是以起始信号开始,直到停止信号结束。在UART通信中,空闲时数据线上为高电平,因此起始信号为一个位的低电平来表示即将传输数据。停止位则由0.5、1、1.5 或2个高电平来表示。起始信号和终止信号中间发送的就是数据和校验位了,对于UART的数据位可设置为5/6/7/8位数据,即一次可传输这么多数据,但是要记得UART是串行通信,他们是一位一位的经过移位寄存器放到缓冲区内。在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。

奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8 位长的有效数据为:01101001,此时总共有4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8 位的有效数据加上1 位的校验位总共9 位。

偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为4 个,所以偶校验位为“0”。

uart的数据格式如下图:

uart总结一、前言二、uart协议三、编程策略

接下来,再来看看uart的功能框图,更深入的了解下串口协议。

uart总结一、前言二、uart协议三、编程策略

这个是USART的功能框图,UART功能就是直接基于USART使用的,在第一部分的引脚中可以看到,这里除了正常我们使用的TX,RX,外还有CK这个我猜测应该就是用于同步的时钟信号吧, 剩下两条线分别是CTS,RTS分别用来允许发送数据和请求发送数据,都是在使用USART才用到的。在第二部分可以看出接收的数据是一位一位经过数据移位寄存器然后存入到内部的FIFO缓冲区内。 第三部分则是串口的一些相关寄存器。第四部分则是说明串口的时钟来源以及预分频系数,最终根据USART_BRR寄存器可计算出串口的波特率。在第三部分上方,可以看出串口还支持中断以及DMA功能。

三、编程策略

以下部分主要来自微信公众号:嵌入式客栈。

常见的三种UART编程方式包括:

1.查询发送/中断接收模式

2.收发中断模式

3.DMA 模式

为什么用查询发送却用中断接收呢,原因很简单,由于异步通信不确定什么时候会收到数据,所以需要用中断方式来得知收到了数据,用查询的话可想而知会消耗大量的cpu资源。另外,在用DMA模式的时候,会大大提高串口传输数据的效率。