多学习,多喝水!
一、uart概述
1、基础概念
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。
2、硬件基础
UART有4个pin(VCC, GND, RX, TX), 用的TTL电平, 低电平为0(0V),高电平为1(3.3V或以上)。
-
TX:发送数据端,要接对面设备的RX
-
RX:接收数据端,要接对面设备的TX
-
GND:保证两设备共地,有统一的参考平面
3、基本原理
异步通信以一个字符为传输单位,数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。数据通信格式如下图:
其中各位的意义如下:
起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送
异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)
4、通信方式
1)工作模式
<1>中断模式
这就是说,当要收发数据时会向CPU发出中断请求,由CPU完成收发的工作
<2>DMA模式
这就是说,当要收发数据发出DMA请求,然后DMA向CPU发出总线请求,CPU将总线交给DMA之后,由DMA控制数据的收发工作。
2)数据收发方式
<1>使用FIFO(先入先出) 在发送端,首先检查对方是否请求发送以及FIFO是否已满,只有当对方有发送请求且FIFO未满的情况下,才会向FIFO写入数据,当FIFO数据达到一定数量是,就会进行中断请求或DMA请求,将数据通过移位寄存器发送出去。在接收端,通过移位寄存器将数据存入FIFO中。 在接收端,首先检查FIFO是否已满,如果FIFO未满,则可以发出请求发送信号。
<2>不使用FIFO 在发送端首先检查发送缓冲器是否为空以及是否有发送请求,如果发送缓冲区为空,就会向发送缓冲区写入数据,然后产生中断请求或DMA请求,将数据发送到接收端。当接收端的接收缓冲区接收到数据后,先读取数据,然后再次请求发送数据。 注:
FIFO 是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操作。
发送FIFO的基本工作过程: 只要有数据填充到发送FIFO 里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600 的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。
接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。
收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART 通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发 FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14 个)后才产生一次中断然后一并处理,这就大大提高了收发效率。