资源描述
UART异步串行口
UART异步串行口简介
数据通信的基本方式可分为并行通信与串行通信两种:
Ø 并行通信:是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速
度快,适用于短距离通信,但要求通讯速率较高的应用场合。
Ø 串行通信:是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利
用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场
合。
UART 异步串行口的传输格式
异步通信以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然
而在同一个字符中的两个相邻位代码间的时间间隔是固定的。
通信协议(通信规程):是指通信双方约定的一些规则。在使用异步串口传送一个
字符的信息时,对资料格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验
位、停止位。通讯时序图如下:
Ø 开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为
起始位,然后出现在通信线上的是字符的二进制编码数据。
Ø 每个字符的数据位长可以约定为5 位、6 位、7 位或8 位,一般采用ASCII 编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇
数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。
Ø 最后是表示停止位的“1”信号,这个停止位可以约定持续1 位、1.5 位或2 位
的时间宽度。
Ø 至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,
下一个字符开始传送才又发出起始位。
Ø 每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特
率为110,150,300,600,1200,2400,4800,9600 ,19200,38400,115200等。
S3C2410的异步串行口
11
S3C2410 的UART(通用异步串行口)单元提供三个独立的异步串行I/O 端口,每个都可以在中断和DMA 两种模式下进行。UART支持的最高波特率达230.4kbps。每个UART通道包含2 个16 位FIFO 分别提供给接收和发送。
每个UART 包含波特率发生器,接收器,发送器和控制单元。。波特率发生器以PCLK或UCLK为时钟源。 发送器和接收器包含16 字节FIFO 寄存器和移位寄存器,当发送数据的时候,数据先写到FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO 中。
异步串行口的操作
Ø 数据发送操作
数据发送帧的格式是可编程的,它包含一个开始位,5 到8 个数据位,一个可选的奇偶位和一个或两个停止位,这些可以通过线性控制器(ULCONn)来设置。发送器也能够产生发送中止条件。中止条件迫使串口输出保持在逻辑0 状态,这种状态保持一个传输帧的时间长度。通常在一帧传输数据完整地传输完之后,在通过这个全0 状态将中止信号发送给对方。中止信号发送之后,传送数据连续放到FIFO 中(在不使用FIFO 模式下,将被放到输出保持寄存器)。
Ø 数据接收操作
与数据发送一样,数据接收的帧也是可以编程的,它包含一个开始位,5 到8 个
数据,一个可选的奇偶位和一位或两位停止位,它们都是通过线性控制器(ULCONn)
来设置的。
接收器能够检测溢出错误,奇偶校验错误,帧错误和中止状况,每种情况下都将
会将一个错误标志置位。
UART 异步串行口的波特率发生器
每个UART 的波特率发生器为传输提供了串行移位时钟。波特率产生器的时钟源可以从S3C2410 的内部系统时钟或UCLK 中来选择。。波特率由时钟源(PCLK 或UCLK)16 分频然后被UART 波特率除数寄存器(UBRDIVn)指定的16 位除数决定。因此,UBRDIVn 的值可以按照下式确定:
UBRDIVn=(int)(PCLK/(bps*16))-1 , 其中bps为波特率。
例如,如果波特率为115200bps 且PCLK 或UCLK 为40MHz,则UBRDIVn 为:
UBRDIVn =(int)(40000000)(115200*16))-1
= (int)(21.7)-1
= 21-1 = 20
UART异步串行口波特率发生器的误差极限
UART传输10bit数据的时间误差应该小于1.87%(3/160)。
tUPCLK = (UBRDIVn + 1) x 16 x 10 / PCLK 实际的传输10bit所需时间。
tUEXACT = 10 / baud-rate 理想情况下传输10位需要的时间。
UART error=(tUPCLK – tUEXACT) / tUEXACT x 100%
异步串行口的相关寄存器
Ø 线路控制寄存器(ULCON)
线性控制寄存器,主要用来规定传输帧的格式。下面表格是线控制寄存器的地址
和位定义:
寄存器
地址
读/写
描述
重置值
ULCON0
0x50000000
读/写
UART通道0线路控制寄存器
0x00
ULCON1
0x50004000
读/写
UART通道1线路控制寄存器
0x00
ULCON2
0x50008000
读/写
UART通道2线路控制寄存器
0x00
ULCONn
位
描述
初始状态
保留
[7]
0
Infra-Red Mode
[6]
决定是否用红外模式。
0 = 正常模式操作
1 = 红外Tx/Rx模式
0
Parity Mode
[5:3]
指定奇偶产生的类型并在UART的传输与接收操作中检查。
0xx = 非奇偶
100 = 奇
101 = 偶
110 = 强制奇偶/选中为1
111 = 强制奇偶/选中为0
000
Number of Stop Bit
[2]
指定多少个停止位将被使用对于帧结束信号。
0 = 每帧一个停止位
1 = 每帧两个停止位
0
Word Length
[1:0]
显示每帧传输或接收的数据位的数目。
00 = 5位,01 = 6位
10 = 7位,11 = 8位
00
Ø 控制寄存器(UCON)
寄存器
地址
读/写
描述
重置值
UCON0
0x50000004
读/写
UART通道0控制寄存器
0x00
UCON1
0x50004004
读/写
UART通道1控制寄存器
0x00
UCON2
0x50008004
读/写
UART通道2控制寄存器
0x00
UCONn
位
描述
初始状态
Clock Selection
[10]
选择PCLK或UCLK对于UART的波特率。
0=PCLK : UBRDIVn = (int)(PCLK / (bps x 16) ) -1
1=UCLK(@GPH8) : UBRDIVn = (int)(UCLK / (bps x 16) ) -1
0
Tx Interrupt Type
[9]
中断请求类型。
0 = 脉冲型(当Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)
1 = 电平型(当Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)
0
Rx Interrupt Type
[8]
中断请求类型。
0 = 脉冲型(当Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)
1 = 电平型(当Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。)
0
Rx Time Out Enable
[7]
当UART的输入输出被使能时,使Rx的定时中断使能/失能。这个中断是一个接收中断。 0 = 失能,1 = 使能
0
Rx Error Status Interrupt Enable
[6]
使UART在一个例外上产生中断是使能的,例如一个暂停,帧出错,奇偶出错或溢出出错在一个接收操作中。
0 = 不产生接收出错的状态中断
1 = 产生接收出错的状态中断
0
Loopback Mode
[5]
设置回溯位为1将引起UART加入到回溯模式中。这种模式只是为测试目的而提供的。0 = 正常操作, 1 = 回溯模式
0
Send Break Signal
[4]
设置这个位将引起UART在一帧的时间内传送一个暂停。这个位在送出暂停信号后会被自动清除。
0 = 正常传输,1 = 传送暂停信号
0
Transmit Mode
[3:2]
决定哪一个函数当前能够对Tx写入数据到UART传输缓冲寄存器。
00 = 失能
01 = 中断请求或轮流检测模式
10 = DMA0请求(只对于UART0),DMA3请求(只对于UART2)
11 = DMA1请求(只对于UART1)
00
Receive Mode
[1:0]
决定哪一个函数当前能够读取数据从UART接收缓冲寄存器。
00 = 失能
01 = 中断请求或轮流检测模式
10 = DMA0请求(只对于UART0),DMA3请求(只对于UART2)
11 = DMA1请求(只对于UART1)
00
Ø FIFO控制寄存器(UFCON)
寄存器
地址
读/写
描述
重置值
UFCON0
0x50000008
读/写
UART通道0FIFO控制寄存器
0x0
UFCON1
0x50004008
读/写
UART通道1FIFO控制寄存器
0x0
UFCON2
0x50008008
读/写
UART通道2FIFO控制寄存器
0x0
UFCONn
位
描述
初始状态
Tx FIFO Trigger Level
[7:6]
决定传输FIFO的触发电平。
00 = 空,01 = 4字节
10 = 8字节,11 = 12字节
00
Rx FIFO Trigger Level
[5:4]
决定接收FIFO的触发电平。
00 = 4字节,01 = 8字节
10 = 12字节,11 = 16字节
00
保留
[3]
0
Tx FIFO Reset
[2]
在重新设置FIFO后自动清除。
0 = 正常,1= Tx FIFO重置
0
Rx FIFO Reset
[1]
在重新设置FIFO后自动清除。
0 = 正常,1= Rx FIFO重置
0
FIFO Enable
[0]
0 = 失能
1 = 使能
0
Ø MODEM控制寄存器(UMCON)
寄存器
地址
读/写
描述
重置值
UMCON0
0x5000000C
读/写
UART通道0Modem控制寄存器
0x0
UMCON1
0x5000400C
读/写
UART通道1Modem控制寄存器
0x0
保留
0x5000800C
-
保留
未定义
UMCONn
位
描述
初始状态
保留
[7:5]
这些位必须是0
00
Auto Flow Control (AFC)
[4]
0 = 失能
1 = 使能
0
保留
[3:1]
这些位必须是0
00
Request to Send
[0]
如果AFC位是使能的,这个值将被忽略。在这种情况下S3C2410X将自动控制nRTS。如果AFC位是失能的,nRTS必须由软件控制。
0 = ‘H’电平(不激活nRTS),1 = ‘L’电平(激活nRTS)
0
Ø 发送/接收状态寄存器(UTRSTAT)
Register
Address
R/W
Description
Reset Value
UTRSTAT0
0x50000010
R
UART通道0 Tx/Rx状态寄存器
0x6
UTRSTAT1
0x50004010
R
UART通道1 Tx/Rx状态寄存器
0x6
UTRSTAT2
0x50008010
R
UART通道2 Tx/Rx状态寄存器
0x6
UTRSTATn
Bit
Description
Initial State
Transmitter empty
[2]
当传输缓冲寄存器中没有有效的值传输并且传输转换寄存器中为空的时候,自动置1.
0 = 不为空
1 = 传输器 (传输缓冲器 & 转换寄存器) 为空
1
Transmit buffer empty
[1]
当传输缓冲寄存器中没有有效的值传输时自动置1
0 = 缓冲寄存器不为空
1 = 为空
(在非FIFO模式中,中断和DMA被请求,在FIFO模式中,只有当TxFIFO的触发级被设置为00的时候,中断和DMA被请求)
如果 UART使用FIFO, 用户应当检查UFSTAT寄存器的Tx FIFO计数位和Tx FIFO满标志位代替检查该位.
1
Receive buffer data ready
[0]
当接受缓冲寄存器中没有有效的值传输时自动置1
0 = 为空
1 = 缓冲寄存器接受到数据 (在非FIFO模式中,中断和DMA被请求)
如果 UART使用FIFO, 用户应当检查UFSTAT寄存器的Rx FIFO计数位代替检查该位
0
Ø 错误状态寄存器(UERSTAT)
Register
Address
R/W
Description
Reset Value
UERSTAT0
0x50000014
R
UART通道0Rx错误状态寄存器
0x0
UERSTAT1
0x50004014
R
UART通道1Rx错误状态寄存器
0x0
UERSTAT2
0x50008014
R
UART通道2Rx错误状态寄存器
0x0
UERSTATn
Bit
Description
Initial State
Reserved
[3]
0 = 接受中没有帧错误 1 = 帧错误 (中断请求)
0
Frame Error
[2]
在接受操作中发生了帧错误后自动置1
. 0 =接受中没有帧错误
1 =帧错误 (中断请求)
0
Reserved
[1]
0 =接受中没有帧错误 1 =帧错误 (中断请求)
0
Overrun Error
[0]
在接受操作中发生了溢出错误后自动置1
0 =接受中没有溢出错误
1 =溢出错误 (中断请求)
0
Ø FIFO状态寄存器(UFSTAT)
Register
Address
R/W
Description
Reset Value
UFSTAT0
0x50000018
R
UART通道0FIFO状态寄存器
0x00
UFSTAT1
0x50004018
R
UART通道1FIFO状态寄存器
0x00
UFSTAT2
0x50008018
R
UART通道2FIFO状态寄存器
0x00
UFSTATn
Bit
Description
Initial State
Reserved
[15:10]
0
Tx FIFO Full
[9]
当传输过程中传输FIFO为满的时候自动置1
0
0 = 0-byte ≤Tx FIFO数据≤15-byte
1 = Full
Rx FIFO Full
[8]
当接收过程中接收FIFO为满的时候自动置1
0
0 = 0-byte≤Rx FIFO数据≤ 15-byte
1 = Full
Tx FIFO Count
[7:4]
Tx FIFO中数据的个数
0
Rx FIFO Count
[3:0]
Rx FIFO中数据的个数
0
Ø MODEM状态寄存器(UMSTAT)
Register
Address
R/W
Description
Reset Value
UMSTAT0
0x5000001C
R
UART通道0 Modem状态寄存器
0x0
UMSTAT1
0x5000401C
R
UART通道1 Modem状态寄存器
0x0
Reserved
0x5000801C
–
保留的
未定义
UMSTAT0
Bit
Description
Initial State
Reserved
[3]
0
Delta CTS
[2]
该位指示输入到S3C2410X的nCTS信号自从上次读后已经改变状态
0 =没有被改变 1 =被改变
0
Reserved
[1]
0
Clear to Send
[0]
0 = CTS 信号没有被激活(nCTS pin is high.)
1 = CTS 信号被激活 (nCTS pin is low.)
0
Ø 发送缓冲寄存器(UTXHn)
Register
Address
R/W
Description
Reset Value
UTXH0
0x50000020(L) 0x50000023(B)
W (by byte)
UART通道0发送缓冲寄存器
–
UTXH1
0x50004020(L) 0x50004023(B)
W (by byte)
UART通道1发送缓冲寄存器
–
UTXH2
0x50008020(L) 0x50008023(B)
W (by byte)
UART通道3发送缓冲寄存器
–
UTXHn
Bit
Description
Initial State
TXDATAn
[7:0]
UARTn的传输数据
–
Ø 接收缓冲寄存器(URXHn)
Register
Address
R/W
Description
Reset Value
URXH0
0x50000024(L) 0x50000027(B)
R (by byte)
UART通道0接收缓冲寄存器
–
URXH1
0x50004024(L) 0x50004027(B)
R (by byte)
UART通道1接收缓冲寄存器
–
URXH2
0x50008024(L) 0x50008027(B)
R (by byte)
UART通道2接收缓冲寄存器
–
URXHn
Bit
Description
Initial State
RXDATAn
[7:0]
UARTn接受的数据
–
Ø 波特率除数寄存器
Register
Address
R/W
Description
Reset Value
UBRDIV0
0x50000028
R/W
波特率除数寄存器0
–
UBRDIV1
0x50004028
R/W
波特率除数寄存器1
–
UBRDIV2
0x50008028
R/W
波特率除数寄存器2
–
UBRDIVn
Bit
Description
Initial State
UBRDIV
[15:0]
波特率除数值
–
UBRDIVn >0
实验内容
根据前面的原理介绍,写一个程序来测试串口的基本功能。
异步串口实验步骤
从上面的寄存器介绍可以看到,与UART有关的寄存器共有11*3(因为有3个UART通道)之多。本实验使用UART0。
1. 初始化
把使用到的的引脚GPH2、GPH3定义为TXD0、RXD0:
GPHCON |= 0xa0
GPHUP |= 0x0c (上拉)
ULCON0 ( UART channel 0 line control register ):设为0x03
此值含义为:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-Red Mode,此模式表示0、1的方式比较特殊)。
UCON0 (UART channel 0 control register ):设为0x245
除了位[3:0],其他位都使用默认值。位[3:0]=0b0101表示:发送、接收都使用“中断或查询方式”——本实验使用查询方式。
UFCON0 (UART channel 0 FIFO control register ):设为0x00
每个UART内部都有一个16字节的发送FIFO和接收FIFO,但是本实验不使用FIFO,设为默认值0
UMCON0 (UART channel 0 Modem control register ):设为0x00
本实验不使用流控,设为默认值0
UBRDIV0 ( R/W Baud rate divisior register 0 ):设为12
本实验未使用PLL, PCLK=12MHz,设置波特率为115200,则由公式
UBRDIVn = (int)(PCLK / (bps x 16) ) –1
可以计算得UBRDIV0,请使用S3C2410数据手册第314页的误差公式验算一下此波特率是否在可容忍的误差范围之内,如果不在,则需要更换另一个波特率(本实验使用的115200是符合的)。
2. 发送数据
UTRSTAT0 ( UART channel 0 Tx/Rx status register ):
位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。
位[1]:发送FIFO是否为空,本实验未用此位
位[0]:接收缓冲区是否有数据,若有,此位设为1。本实验中,需要不断查询此位一判断是否有数据已经被接收。
UTXH0 (UART channel 0 transmit buffer register ):
把要发送的数据写入此寄存器。
3. 接收数据
UTRSTAT0:如同上述“2、发送数据”所列,我们用到位[0]
URXH0 (UART channel 0 receive buffer register ):
异步串口实验代码
ü 主函数
void Main(void)
{
int i,j;
sysinit(); //系统初始化代码,在这里不关心它
Uart_Init(0,115200); //初始化串口,115200是波特率定义见下面说明
Uart_Select(0); //选择串口0,标准库函数,可直接调用
Uart_Printf("\nWelcom to Uart Test!\n"); //在屏幕打印,标准库函数,可直接调用。
Uart_Printf("Baud rate=115200, no flow control\n");
i = 0;
while(1)
{
Uart_Printf("i=%d \n", i++); //从串口格式化输出
for (j=0; j<0xffffff; j++); //延时
}
}
ü 主函数中调用的函数的定义
void Uart_Init(int pclk, int baud)
{
int i;
if(pclk == 0)
pclk = PCLK; //参数pclk为0表示选用的时钟为PCLK。
rUFCON0 = 0x0; //UART 通道0 FIFO control register, FIFO禁止,不使用。
rUFCON1 = 0x0; //UART 通道1 FIFO control register, FIFO禁止,不使用。
rUFCON2 = 0x0; //UART 通道2 FIFO control register, FIFO禁止,不使用。
rUMCON0 = 0x0; //UART 通道0 MODEM control register, AFC禁止,不使用。
rUMCON1 = 0x0; //UART 通道1 MODEM control register, AFC禁止,不使用。
//UART0
rULCON0 = 0x3; //Line control register,对照寄存器的定义,可以知道这样赋值定义了数据传输格式:工作在正常模式,没有校验位,1个停止位每帧,每帧8位数据。
rUCON0 = 0x245; // 发送和接收都采用查询或中断模式。
rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //波特率divisior register 0,根据公式计算,注意要验证误差范围,误差计算公式文档中已经给出。
//UART1,与UART0相似
rULCON1 = 0x3;
rUCON1 = 0x245;
rUBRDIV1=( (int)(pclk/16./baud) -1 );
//UART2,与UART0相似
rULCON2 = 0x3;
rUCON2 = 0x245;
rUBRDIV2=( (int)(pclk/16./baud) -1 );
for(i=0;i<100;i++); //延时一小会儿
}
该实验成功后的结果可参看文件夹中的图片。
因此,在异步串口实验中,我们需要做的就是完成串口的初始化工作,设定各个控制寄存器,波特率等等。有兴趣的读者可以查看该实验中所调用的库函数的具体实现,可以帮助读者理解更多的串口实现的具体细节。查看方法:用ADS打开该实验的工程文件,在主函数中找到标准库函数的调用处,鼠标右键点击,选择Go to function definition of XXX,即可到达指定的库函数定义处。
展开阅读全文