SPI、IIC和UART是最常用的三种串行总线,这三种总线在s3c2440中都被集成了。在这里我们主要介绍UART,另两个总线在后面的文章中给出。
UART(Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置)用于异步通信,可以实现全双工发送和接收。它不仅可以实现不同嵌入式系统之间的通信,还可以实现与PC之间的通信。
s3c2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个64个字节的发送FIFO。在这里,我们只给出非FIFO模式,即传输数据不利用FIFO缓存,一个字节一个字节地传输。
下面我们就给出如何用s3c2440来实现非FIFO的UART通信。
第一步:串口编写流程
1、初始化引脚: 把使用到的引脚GPH2、GPH3定义为TXD0、RXD0
GPHCON |= 0xa0
GPHUP |= 0x0c
2、设置串口数据格式寄存器ULCON0:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-Red Mode,此模式表示0、1的方式比较特殊)
ULCON0 :串口线性控制寄存器,
ULCON0 [1,0]——数据位数(5,6,7,8)位
ULCON0 [2]——停止位数(1,2)位
ULCON0 [5:3]——奇偶校验(奇校验,偶校验,不校验,强制校验)
ULCON0 [6]——普通模式还是红外模式
ULCON0 = 0x03
3、设置串口控制寄存器UCON0:设置发送、接收都使用“中断或查询方式”
UCON0 = 0x05
4、设置串口FIFO寄存器UFCON0:本次不使用FIFO,设为默认值0
UFCON0 = 0x00
5、UMCON0 :本次不使用流控,设为默认值0
UMCON0 = 0x00
6、设置波特率寄存器UBRDIV0:波特率计算公式UBRDIVn = (int)(PCLK / (bps x 16) ) –1 ,要看说明书验算一下此波特率是否在可容忍的误差范围之内;如果不在,则需要更换另一个波特率。这个计算结果很可能是小数,把该小数取最接近的整数,放入寄存器UBRDIVn中就完成了波特率的设置。如我们选择波特率的时钟源为PCLK,它为50MHz,我们设置的波特率为115.2kHz,通过上式计算的结果为26.13,取整后得到26,那么我们把26放入UBRDIVn中即可。
UBRDIV0 = 0x12
至此,串口初始化完毕,下面进行数据的收发:
由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,所在的地址是不同。为了了解当前数据传输的各种状态,还需要一些状态寄存器。
串口状态寄存器:UTRSTAT0 其位功能如下
位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。
位[1]:发送FIFO是否为空,本次未用此位
位[0]:接收缓冲区是否有数据,若有,此位设为1。需要用到这位,需要不断查询此位一判断是否有数据已经被接收。
串口发送寄存器UTXH0 :把要发送的数据写入此寄存器。
3、接收数据:
UTRSTAT0:如同上述“发送数据”所列,我们用到位[0]
接收缓存寄存器URXH0 : 当查询到UTRSTAT0 位[0]=1时,读此寄存器获得串口接收到的数据。
我们给出UART通信的两种方法:查询和中断。为了验证程序,使用任一款的串行通信软件来实现PC和s3c2440之间的通信即可。
首先给出的是查询程序。它是在主程序的循环体内不断查询UART端口,当有数据来时,就接收数据,并再通过UART发送该数据。然后根据所接收数据的不同,分别执行不同的内容,如点亮、熄灭LED,蜂鸣器响、或不响。在这里,我们每次只完成一个字节的传输。 |