-
1
、
UART
原理简介
在介绍
2440
的
UART
控制器之前,我们首先来了解一下
UART
的原理
UART
:
Universal
Asynchro
no
us Receiver/Transm
itter(
通用异步收发送器
)
,用
来传输串行数据,发送数
据时,
CPU
将并行数据写入
UART
,
UART<
/p>
按照一定格式在
TxD
线上串行发出;接
收数据时,
UART
检测
到
RxD
线上的信号,将串行收集放到缓冲区中,
C
PU
即可读取
UART
获得的这些数据
。
UART
最精简的连线形式只有<
/p>
3
根线,
TXD
用于发送,
RXD
用于接收,
GND<
/p>
用于提供参考电平。
UART
之间以帧作
为数据传输单位,
帧由具有完整意义的若干位组成,
它包含开始
位、
数据位、
校验位和停止位。
发送数
据之前,互相通信的
UART
之间要约定好数据传输速率(波特
率的倒数)、数据的传输格式(多少
个数据位、是否使用校验位、奇校验还是偶校验、多
少个停止位)。
2
、
S3C2440
UART
的特性
S3C2440
p>
的通用异步收发器(
UART
)配有
3
个独立异步串行
I/O
(
SIO
)端口,每个都可以通过产生中
< br>断或
DMA
请求来进行
CPU<
/p>
和
UART
之间的数据传输。
如图
1
所示:
每个
UART
包含一个波特率发生器、
发送器、接
收器和一个控制单元,
图
1
2440UART
方框图
(
带
FIFO)
波特率发生器可以由
PCLK
、
FCLK/n
或
U
EXTCLK
(外部输入时钟)时钟驱动。
UART
通过使用系统时钟
可以支持最高
115.2Kbp
s
的比特率。
如果是使用外部器件提供
UEXTCLK
的
UART
,
则
UART
可以运行在
更高的速度。发送器和接收器各包含一个
64
字节的
FIFO
和数据移位器。要发送数据时,先将数据写入到
< br>FIFO
接着在发送前复制到发送移位器中,随后将数据从发送数据引脚
(TXDn)
移出;接收数据时,从接收
数据引
脚
(RXDn)
移入收到的数据,接着从移位器复制到
FIFO
。
3
、
S3C2440
UART
的使用
对于
S3C2440
,使用
UART
之前,首选需要对
2440
的
UAR
T
模块进行初始化,需要设置波特率、传输格
式(多少个数据位
、是否使用校验位、奇校验或偶校验、多少个停止位、是否使用流量控制)、选择所涉
及
的管脚为
UART
功能、选择
UART
通道的工作模式为中断模式或
DMA
模
式。设置好之后,往相关寄存
器写入数据即可发送,读取相关寄存器即可接收到数据,还
可以通过查询状态寄存器或设置中断来获知数
据是否发送完毕、是否接收到数据。
我用的开发板是天嵌的
TQ2440
,
该开发板用
SP3232EEN
扩展了一个
RS232
串口,
电路连接如图
2
所示:
图
2
RS232
原理图
波特率发生器
每个
< br>UART
的波特率发生器为发送器和接收器提供串行时钟,波特率发生器的时钟源
可以选择
S3C2440A
的内部时钟系统或者
UEXTCLK
。波特率时钟是通过
16
和由
UART
波特率分频寄存器
(UBRDIVn)
指定的
16
位
分频系数来分频源时钟
(PCLK
,
F
CLK/n
或者
UEXTCLK)
产生
的,
UBRDIVn
由下列表达式确定:
UBRDIVn=(int)(UART
时钟
/(
波特率
*16))-
1
UART
时钟:
PCLK
,
FCLK/n
或者
UEX
TCLK
,
例如,
如果波特率为
115200bps
并且
UART
时钟为
40MHz
,
则<
/p>
UBRDIVn
为:
< br>UBRDIVn=(int)(40000000/(115200*16))-
1=(int)(21.7)-
1
(取最接近的整数)
=22-
1=21
介绍发送和接收操作之前,先介绍几个重要的寄存器
UBRDIVn
寄存器:设置波特率,
S3C2
440 UART
的时钟源有两种选择:
PCLK
、
UEXTCLK
、
FCL
K/n
,
其中
n
的值通过
UCON0-UCON2
联合设置
< br>
ULCONn
寄存器:设置传输格式
UCONn
寄存器:它用于选择
UAR
T
时钟源、设置
UART
中断方式
p>
UFCONn
寄存器、
< br>UFSTATn
寄存器,
UFCONn
< br>寄存器用于设置是否使用
FIFO
,设置各
FIFO
的触发阙
值,即发送
FIFO
中有多少个数据时产生中断、接收
FIFO
中有多少个数据时产生中断。并可以通过设置
UFCONn
寄存器来复位各个
FIFO
。读取
< br>UFSTATn
寄存器可以知道各个
FIFO
是否已经满,其中有多少
个数据。
UMCONn
寄存器、
UMSTATn
寄存器,这两类寄存器用于流量控制,具体看数据手册
UTRSTATn
寄存器,它用来表明数据是否已经发送完毕、是否已经接收到数据
UERSTATn
寄存器,用来表示
各种错误是否发生
UTXHn
寄存器
,
CPU
将数据写入这个寄存器,
UA
RT
即会将它保存到缓冲区中,并自动发送出去
URXHn
寄存器,当
UART
接收到数据时,
CPU
读取这个寄存器,即可获得数据。<
/p>
下面通过实际的代码来理解
2440<
/p>
的
UART
首选是
UART
的初始化,
TQ2440
将
UART0
引了一个接口出来,就介绍
UART0
吧
2440
的
UART
引脚是挂接在
GPH
上的,所以使用
UART
之前需
要先对
GPH
的引脚功能进行配置。
void uart0_init(void)
{
GPHCON
|=
0xaa;
// GPH0
,
GPH1
,
GPH2
,
GPH3
分别
nCTS0
,<
/p>
nRTS0
,
TXD0
< br>,
RXD0
GPHUP
= 0x7ff;
//
内部上拉被禁止
UFCON0
= 0x00;
//
不使用
FIFO
UMCON0
=
0x00;
//
不使用流控
ULCON0
=
0x03;
// 8N1(8
个数据位,无校验,<
/p>
1
个停止位
)
UCON0
= 0x245;
//
查询方式,
UART
时钟源为
PCLK
,中断请求方式为
Tx-
电平,
Rx-
脉冲<
/p>
rUBRDIV0=(
(int)(pclk/16./baud+0.5) -
1 );
//
设置波特率
}
接下来几个是进行数据的发送和接收的函数
< br>//======
此函数的作用是向
UART
发送一个字符,不用
FIFO
,直接用
UART
发送
void
Uart_SendByte(char data)
{
if(data=='n')