总线基础--UART

欢迎转载,转载请注明出处。

前言

前面介绍了I2C和SPI的基本知识,本章介绍一下UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器,UART用于计算机内部与外部设备之间的通信,计算机内部数据传输都是并行的,但外部设备的数据传输往往都是串行的,这样就需要一个芯片去作为媒介,去解决这一问题。UART就可实现这一功能,UART将计算机内部的并行数据转化为串行输出,并将外部设备的串行数据转化为并行输入,从某种意义上来说,UART只能算是一个“器件”,并不算真正意义上的总线,但其作为通信协议的一种,就放到这一专题去讲。

定义

UART是Universal Asynchronous Receiver/Transmitter(通用异步收发器)的简称,是一种全双工,异步通信接口,工作于数据链路层,支持RS232、RS485等规范电路。虽然UART可以实现串并行数据的转换,但UART依然是串行接口。

  • 串并行数据转换
    计算机内部是按并行方式传送数据的,但外部设备一般是按串行方式处理数据;当计算机采用串行方式与外部通信时,必须进行串并行变换。发送数据时,需通过并行输入、串行输出移位寄存器将CPU送来的并行数据转换成串行数据后,在发送到外部设备;接收数据时,则需经过串行输入、并行输出移位寄存器,将将接收到的串行数据转换成并行数据后送到CPU去。
  • 全双工,异步
    UART有发送和接收引脚,可以同时进行数据的收发;I2C和SPI总线工作于同步方式,主设备和从设备使用的都是同一时钟信号,发送数据先发送一个“同步信号”,例如I2C先发送从设备地址,SPI先发送片选信号;因为主从设备使用的是同一时钟信号,两个节奏保持一致,所以当主从设备通信建立完成后,就开始发送一块数据,直到数据发送结束,中途都不在需要起始位和停止位;但异步方式就有所不同,发送的字符与字符之间的时间间隔是不定的,接收方不知道数据会在何时来临,所以必须时刻做好准备,这也就要求在发送的每个字符上都加上起始位和停止位,这样接收方才能准确的把数据接收下来。
  • 引脚说明
    以RS232为例,串口引脚有9脚和25脚两种,25脚主要用于早期设备,现已逐渐淘汰;实际使用中,一般只需三根线(发送、接收和接地)就能实现数据收发,讲设备的TXD/RXD与计算机的RXD/TXD连在一起,就能实现全双工传输。从表中也能看出,没有时钟线,所以UART是异步传输的。在收集资料的时候,看到一篇关于引脚说明的文章,讲的比较详细,感兴趣的可以去看看。设备监控技术详解

    引脚定义

  • UART、USART和SCI区分
    市场上有只支持异步通信和同时支持异步与同步通信的两种硬件可用于UART。前者就是UART名字本身的含义,在Motorola微控制器中被称为串行通信接口(SCI);Microchip微控制器中的通用同步异步收发器(USART)和在富士通微控制器中的UART是后者的两个典型例子。

    • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步异步收发器,既可以工作于异步方式,也可以工作于同步方式;既然可以工作于同步方式,那就需要同步时钟,USART带有时钟发生器,可以提供主时钟。
    • SCI(Serial Communication Interface)串行通信接口,是相对于并行通信来说的,是串行通信技术的总称,最早由Motorola公司提出的。从某种意义上来说,UART也可以说是SCI的一种,SCI的通信协议主要体现在数据格式上,在SCI中,将带有格式信息的数据字符称作一帧数据,数据格式主要包括1位起始位、1~8位数据位、1位奇偶校验位、1~2位停止位以及区分地址和数据的附加位,这些都可以通过SCI的通信控制寄存器SCICCR来进行设置,规定通信过程中所使用的数据格式。
  • RS232/RS485
    RS232和RS485都是串行通信中的一种物理接口电气标准,规定传输介质(电缆)、收发电平等,其实UART只是一种通信协议,具体的数据传输需要专门的传输电路去做;UART工作于数据链路层,RS232/RS485工作于物理层,从这里也能看出RS232/RS485和UART是相对独立的。例如:RS232规定了信号传输电平;逻辑高电平,有负载时为-3V~-15V,无负载时为-25V;逻辑低电平,有负载时为+3V~+15V,无负载时为+25V。一般在个人台式计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。但RS232只能用于点对点的通信,不能联网功能,而且如今大多计算机本身及I/O接口芯片都采用TTL电平(0~0.8V为逻辑0,+2.0V~+5V为逻辑1),所以使用RS232时,必须设计专门的电平转换电路。

    在这些条件限制下,新的接口标准RS485就产生了。RS485以两线间的电压差为+(2-6) V表示逻辑1;以两线间的电压差为-(2-6)V表示逻辑0。接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。

通信协议

  • 数据格式
    因为UART是异步传输,所以传输的每个字符都需要特定的格式;为了保证传输正确,UART为自己定义了数据格式。对于每一个传输的字符,数据格式都可以用下面的数据位定义。

    异步串行数据格式

    • 起始位:当有数据要发送时,数据信号线变成低电平,并持续一段时间,用于表示字符的开始,这一位称为起始位。
    • 数据位:紧接着起始位之后。在信号线上会依次出现待发送的每一位字符,最低有效位D0最先出现,因此它最早被发送出去。采用不同的编码方案,数据位的个数不同,数据位的个数可以是4、5、6、7、8等;当字符用ASCII码表示时,数据位占7位(D0~D7)。
    • 奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性,例如数据传输采用奇校验时,如果数据“1”的个数是奇数,这一位就被置为“0”,反之置为“1”。当然系统中也可以不采用奇偶校验。
    • 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。奇偶校验位的后面至少应该有一位高电平表示停止位,如果传输完一个字符后立即传输下一个字符,那么后一个字符的起始位就紧跟着前一个字符的停止位,否则停止位后又进入一个空闲状态。
    • 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送。

    串口工具配置

由此可见,异步方式发送一个7位的ASCII字符时,实际发送10位,10.5位或11位。如果采用10位来发送的话,就意味着发送过程中,将会有30%的传输时间被浪费;如果是同步传输就不会出现这一问题。

  • 波特率
    波特率用来表示数据传输的速率,在计算机中把每秒钟内所传送的数据位数称为波特率,例如如果波特率设为9600,每个字符由1个起始位、7个数据位、1个奇偶校验位和1个停止位等10个数据位组成,则每秒可以传输9600/10=960个字符。

工作原理

  • 基本结构

    UART基本结构

    • 输出缓冲寄存器:接收CPU从数据总线上送来的并行数据,并加以保存。
    • 输出移位寄存器:接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出。
    • 输入移位寄存器:以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。
    • 输入缓冲寄存器:从输入移位寄存器中接收并行数据,然后由CPU取走。
    • 控制寄存器:接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。
    • 状态寄存器:存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置“1”,以便让CPU查询。
  • 接收数据
    UART接收数据时,接收电路始终监视着串行输入端RxD,当发现数据线上出现一个起始位时,就开始一个字符的接收过程,在按相应的格式将串行数据转换成并行数据,送入输入缓冲寄存器,等CPU来读取。
    如果设置了奇偶校验位,在传输工程中还能进行奇偶检验;还能自动检测每个字符的停止位,若无停止位,则置帧出错标志FRERR。
  • 发送数据
    UART发送数据时,输出缓冲器把来自CPU的并行数据加上相应的控制信息(起始位,奇偶检验位,停止位等),再在时钟脉冲的控制下,经并/串转换电路,转换成串行数据后,从TxD引脚一位一位地发送出去。为了让CPU正确控制数据的接收与发送,电路中还设有接收就绪和发送缓冲器空等状态信息。
  • 工作模式
    UART在接收数据时有两种常用的方式,中断和轮询;中断监测到有数据接收时,产生接收中断,去处理数据;轮询即每隔一段时间就来监测一下有没有数据接收,有就处理。

    • 中断
      UART通信时,中断方式是一种比较高效的方式,当有数据需要接收时,就会触发中断去处理数据,及时把缓冲区数据取走;早期没有FIFO时,UART是每次收发一个字符就产生一次中断,这种频繁的中断操作,显然会给CPU带来负担;但有了FIFO后,就可以在收发多个数据后,再触发中断,然后统一处理,这就很大程度上提高了收发效率;一般是在FIFO满了之后会触发中断,但如果数据量比较少或者发送端传送数据间隔时间比较长,会有超时中断来处理数据。
    • 轮询
      轮询方式就是每隔一定时间就来检测一下有没有数据需要处理,这种方式相对于中断来说,实时性就差了很多;而且对于没有FIFO的设备来说,如果字符没有被及时的取走,就会被后面的数据覆盖而导致数据出错。所以轮询操作一般用于对数据处理实时性要求不是很高,或者频繁的中断操作对CPU影响较大的场合。但有了FIFO之后,轮询方式容易丢失数据的问题,就得到了很大的改善。

    总结

    UART是计算机中串行通信端口的关键部分,作为SCI(串行通信接口)的一种极具代表性的接口,使用场合比较多。这里顺便提一下,UART 一般都有一个回环(Loopback)模式,用于诊断或调试。在回环模式下,从Tx 上发送的数据将被Rx 输入端接收,这在串口调试时比较实用。