一、UART简介
UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,工作于数据链路层。包含了RS-232、RS-422、RS-485串口通信和红外(IrDA) 等等。UART协议作为一种低速通信协议,广泛应用于通信领域等各种场合。UART基本可分为并口通信及串口通信两种。
异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指针。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200字符/秒=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)
S3C2410的UART0和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 中有相应的标志位。
发送模式选择 [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状态 |