实验8 UART 通信实验

RS-323C 标准是美国EIA(电子工业联合会)与BELL 等公司一起开发的1969 年公布的通信协议。它适合于数据传输速率在0~20000b/s 范围内的通信。RS-232-C 标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equipment)而制定的。显然,这个标准的有些规定及和计算机系统是不一致的,甚至是相矛盾的。RS-232C 标准中所提到的"发送"和"接收",都是站在DTE 立场上,而不是站在DCE 的立场来定义的。由于在计算机系统中,往往是CPU 和I/O 设备之间传送信息,两者都是DTE,因此双方都能发送和接收。

由于RS-232-C标准所定义的高、低电平信号于S3C2440A 系统的LVTTL 电路定义的高、低电平信号完全不同,LVTTL 的标准逻辑“1”对应2-3.3V,标准逻辑“0”对应0-0.4V,而RS-232-C标准采用负逻辑方式,逻辑“1”对应-5――15V,标准逻辑“0”对应+5-+15V。显然两者间要进行通信,必须经过电平的转换,转换芯片采用max232。

与数据发送一样,数据接收的帧也是可以编程的,它包含一个开始位,5 到8 个数据,一个可选的奇偶位和一位到两位停止位,他们是通过线性控制器(ULCONn)来设置的。接
收器能够检测溢出错误,奇偶检验错误,帧错误和中止状况,每种情况下都将会产生一个错误标志置位。

每个 UART 的波特率发生器为传输提供了串行移位时钟。波特率产生器的时钟源可以从S3C2440A 的内部系统时钟或UCLK 中来选择。波特率由时钟源(PCLK 或UCLK)16
分频和UART 波特率除数寄存器(UBRDIn)指定的16 位除数决定。UBRDIn 的置可以按照下式确定:
UBRDIn=(int)(PCLK/(bps*16))-1
除数的范围为1 到(16**2-1)。

 

异步串行口的相关寄存器

Ø 线路控制寄存器(ULCON

线性控制寄存器,主要用来规定传输帧的格式。下面表格是线控制寄存器的地址和位定义:

寄存器

地址

读/写

描述

重置值 

ULCON0 

0x50000000

读/写

UART通道0线路控制寄存器

0x00 

ULCON1 

0x50004000

读/写

UART通道1线路控制寄存器

0x00 

ULCON2 

0x50008000

读/写

UART通道2线路控制寄存器

0x00 

ULCONn

描述

初始状态

保留

[7] 

Infra-Red Mode

[6] 

决定是否用红外模式。

0 = 正常模式操作

1 = 红外Tx/Rx模式

Parity Mode

[5:3] 

指定奇偶产生的类型并在UART的传输与接收操作中检查。

0xx = 非奇偶

100 = 

101 = 

110 = 强制奇偶/选中为

111 = 强制奇偶/选中为

000 

Number of Stop Bit

[2] 

指定多少个停止位将被使用对于帧结束信号。

0 = 每帧一个停止位

1 = 每帧两个停止位

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] 

选择PCLKUCLK对于UART的波特率。

0=PCLK : UBRDIVn = (int)(PCLK / (bps x 16) ) -1 

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

Tx Interrupt Type

[9] 

中断请求类型。

0 = 脉冲型(Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。

1 = 电平型(Tx缓冲区在无输入输出模式下变空或当Tx在输入输出模式下的输入输出到达触发电平时,中断就被请求。

Rx Interrupt Type

[8] 

中断请求类型。

0 = 脉冲型(Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。

1 = 电平型(Rx缓冲区在无输入输出模式下接收数据或当Rx在输入输出模式下的输入输出到达触发电平时,中断就被请求。

Rx Time Out Enable

[7] 

UART的输入输出被使能时,使Rx的定时中断使能/失能。这个中断是一个接收中断。   0 = 失能,1 = 使能

Rx Error Status Interrupt Enable

[6] 

使UART在一个例外上产生中断是使能的,例如一个暂停,帧出错,奇偶出错或溢出出错在一个接收操作中。

0 = 不产生接收出错的状态中断

1 = 产生接收出错的状态中断

Loopback Mode

[5] 

设置回溯位为1将引起UART加入到回溯模式中。这种模式只是为测试目的而提供的。0 = 正常操作, 1 = 回溯模式

Send Break Signal

[4] 

设置这个位将引起UART在一帧的时间内传送一个暂停。这个位在送出暂停信号后会被自动清除。

0 = 正常传输,1 = 传送暂停信号

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] 

Tx FIFO Reset

[2] 

在重新设置FIFO后自动清除。

0 = 正常,1= Tx FIFO重置

Rx FIFO Reset

[1] 

在重新设置FIFO后自动清除。

0 = 正常,1= Rx FIFO重置

FIFO Enable

[0] 

0 = 失能

1 = 使能

Ø 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 = 使能

保留

[3:1] 

这些位必须是0

00 

Request to Send

[0] 

如果AFC位是使能的,这个值将被忽略。在这种情况下S3C2410X将自动控制nRTS。如果AFC位是失能的,nRTS必须由软件控制。

0 = H’电平(不激活nRTS)1 = ‘L’电平(激活nRTS) 

 

Ø 发送/接收状态寄存器(UTRSTAT

 

Register 

Address 

R/W 

Description 

Reset Value 

UTRSTAT0 

0x50000010 

UART通道0 Tx/Rx状态寄存器 

0x6 

UTRSTAT1 

0x50004010 

UART通道Tx/Rx状态寄存器 

0x6 

UTRSTAT2 

0x50008010 

UART通道Tx/Rx状态寄存器

0x6 

UTRSTATn 

Bit 

Description 

Initial State 

Transmitter empty 

[2] 

当传输缓冲寄存器中没有有效的值传输并且传输转换寄存器中为空的时候,自动置1

0 = 不为空 

1 = 传输器 (传输缓冲器 & 转换寄存器为空

Transmit buffer empty 

[1] 

当传输缓冲寄存器中没有有效的值传输时自动置1

0 = 缓冲寄存器不为空 

1 = 为空 

(在非FIFO模式中,中断和DMA被请求,在FIFO模式中,只有当TxFIFO的触发级被设置为00的时候,中断和DMA被请求) 

如果 UART使用FIFO, 用户应当检查UFSTAT寄存器的Tx FIFO计数位和Tx FIFO满标志位代替检查该位.

Receive buffer data ready 

[0] 

当接受缓冲寄存器中没有有效的值传输时自动置1

0 = 为空

1 = 缓冲寄存器接受到数据 (在非FIFO模式中,中断和DMA被请求

如果 UART使用FIFO, 用户应当检查UFSTAT寄存器的Rx FIFO计数位代替检查该位

 

Ø 错误状态寄存器(UERSTAT

 

Register 

Address 

R/W 

Description 

Reset Value 

UERSTAT0 

0x50000014 

UART通道0Rx错误状态寄存器

0x0 

UERSTAT1 

0x50004014 

UART通道1Rx错误状态寄存器

0x0 

UERSTAT2 

0x50008014 

UART通道2Rx错误状态寄存器

0x0 

UERSTATn 

Bit 

Description 

Initial State 

Reserved 

[3] 

0 = 接受中没有帧错误 1 = 帧错误 (中断请求

Frame Error 

[2] 

在接受操作中发生了帧错误后自动置1

. 0 =接受中没有帧错误

 1 =帧错误 (中断请求)

Reserved 

[1] 

0 =接受中没有帧错误  1 =帧错误 (中断请求)

Overrun Error 

[0] 

在接受操作中发生了溢出错误后自动置1

0 =接受中没有溢出错误

1 =溢出错误 (中断请求

Ø FIFO状态寄存器(UFSTAT

 

Register 

Address 

R/W 

Description 

Reset Value 

UFSTAT0 

0x50000018 

UART通道0FIFO状态寄存器 

0x00 

UFSTAT1 

0x50004018 

UART通道1FIFO状态寄存器

0x00 

UFSTAT2 

0x50008018 

UART通道2FIFO状态寄存器

0x00 

UFSTATn 

Bit 

Description 

Initial State 

Reserved 

[15:10] 

Tx FIFO Full 

[9] 

当传输过程中传输FIFO为满的时候自动置1 

0 = 0-byte Tx FIFO数据15-byte 

1 = Full 

Rx FIFO Full 

[8] 

当接收过程中接收FIFO为满的时候自动置1 

0 = 0-byteRx FIFO数据 15-byte 

1 = Full 

Tx FIFO Count 

[7:4] 

Tx FIFO中数据的个数 

Rx FIFO Count 

[3:0] 

Rx FIFO中数据的个数 

Ø MODEM状态寄存器(UMSTAT

Register 

Address 

R/W 

Description 

Reset Value 

UMSTAT0 

0x5000001C 

UART通道0 Modem状态寄存器

0x0 

UMSTAT1 

0x5000401C 

UART通道1 Modem状态寄存器

0x0 

Reserved 

0x5000801C 

– 

保留的

未定义

UMSTAT0 

Bit 

Description 

Initial State 

Reserved 

[3] 

Delta CTS 

[2] 

该位指示输入到S3C2410XnCTS信号自从上次读后已经改变状态

0 =没有被改变  1 =被改变

Reserved 

[1] 

Clear to Send 

[0] 

0 = CTS 信号没有被激活(nCTS pin is high.) 

1 = CTS 信号被激活    (nCTS pin is low.) 

Ø 发送缓冲寄存器(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

波特率除数寄存器

– 

UBRDIV1 

0x50004028 

R/W

波特率除数寄存器1 

– 

UBRDIV2 

0x50008028 

R/W

波特率除数寄存器2

– 

UBRDIVn 

Bit 

Description 

Initial State 

UBRDIV 

[15:0] 

波特率除数值 

– 

UBRDIVn >0 

8.1 串口初始化

rUFCON0=0xf7; //UFCONn――串口FIFO 控制寄存器,设置串口的FIFO 属性,并清除FIFO 中的内容
rUMCON0=0x0; //UMCON——MODE控制寄存器,关闭控制流功能

rULCON0=0x3; //ULCONn――串口线性控制寄存器,设置8 位数据,1 位停止位,无奇偶校验位串口模式
rUCON0=0x345; //UCONn――串口控制寄存器,0011 0100 0101,FCLK/44,UBRDIn=(int)(PCLK/(bps*16))-1,Tx、Rx中断为电平,....,设置收发的中断模式位电平触发关闭超时功能
rUBRDIV0=(int)(PCLK/(bps*16))-1; //UBRDIVn――串口波特率分频寄存器,设置波特率,pclk 为ARM 时钟频率,baud 为传输波特率


 

8.2接收数据


while(rUTRSTAT0&0x1) //UTRSTATn――串口收/发状态寄存器,检查状态寄存器,是否有数据到来,启动接收过程
data=rURXH0; //将数据写到数据端口, URXHn――串口接收缓存寄存器,RXTADA


8.3 发送数据

while(rUTRSTAT0&0x2); //等待发送缓存区为空
rURXH0=data;//发送数据,这句感觉有问题,自己觉得是rUTXH0=data;UTXHn――串口发送缓存寄存器,TXDATA


8.4 发送数据主函数

int Main()
{
char aa;
SetClockDivider(1, 1);
SetSysFclk(DFT_FCLK_VAL);
Port_Init();
myUart_Send("My UART0 is OK!\n");
while(1);
}


8.5 接收并发送主函数

int Main(void)
{ char;
char *str;
char aa ,*string;
SetClockDivider(1, 1);
SetSysFclk(DFT_FCLK_VAL);
Port_Init();
myUart_Send("Please Input a string:\n");
myUart_receive(string);
*str=*string;
Delay(500);
myUart_Send(str);
while(1);
}


 

 

 

 

 

你可能感兴趣的:(实验8 UART 通信实验)