ustcanycall / OS

0 stars 0 forks source link

调研10 #13

Open ustcanycall opened 10 years ago

ustcanycall commented 10 years ago

基于s3c2410 UART功能及应用

UART的简介

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。将资料由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片,通常集成于其他通讯接口的连结上。 1

UART的设计思想

数据发送的思想

当启动字节发送时,通过TxD先发起始位,然后发数据位和奇偶数效验位,最后再发停止位,发送过程由发送状态机控制,每次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。

数据接收的思想

当不在字节帧接收过程时,每次定时中断以3倍的波特率监视RxD的状态,当其连续3次采样电平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,字节帧接收过程由接收状态机控制,每次中断只接收1个位,经过若干个定时中断完成1个字节帧的接收。

FIFO

为了提高串口的性能,在发送和接收上都实现了FIFO功能,提高通信的实时性。FIFO的长度可以进行自由定义,适应用户的不同需要。

波特率

波特率的计算按照计算公式进行,在设置最高波特率时一定要考虑模拟串口程序代码的执行时间,该定时时间必须大于模拟串口的程序的规定时间。单片机的执行速度越快,则可以实现更高的串口通讯速度。[5]

s3c2410 UART简介

s3c2410通用异步接收器和发送器(UART)提供了三个独立的异步串行I/O(SIO)端口,每个端口都可以在中断模式或DMA模式下操作。换言之,UART可以生成一个中断或DMA请求用于CPU和UART之间的数据传输。

s3c2410 UART模块简介

2

s3c2410 UART寄存器

(1) UART线性控制寄存器(ULCONn) (2) UART控制寄存器(UCONn) (3) UART FIFO控制寄存器(UFCONn) (4) UART MODEM控制寄存器(UMCONn) (5) UART接收发送状态寄存器(UTRSTATn) (6) UART错误状态寄存器(UERSTATn) (7) UART FIFO状态寄存器(UFSTATn) (8) UART MODEM状态寄存器(UMSTATn) (9) UART发送缓存寄存器(UTXHn) (10) UART接收缓存寄存器(URXHn) (11) UART波特率除数寄存器(UBRDIVn)

基于s3c2410 UART的实验设计

实验目的

选UART0来进行通信,发送、接收都使用“查询方式”,不使用FIFO,不使用流控,不使用奇偶校验,使用波特率为57600

初始化设置寄存器的值

UART线性控制寄存器(ULCONn)

4

设置串口数据格式寄存器ULCON0:8个数据位,1个停止位,无校验,正常操作模式(与之相对的是Infra-Red Mode,此模式表示0、1的方式比较特殊)

ULCON0  = 0x03

UART控制寄存器(UCONn)

qq20131221131424 qq20131221131447

设置串口控制寄存器UCON0:设置发送、接收都使用“中断或查询方式”

UCON0  = 0x05

UART FIFO控制寄存器(UFCONn)

qq20131221133610

设置串口FIFO寄存器UFCON0:本次不使用FIFO,设为默认值0

UFCON0 = 0x00

UART MODEM控制寄存器(UMCONn

qq20131221133815

UMCON0 (UART channel 0 Modem control register ):本次不使用流控,设为默认值0

UMCON0 = 0x00

UART波特率除数寄存器(UBRDIVn)

qq20131221134418 设置波特率寄存器UBRDIV0:波特率计算公式UBRDIVn = (int)(PCLK / (bps x 16) ) –1 ,要看说明书验算一下此波特率是否在可容忍的误差范围之内;如果不在,则需要更换另一个波特率,本次使用的57600是符合的

UBRDIV0 = 0x12

设置数据的收发

6

串口状态寄存器:UTRSTAT0 其位功能如下: 位[2]:无数据发送时,自动设为1。当我们要使用串口发送数据时,先读此位以判断是否有数据正在占用发送口。 位[1]:发送FIFO是否为空,本次未用此位 位[0]:接收缓冲区是否有数据,若有,此位设为1。需要用到这位,需要不断查询此位一判断是否有数据已经被接收

void putc(unsigned char c)
{       
        while( ! (UTRSTAT0 & TXD0READY) );       
        UTXH0 = c;
}
unsigned char getc( ){
        while( ! (UTRSTAT0 & RXD0READY) );       
        return URXH0;
}

定义寄存器宏

/* WOTCH DOG register */
#define WTCON (*(volatile unsigned long *)0x53000000)
/* SDRAM regisers */
#define MEM_CTL_BASE 0x48000000
#define SDRAM_BASE 0x30000000
/* NAND Flash registers */
#define NFCONF (*(volatile unsigned int  *)0x4e000000)
#define NFCMD (*(volatile unsigned char *)0x4e000004)
#define NFADDR (*(volatile unsigned char *)0x4e000008)
#define NFDATA (*(volatile unsigned char *)0x4e00000c)
#define NFSTAT (*(volatile unsigned char *)0x4e000010)
/*GPIO registers*/
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHDAT (*(volatile unsigned long *)0x56000074)
#define GPHUP (*(volatile unsigned long *)0x56000078)
/*UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)