您的位置:首页 > 其它

S5PV210之UART介绍

2016-10-07 18:56 134 查看

1.UART简介

通用异步收发器(Universal Asynchronous Receiver and Transmitter,UART )是处理器中最常用,最重要的部件之一,小到一般的单片机,大到高端的ARM处理器、FPGA等,可以用来实现不同处理器之间的数据通信,由于UART通过RXD和TXD实现收发数据,收发双方不需要进行时钟同步。因此也被称作异步收发器,最大传输速率可达到3Mbps;

1.1 UART的组成构造

UART包含了波特率发生器、发送器、接收器、控制单元这4个主要的部分,波特率发生器决定了UART数据的传输速率,而波特率发生器需要处理器为之提供时钟信号。而波特率发生器又为UART的收发器提供时钟信号,使收发器根据时钟的节拍来接收和发送数据。而控制单元则在总体上起着管理和协调作用,负责UART与数据总线之间的数据交互,对UART数据传输中出现的错误作出处理,控制收发器和控制波特率发生器的工作状态。在波特率发生器时钟脉冲的控制下,接收器将RXD端的数据串行的接收到接收移位寄存器中,并将接收到的数据位中去掉起始位和停止位并提取出真正的数据,而发生器则刚好相反。

在S5PV210中有四个独立的UART接口,均可以基于中断或者查询和基于DMA的方式传输数据,而波特率发生器的时钟源可以是PCLK_PSYS和SCLK_UART。



图1UART的构造图

对了,差点忘了说,那个FIFO(First In First Out)单元,常被用于数据传输速度不匹配的场合做为数据缓冲器,使CPU和UART之间进行数据缓存,减轻UART通信给CPU带来的延迟负担。

2.如何操作UART?

.数据发送

UART的数据发送是将预定义的数据按照一定的帧格式组合成数据包,并经过发送移位寄存器串行发送到TXD的过程,通过线控制寄存器ULCONn可配置数据帧的格式
发送的数据帧格式:
1位起始位
5-8位数据位
可选的奇偶校验位
1-2位的结束位

.数据接收

  数据接收就是UART从RXD端将数据位通过接收移位寄存器串行接收的过程,然后组成数据包,然后根据发送方的数据帧格式进行解包,提取出真正的数据。同时接收方也可以对收到的数据进行错误检查,包括溢出错误,奇偶校验错误,帧格式错误以及停止错误。
  溢出错误:指新接收到的数据将未被读取的旧数据覆盖的错误,当发生溢出错误时,错误寄存器UERSTAT第[0]位置1;
  奇偶校验错误:接收到的奇偶校验位于发出的奇偶校验位不一样,发生奇偶校验错误时,错误寄存器UERSTAT第[1]位置1;
  帧格式校验错误:指接收到的数据包不含有效的停止位,出现错误时。错误寄存器UERSTAT第[2]位置1;
  停止条件错误:数据接收端RXD的电平持续为"0"的时间超出了一个数据帧的时间长度。

.中断产生

  UART采用中断的机制查询各模块的工作状态,相比于用查询法,效率大大提高,在UART的串口通信中,存在7种不同类型的中断,大致有以下7中:溢出中断、奇偶校验错误中断、真错误中断、传输停止中断、接收缓存数据就绪中断、发送缓存空中断、以及发送移位寄存器空中断。

.波特率的产生

  波特率发生器主要是为了产生UART的时钟信号,其原理框图如下:



图2 波特率发生器时钟产生框图
根据上面的图可知,波特率发生器的输入时钟有两个来源,分别是PCLK和SCLK_UART,PCLK与定时器模块的时钟PCLK一样,来自外围时钟域的PSYS中的PCLK时钟信号,而SCLK_UART则来自其他9种时钟信号,看上图。可以通过配置时钟选择寄存器CLK_SRC来选择其中一个时钟信号作为之后的分频器的输入时钟,经分频器后就可以的带输出的CLK_UART时钟信号。通过配置UCON[10]来进行设置选择PCLK还是SCLK_UART作为UART的时钟信号。经选择器输出的信号称之为BCLK,BCLK经UCLK发生器之后输出UCLK,这个UCLK就是串口通信的时钟了。BCLK和UCLK之间存在时钟频率变换的关系,即UBRDIVn
= (int) (PCLK / (buad rate * 16) - 1) 或者 UBRDIVn = (int) (SCLK_UART / (buad rate) * 16) - 1);
以上来说,波特率发生器实际上就是一个分频器,UBRDIVn的值用来初始化波特率分频寄存器UBEDIVn的低16位。
而UDIVSLOTn的值为:[UDIVSLOTn]2数中"1"的个数 = 16 * [PCLK/SCLK_UART /(16 * buad rate)]小数部分
见图,其实是张表:



表1 UDIVSLOTn在不同情况下的推荐值
来看一下官方手册给出的一个例子吧!在40Mhz的时钟信号输入下,来看看是如何计算UBRDIVn和UDIVSLOT的,



图3 简单的UBRDIV和UDIVSLOT的ji

我也举个栗子说一下吧:假如PCLK_PSYS作为输入时钟时,时钟频率是66MHZ,UART波特率是115200bps,通过波特率公式可知
UBRDIV0 = (int) (PCLK / (buad rate * 16)) - 1 = (int)(35.8072) - 1 = 34;
[UDIVSLOT0]2中"1"的个数 =  16 * 0.8072 = 13,根据上表可知,UDIVCLOT0的值 = 0xDFDD(1101_1111_1101_1101b)

3.UART的工作模式

.中断或查询模式

  基于中断或查询模式是指UART在传输数据时,一个数据帧接收或者发送完毕时,UART将向CPU发送中断请求,若开启中断功能,开发者可以通过查询相应的状态寄存器来判断数据是否发送完成,数据收发的中断和查询模式可以通过UART控制寄存器UCONn来设置。

.MDA模式

  由于中断或者查询模式的数据传输效率低,因而采用了DMA模式,顾名思义,DMA即直接内存访问,DMA控制器允许不同速度的硬件装置之间进行数据传输,不需要依赖CPU的大量中断负载。

  当采用DMA模式时,需要借助收发缓冲寄存器,在UART接口中,UART0的FIFO容量是256个字节,而UART1的FIFO容量是64字节,UART2和UART3均是16个字节。
  DMA与普通方式的区别在于前者一次传输的字节数是可以配置的,可以是1个或者4字节,当收发器FIFO中缓存的数据达到了预定的处罚深度时,硬件将开启DMA传输,以突发方式传输FIFO中缓存的数据,直到传输的数据到达了设定的触发值时。通过UCONn可配置触发水平和突发方式传输的字节数。

.红外模式

  红外模式时UART在收发数据时所支持的一种模式,在数据收发时分别加入了一个红外模红外接收解码器和红外发送编码器,用于对数据帧进行解码以及预发送的数据帧进行编码。
  .环回模式
  主要用于调试和诊断,UART的数据发送端TXD将被数据接收端RXD接收,环回模式通过UART的控制寄存器UCONn[5]来控制。

.FIFO模式

  FIFO常被用于数据传输速度不匹配的场合中,起数据缓冲池的作用。在FIFO模式下,UART的预发送数据不是直接从数据总线通过发送移位寄存器到TXD端的,而是按照先进先出的方式将预发送的数据先写到FIFO单元,然后在波特率发生器时钟的作用状态下,FIFO中的数据再依次通过发送移位寄存器串行地输出到TXD端。因此CPU在数据发送时,只需要满足FIFO不溢出的情况下往FIFO中写入数据即可,不必等待数据是否发送完毕。对于接收,情况恰好相反,就不再赘述了。

 UART的FIFO控制寄存器UFCONn[0]来控制是否开启FIFO,一般而言,FIFO与DMA是一起使用的,可大大提高其数据传输效率。

4.UART的相关寄存器

UART涉及的寄存器足足有50多个,在这边只挑了11个常用的来探讨一下,其余的还请读者自行移步去看数据手册。

.线路控制寄存器ULCONn

URT的线路控制寄存器ULCONn主要作用是用来设置各个UART串口通信接口的数据帧的格式以及红外模式与正常模式的配置。4个ULCONn的状态的地址为:
    ULCON0, 可读写,物理地址:0xE2900000
    ULCON1, 可读写,物理地址:0xE2900400
    ULCON2, 可读写,物理地址:0xE2900800
    ULCON3, 可读写,物理地址:0xE2900C00

上图:



图4 ULCONn寄存器相关配置
在此寄存器中可以设置是否使用红外模式、数据帧的校验类型、数据帧停止位的位数、以及有效数据的位数。

.UART控制寄存器UCONn

涉及了UART串口通信的各个方面,包括时钟的选择,数据收发方式的设置、收发中断类型的配置、DMA模式下的数据突发方式字节数大小的设置等。

    UCON0,
可读写,物理地址:0xE2900004
    UCON1, 可读写,物理地址:0xE2900404
    UCON2, 可读写,物理地址:0xE2900804

    UCON3,
可读写,物理地址:0xE2900C04







图5 UCONn寄存器相关配置
此寄存器主要是用来配置以下选项
1>.UCON[20]可配置突发方式发送的字节数,1或者4个字节
2>.UCON[16]可配置突发方式接收的字节数,1或者4个字节
3>.UCON[10]选择使用PCLK还是SCLK_UART作为波特率发生器的输入时钟
4>.UCON[9:8]分别配置发送和接收中断的触发方式,在此只可以使用电平触发
5>.UCON[7]配置在FIFO模式下,使能/禁止接收时间超时中断
6>.UCON[6]UART接收错误状态使能产生中断
7>.UCON[5]回环模式,主要用于测试
8>.UCON[4]发送停止信号
9>.UCON[3:2]发送数据模式,指定以何种模式发送数据到缓冲器中。
10>.UCON[0]接收数据模式,指定以何种模式从缓冲器中接收数据。
这样看来,这个寄存器的功能确实很强大,可以做很多事情。
ps:S5PV210处理的中断控制信号只能使用电平触发,因此收发数据中断触发方式只能设置成电平触发方式。即UCON[9:8]均为1.

pps:在DMA模式下,当UART接收的数据并没有到达FIFO触发的深度并在3个字长的时间段内未接收到任何数据,此时UART将产生接收超时中断,用户必须检查FIFO的状态并将读取的数据从FIFO寄存器中读取出来。

.UART FIFO控制寄存器UFCONn

这个寄存器主要用来对收发缓冲寄存器FIFO单元进行相关功能的配置

    UFCON0, 可读写,物理地址:0xE2900008

    UFCON1, 可读写,物理地址:0xE2900408

    UFCON2, 可读写,物理地址:0xE2900808

    UFCON3, 可读写,物理地址:0xE2900C08







图6 UFCONn寄存器的相关配置
UFCONn寄存器可以配置发送FIFO触发深度和接收FIFO触发深度,以及发送FIFO和接收FIFO复位,使能FIFO。

再来几个只读状态寄存器

.UART收发状态寄存器UTRSTATn

UTRSTATn的作用在于实时地指示缓冲寄存器的状态
UTRSTAT0, 只读, 物理地址:0xE2900010
UTRSTAT0, 只读, 物理地址:0xE2900410
UTRSTAT0, 只读, 物理地址:0xE2900810
UTRSTAT0, 只读, 物理地址:0xE2900C10



图7 UTRSTAT寄存器相关配置
通过这个寄存器可以查看UART的状态,主要是发生器是否为空,发送缓冲器是否为空,接收缓冲数据就绪。
可用语句while (!(UTRSTATn & (1 << 2)));来判断UARTn发送的数据是否发送完毕。

可用语句while (!(UTRSTATn & (1 << 0)));来判断UARTn发送的数据是否接收到有效数据。

.UART错误状态寄存器UERSTATn

主要是用来标记UART在串口通信过程中出现的各种错误,具体的错误类型不再赘述。
UERSTAT0, 只读, 物理地址:0xE2900014
UERSTAT1,  只读, 物理地址:0xE2900414
UERSTAT2,  只读, 物理地址:0xE2900814
UERSTAT3,  只读, 物理地址:0xE2900C14

当错误标志被读取后,UERSTATn的低四位自动清0.



图8 UERSTAT寄存器相关配置

查看此寄存器可以判断是停止检测,有无帧错误、校验错误、溢出错误。

.UART FIFO状态寄存器UFSTATn

当开启了FIFO模式后,在使用FIFO缓冲寄存器进行收发数据的过程中,UART FIFO状态寄存器UFSTATn来反映各个FIFO的工作状态,其中包括了FIFO是否已满的标志,收发FIFO当前的数据量以及
接收FIFO的错误标志。
UFSTAT0, 只读, 物理地址:0xE2900018
UFSTAT1,  只读, 物理地址:0xE2900418
UFSTAT2,  只读, 物理地址:0xE2900818
UFSTAT3,  只读, 物理地址:0xE2900C18



图9 UFSTAT寄存器相关配置
可查看发送FIFO和接受FIFO中的数据字节数量,接收FIFO有无错误,接收FIFO是否为滿

.UART接收缓冲寄存器URXHn

用来缓存从接收移位寄存器中接收到的数据,等待CPU来读取
URXR0,   只读, 物理地址:0xE2900024
URXR1,   只读, 物理地址:0xE2900424
URXR2,   只读, 物理地址:0xE2900824

URXR3,   只读, 物理地址:0xE2900C24



图10 URXHn寄存器相关配置

UART接收到的数据即缓存在URXHn的低8位,直接读取该数据即可。
当然在非FIFO模式下,FIFO接收缓存寄存器的第一个字节就是URXHn寄存器,可用如下语句来读取数据:
unsigned c;
while (!(UTRSTATn & (1 << 0)));//等待接收到有效数据
c = URXHn;

.UART发送缓冲器寄存器UTXHn

用来缓存和保持预发送的数据,UTXHn的数据最终通过发送移位寄存器串行地发送到TXD端。
UTXH0,   只读, 物理地址:0xE2900020
UTXH1,   只读, 物理地址:0xE2900420

UTXH2,   只读, 物理地址:0xE2900820

UTXH3,   只读, 物理地址:0xE2900C20



图11 UTXHn寄存器相关配置

预发送的数据将被缓存在UTXHn的低8位。

当然在非FIFO模式下,FIFO发送缓存寄存器的第一个字节就是UTXHn寄存器,可用如下语句来读取数据:
unsigned c;
while (!(UTRSTATn & (1 << 2)));//等待接收到有效数据
URXHn = c;

.UART波特率分频寄存器UBRDIVn

在给定的输入时钟频率和要求的波特率情况下,为波特率发生器提供正确的时钟分频系数,当给波特率发生器设定好恰当的波特率分频系数后,比特率发送器将产生所要求的波特率时钟信号。
UBRDIV0,   可读写, 物理地址:0xE2900028
UBRDIV1,   可读写, 物理地址:0xE2900428
UBRDIV2,   可读写, 物理地址:0xE2900828
UBRDIV3,   可读写, 物理地址:0xE2900C28



图12UBRDIVn寄存器相关配置
UBRDIV[15:0]用来设置波特率的分频系数,决定着分频系数的整数部分。

.UART波特率分频槽寄存器UDIVSLOTn

分频槽控制寄存器UDIVSLOTn主要是为了提高波特率发生器所产生的UART时钟的精确度
UBRDSLOT0,   可读写, 物理地址:0xE290002C
UBRDSLOT1,   可读写, 物理地址:0xE290042C
UBRDSLOT2,   可读写, 物理地址:0xE290082C
UBRDSLOT3,   可读写, 物理地址:0xE2900C2C



图13UBRDSLOTn寄存器相关配置

UBRDIV[15:0]用来从表1中选择恰当的槽值。决定着分频系数的小数部分,具体怎样计算,上面已述说,不再赘述了。

PS:当UBRDIVn的值为0时,UART的波特率不被UDIVSLOTn所影响,在此处理器中UART的波特率不仅与UBRDIVn的值有关,还与UDIVSLOT的值有关,其中前者决定波特率分频系数的整数部分,
UBRDSLOTn则逼近波特率分频系数的小数部分。

.UART调制解调控制寄存器UMCONn

主要用于配置UART的自动流控制功能,仅有3个对应的寄存器
UMCON0,  
可读写,物理地址:0xE290000C
UMCON1,  
可读写,物理地址:0xE290040C

UMCON1,  可读写,物理地址:0xE290080C





图14UMCONn寄存器相关配置

发送请求发深度触发信号通过接收移位寄存器的触发深度配置发送请求信号,当自动流控制信号有效且接收移位寄存器里的数据大于触发水平时,将检测发送请求信号;还有配置自动流控制信号,调制解调中断使能;当AFC=1时,RTS信号将被忽略,处理器自动控制nRTS信号,当AFC=0时,必须通过软件来控制nRTS信号。

好了,大概就先说到这里吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arm处理器 通信