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] |
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 |
|
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);
}