UART基本知识

  • Post author:
  • Post category:其他




UART串口协议

UART(Uinversal Asynchronous Receive/Transmitter):串行数据总线,用于异步通信,也叫通用异步收发传输器。该总线双向通信可以实现双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。



1、基本工作模式

在这里插入图片描述
串口因为结构简单,稳定可靠,广受欢迎。通过三根线即可,发送、接收、地线。

通过TxD->RxD把ARM开发板要发送的信息发送给PC机。 通过RxD->TxD线把PC机要发送的信息发送给ARM开发板。



2、通信协议

UART作为异步串口通信协议的一种,工作原理是将传输数据的每一个字符一位一位地传输。其中每一位(bit)的意义如下:

起始位:先发出一个逻辑“0”的信号,表示传输数据开始。

数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。

空闲位:处于逻辑“1”状态,表示当前线路上没有数据传输。

在这里插入图片描述


怎么发送一个字节的数据,比如“A”


即A’ 的ASCII值是Ox41,二进制就是01000001, 怎样把这8位数据发送给PC机呢?

首先,双方约定好波特率(每一位占据的时间),然后规定好传输协议,如上一节通信协议。

a. 原来是高电平, ARM拉低电平, 保持1bit时间;

b. PC在低电平开始处计时;

c. ARM根据数据依次驱动TxD的电平,同时PC依次读取RxD引脚电平,获得数据

前面图中提及到了逻辑电平, 也就是说代表信号1的引脚电平是人为规定的。 如图是TTL/CMOS逻辑电平下, 传输 ‘A’时的波形:

在这里插入图片描述

在xv至sv之间, 就认为是逻辑1’在ov至yV之间就为逻辑0。



中断控制

出现以下情况时,可使UART 产生中断:

FIFO 溢出错误

线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)

奇偶校验错误

帧错误(停止位不为1)

接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)

发送

接收

由于所有中断事件在发送到中断控制器之前会一起进行“或运算”操作,所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数UARTIntStatus( ),软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。



FIFO 操作

FIFO 是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操作。 Stellaris 系列ARM 的UART 模块包含有2 个16 字节的FIFO:一个用于发送,另一个用于接收。可以将两个FIFO 分别配置为以不同深度触发中断。可供选择的配置包括:1/8、 1/4、1/2、3/4 和7/8 深度。例如,如果接收FIFO 选择1/4,则在UART 接收到4 个数据时产生接收中断。

发送FIFO的基本工作过程: 只要有数据填充到发送FIFO 里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600 的波特率为例,等待出现一个空位的时间在1ms 上下。发送 FIFO 会按照填入数据的先后顺序把数据一个个发送出去,直到发送 FIFO 全空时为止。已发送完毕的数据会被自动清除,在发送FIFO 里同时会多出一个空位。

接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。

收发FIFO 主要是为了解决UART 收发中断过于频繁而导致CPU 效率不高的问题而引入的。在进行 UART 通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发 FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14 个)后才产生一次中断然后一并处理,这就大大提高了收发效率。

完全不必要担心FIFO 机制可能带来的数据丢失或得不到及时处理的问题,因为它已经帮你想到了收发过程中存在的任何问题,只要在初始化配置UART 后,就可以放心收发了, FIFO 和中断例程会自动搞定一切。



版权声明:本文为qq_45173769原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。