Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1268923
  • 博文数量: 160
  • 博客积分: 4132
  • 博客等级: 中校
  • 技术积分: 2086
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 21:56
文章分类

全部博文(160)

文章存档

2012年(25)

2011年(120)

2010年(15)

分类: 嵌入式

2011-01-19 17:04:38

转自:http://blogold.chinaunix.net/u1/58203/showart_492196.html


一、UART简介

 

       UARTUniversal Asynchronous Receiver/Transmitter)即通用异步收发传输器,工作于数据链路层。包含了RS232RS422RS485串口通信和红外(IrDA) 等等。UART协议作为一种低速通信协议,广泛应用于通信领域等各种场合。UART基本可分为并口通信及串口通信两种。

 

         异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。图给出了其工作模式:

 

其中各位的意义如下:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:紧接着起始位之后。资料位的个数可以是45678等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指针。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×1201200字符/秒=1200波特

 

2:RS-232简介

 

    RS-232串口通信是UART采用频繁的一种,一般的PC机上都带有两个基于RS-232的串口。

RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。RS-232只限于PC串口和设备间点对点的通信。它有两种模式DB-9(9针接口) 和DB-25(25针接口),支持全双工通信。

      RS-232完成通信一般使用3根线:1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。其模型图(DB-9)如下:

                           

RS-232针脚的功能:

数据:                                           地线:
TXD(pin 3):串口数据输出(Transmitter)        GND(pin 5):地线
RXD(pin 2):串口数据输入(Receiver)


握手:
RTS(pin 7):发送数据请求
CTS(pin 8):清除发送
DSR(pin 6):数据发送就绪
DCD(pin 1):数据载波检测
DTR(pin 4):数据终端就绪


其他
RI(pin 9):铃声指示

 

3:握手协议
RS-232通行方式允许简单连接三线:Tx、Rx和地线。但是对于数据传输,双方必须对数据定时采用使用相同的波特率。尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情况这种使用受到限制。这时需要串口的握手功能。RS-232有三种最常用握手形式:软件握手、硬件握手和Xmodem

对于软件握手和硬件握手就不做讨论,主要了解bootloader中用到的Xmodem传输协议

Xmodem

XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。

4:S3C2410中UART的数据资料

S3C2410中提供三个独立的异步收发串口,能运转在中断或DMA模式下。系统支持最高波特率 230.4K bps,每个UART 信道都包含两个16位的FIFOs(first in first out)用于收发。每个串口都包含可编程的波特率,红外收发,1~2个停止位,5~8个数据位,和奇偶校正位,UART由波特率发生器,收发单位和控制单元构成。

自动控制流模式(AFC)

S3C2410UART0和UART1都可以通过各自的nRTS和nCTS信号来实现自动流控。

禁止自动流控制可以通过写UMCONn register and control the signal of nRTS by software
在自动流控(AFC)模式下nRTS取决于接收端的状态,而nCTS控制了发送端的操作。具体地说:只有当nCTS有效时(表明接收方的FIFO已经准备就绪来接收资料了),UART才会将FIFO中的资料发送出去。在UART接收资料之前,只要当接收FIFO有至少2-byte空余的时候,nRTS就会被置为有效。

NOTE: UART 2 does not support AFC function, because the S3C2410X has no nRTS2 and nCTS2

中断/DMA请求产生
S3C2410
的每个UART都有7种状态,分别是:溢出覆盖(Overrun)错误、奇偶校验错误、帧出错、断线错误、接收就绪、发送缓冲空闲、发送移位器空闲。它们在UART状态寄存器 UTRSTATn / UERSTATn 中有相应的标志位。

波特率发生器
每个UART控制器都有各自的波特率发生器来产生发送和接收资料所用的序列时钟,波特率发生器的时钟源可以CPU内部的系统时钟,也可以从CPU的 UCLK 管脚由外部取得时钟信号,并且可以通过 UCONn 选择各自的时钟源。
波特率产生的具体计算方法如下:
当选择CPU内部时钟时:
UBRDIVn=(int)(PCLK/(bps*16))-1,bps为所需要的波特率值,PCLK为CPU内部外设总线(APB)的工作时钟。
当需要得到更精确的波特率时,可以选择由 UCLK 引入的外部时钟来生成。
UBRDIVn=(int)(UCLK/(bps*16))-1

LoopBack操作模式
S3C2410
 CPU的UART提供了一种测试模式,也就是这里所说的LoopBack模式。在设计系统的具体应用时,为了判断通讯故障是由于外部的数据链路上的问题,还是CPU内驱动程序或CPU本身的问题,这就需要采用LoopBack模式来进行测试。在LoopBack模式中,资料发送端TXD在UART内部就从逻辑上与接收端RXD连在一起,并可以来验证资料的收发是否正常

UART控制寄存器

1:ULCONn (UART Line Control Register)

保留位 [7]  

红外模式选择位 【6】                    0 = Normal mode operation(基本模式)

                                                    1 = Infra-Red Tx/Rx mode(红外模式)

 

奇偶校正模式选择  [5:3]                0xx = No parity  (不设置)

                                                   100 = Odd parity  (奇校正)

                                                   101 = Even parity    (偶校正)

                                                   110 = Parity forced/checked as 1

                                                   111 = Parity forced/checked as 0

 

停止位设置 [2]                             0 = One stop bit per frame(每祯一个停止位)

                                                  1 = Two stop bit per frame (每祯两个停止位)

 

数据位长度[1:0]                             00 = 5-bits      01 = 6-bits

                                                   10 = 7-bits       11 = 8-bits

2:UART CONTROL REGISTER

 

选择时钟源: [10]        0=PCLK : UBRDIVn = (int)(PCLK / (bps x 16) ) -1

                                  1=UCLK(@GPH8) : UBRDIVn = (int)(UCLK / (bps x 16) ) -1

 

发送中断类型选择 [9]    0 = 脉冲式中断 (Interrupt is requested as soon as the Tx buffer becomes

empty in Non-FIFO mode or reaches Tx FIFO Trigger Level in FIFO

mode.)

                                  1 =电平式中断(Interrupt is requested while Tx buffer is empty in Non-FIFO

mode or reaches Tx FIFO Trigger Level in FIFO mode.)

 

接收中断类型选择   [8]  0 = Pulse (脉冲式/边沿式中断。非FIFO模式时,一旦接收缓冲区中有资料,即产生一个中断;为FIFO模式时,一旦当FIFO中的资料达到一定的触发水平后,即产生一个中断)

                                 1 = Level (电平模式中断。非FIFO模式时,只要接收缓冲区中有资料,即产生中断;为FIFO模式时,只要FIFO中的资料达到触发水平后,即产生中断.)

 

接收超时中断使能   [7]   0 = Disable 1 = Enable

 

接收错误中断使能  [6]   0 = Do not generate receive error status interrupt.

                                  1 = Generate receive error status interrupt.

 

Loopback Mode(使能该位使其处于进入测试模式)    

                            [5]    0 = Normal operation 1 = Loopback mode

 

选择发送暂停信号 [4]   (在发送完该位的后,自动清零)

                                   0 = Normal transmit 1 = Send break signal

发送模式选择        [3:2]    00 = Disable

                                     01 = Interrupt request or polling mode

                                     10 = DMA0 request (Only for UART0),

                                     DMA3 request (Only for UART2)

                                      11 = DMA1 request (Only for UART1)

 

接收模式选择         [1:0]  00 = Disable

                                        01 = Interrupt request or polling mode

                                       10 = DMA0 request (Only for UART0),

                                       DMA3 request (Only for UART2)

                                       11 = DMA1 request (Only for UART1)

 

3:UART FIFO CONTROL REGISTER

选择发送FIFO的触发水平[7:6]  00 = Empty 01 = 4-byte
                                             10 = 8-byte 11 = 12-byte

选择接收FIFO的触发水平 [5:4]  00 = 4-byte 01 = 8-byte
                                             10 = 12-byte 11 = 16-byte

Reserved          [3]

选择当复位发送FIFO时是否自动清除FIFO中的内容

                       [2] 0 = Normal 1= Tx FIFO reset

选择当复位接收FIFO时是否自动清除FIFO中的内容

                       [1]  0 = Normal 1= Rx FIFO reset

FIFO使能选择  [0]  0 = Disable 1 = Enable 0


 

4:UART MODEM CONTROL REGISTER(UART2不支持AFC)

 

Reserved                    [7:5]          保留位但必须为 000

自动控制流使能选择: [4]        0 = Disable 1 = Enable 0

Reserved                    [3:1]           保留位必须位000              

接收请求位选择          [0]          如果AFC使能该位被忽视,那种情况下S3C2410X UART接收由nRTS自动控制,但是如果AFC禁止,  nRTS 必须由该位设置

                                                0 = 'H' level (Inactivate nRTS) 1 = 'L' level (Activate nRTS)

 

5:UART TX/RX STATUS REGISTER

Transmitter empty      [2] 当发送缓冲器中已经没有有效资料时,自动置“1”;反之表明尚有资料未发送

 

Transmit buffer empty [1] 当发送缓冲寄存器中为空,自动置“1”;反之表明缓冲器中正有资料等待发送

 

Receive buffer data ready [0]  当接收缓冲寄存器从UART接收端口接收到有效资料时将自动置“1”。反之为“0”则表示缓冲器中没有资料

 

 

6:UART ERROR STATUS REGISTER(初始时其自动为【3:0】=0000)

Reserved  [3]  保留位

帧错误     [2]  自动置1当发生帧错误

                   

Reserved [1] 保留位

溢出中断 [0] 如果发生溢出错误自动置1

 

 

7:UART FIFO STATUS REGISTER

 

Reserved            [15:10] 保留位

Tx FIFO Full       [9] 为“1“表明接收FIFO已满

Rx FIFO Full       [8] 为“1“表明接收FIFO已满

Tx FIFO Count    [7:4] 发送FIFO中当前存放的字节数
Rx FIFO Count   [3:0] 接收FIFO中当前存放的字节数

 

8:UART MODEM STATUS REGISTER

 

Reserved         [3]     保留

Delta CTS        [2]    指示自从上次CPU访问该位后,nCTS的状态有无发生改变。
为“0”则说明不曾改变;反之表明nCTS信号已经变化了

Clear to Send   [0]    为“0”表示CTS无效;为“1”表示CTS有效

 

 

9:UTXHn 和 URXHn 分别是UART发送和接收资料寄存器
这两个寄存器存放着发送和接收的资料,当然只有一个字节8位资料。需要注意的是在发生溢出错误的时候,接收的资料必须要被读出来,否则会引发下次溢出错误

10:UBRDIVn :(UART Baud Rate Divisor Register)

 
关于UART波特率的计算方法,在前面的内容中已经有详细的阐述,此处不做多余说明。

小结读写状态寄存器UTRSTAT 以及错误状态寄存UERSTAT,可以反映芯片目前的读写状态以及错误类型。FIFO 状态寄存器UFSTAT 和MODEM 状态寄存器UMSTAT,通过前者可以读出目前FIFO 是否满以及其中的字节数;通过后者可以读出目前MODEM 的CTS状态

阅读(2800) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~