一.概述:
s3c2440A 提供三个独立异步串口端,每个端口可以在中断模式和DMA模式下操作,也就是讲UART可以产生一个中断或DMA请求用于CPU和UART之间的数据传输。
每一个串口UART都有一个64字节的发送FIFO,一个64字节的接收FIFO。
要实现UART与上位机之间的通信,必须遵循木一个协议,通过ULCON可以定义传输数据的位数,停止的位数,红外模式等。
波特率的时钟源有:PCLK,FCLK/n,UEXTCLK,通过UCON寄存器的10,11位进行选择。大小可以这样计算:时钟源频率/(波特率*16)-1;如果计算的结果是个小数,那么把这个最接近的整数放到UBRDIVn中,即如果算的结果是16.25,那么可以把这个数取16放到UBRDIVn中。
对于FIFO和MODEM的设定是否决定相应寄存器的设定。如果没有使用FIFO和MODEM那么可以不设定这两个相应寄存器。
二.UART发送与接收:
数据发送:先由ULCON寄存器设置停止位,数据位,奇偶校验位等,因为他是可编程的,发送完数据后可以发送一个终止信号。之后串口发送数据到TxFIFO。
数据接收:先由ULCON寄存器设置停溢出,停止条件,奇偶校验错等,因为他是可编程的,接收到的数据存放在RxFIFO中。当接收器三个字长的时间內没有接收到数据并且RxFIFO在FIFO模式下不为空那么接收超时。
三.相关寄存器
四.看到有关于中断的介绍不错 贴进来分享下:
边沿(脉冲?)触发:一旦(as soon as)Tx缓冲区变为(becomes)空(非FIFO模式)或者达到(reaches)Tx FIFO触发级别(FIFO模式),则请求中断。注意,这里的“一旦”不仅限定前半句(非FIFO模式),也限定后半句(FIFO模式)。“一旦”与“变为”和“达到”连接起来,表示的是一个时间点,一个变化过程,是变为空或者达到触发级别的时间点或者说变化过程中请求中断。这个时间点过后,或者变化完成后,就不再请求中断了。只要处理中断后,清除源未决寄存器(SRCPND)和中断寄存器(INTPND)的相关位,就不会再有中断发生了。
五.FIFO与非FIFO的区别:
六。自动流控制(AFC)
AFC(Auto Flow Control):自动流控制。S3C44BoX中的UART用nRTS(发送请求信号)和nCTS(清除发送信号)来支持自动流控制,以此实现UART之间的互联。
摘自百度文库:
The S3C2440A's UART 0 and UART 1 support auto flow control with nRTS and nCTS signals. In case, it can be
connected to external UARTs. If users want to connect a UART to a Modem, disable auto flow control bit in
UMCONn register and control the signal of nRTS by software.
In AFC, nRTS depends on the condition of the receiver and nCTS signals control the operation of the transmitter.
The UART's transmitter transfers the data in FIFO only when nCTS signals are activated (in AFC, nCTS means
that other UART's FIFO is ready to receive data). Before the UART receives data, nRTS has to be activated when
its receive FIFO has a spare more than 32-byte and has to be inactivated when its receive FIFO has a spare under
32-byte (in AFC, nRTS means that its own receive FIFO is ready to receive data).
下面是代码UART详细注释:
//=========================================================================
//
//
//
//
//
//
//
//
//=========================================================================
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "option.h"
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
//====================================================
// 函数定义区
//====================================================
extern void Delay(int time);//延时函数在lib.h中定义
void myUart_Select(int ch);//串口选择
void myUart_Init(int whichuart, int baud);//初始化串口
void myUart_SendByte(char ch);//串口发送一个字节
char myUart_ReceiveByte(void);//接收一个字节
void myUart_Send (char *str);//发送一个字符串
void myUart_receive(char *string);//接收一个字符串
void myUart_Printf(char *fmt,...);//输出串口信息
extern unsigned int PCLK;
static int UartNum=0;
char *string;
//====================================================
// 语法格式:int Main(void)
// 功能描述: 发送并接收字符串,测试UART通信
// 入口参数: 字符串指针
// 出口参数: 无
//======================================================================
int Main(void)
{
}
void myUart_Select(int ch)//选择串口数量
{
}
//====================================================
// 语法格式:void myUart_Init(int whichuart, int baud)
// 功能描述: 对Uart进行初始化,以所需要的波特率为输入参数
// 入口参数: UART端口号
// 出口参数: 无
//======================================================================
void myUart_Init(int pclk, int baud)
{
//UART0: RXD0<==>GPH3
}
//====================================================
// 语法格式:void myUart_SendByte(char ch)
// 功能描述: 发送字节数据
// 入口参数: 发送的字节数据
// 出口参数: 无
//====================================================================
void myUart_SendByte(char ch)
{
//
//发送
//
//
}
//====================================================
// 语法格式:char myUart_ReceiveByte(void)
// 功能描述: 接收字节数据
// 入口参数: 无
// 出口参数: 接收的字节数据
//====================================================================
char myUart_ReceiveByte(void)
{
}
//====================================================
// 语法格式:void myUart_Send (char *str)
// 功能描述: 发送字符串
// 入口参数: 字符串指针
// 出口参数: 无
//====================================================================
void myUart_Send (char *str)
{
}
//====================================================
// 语法格式:void myUart_receive(char *string)
// 功能描述: 接收字符串
// 入口参数: 字符串指针
// 出口参数: 无
//===================================================================
void myUart_receive(char *string)
{
}
void myUart_Printf(char *fmt,...)//主要目的为让函数能够接收可变参数。[
{
}