/*
*Uart驱动
*Designer:qinkan
*DATE:2011-4-23
*modify :
*1、add UartGetch() function
*2、UartSendByte() have been modified
*/
#include "def.h"
#include "2440addr.h"
#include "option.h"
#include "2440lib.h"
#include "stdarg.h"
#include "ctype.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
extern unsigned int PCLK;
static int UartNum ;
/************************************/
/*选择串口号*/
/*输入串口号*/
/************************************/
void SelectUartNum(int num)
{
UartNum = num;
}
/************************************/
/*初始化串口*/
/*输入串口频率和波特率*/
/************************************/
void InitUart(int pclk,int buad)
{
if(pclk==0)
pclk = PCLK;
switch(UartNum)
{
case 0:
rGPHCON = rGPHCON & (~(0xffff)); //UART0: RXD0<==>GPH3 TXD0<==>GPH2
rGPHCON = rGPHCON | (0xaaa0) ; //设置GPH端口为UART口
rGPHUP = 0x0; //使能上拉功能
rUFCON0=0x0; // 不使用FIFO
rUMCON0=0x0; //不使用自动流控制
rULCON0=0x3; //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
rUCON0=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止
//信号,传输模式为中断请求模式,接收模式也为中断请求模式。
rUBRDIV0=( (int)(pclk/16./buad+0.5) -1 ); //根据波特率计算UBRDIV0的值
Delay(10);
break;
case 1:
rGPHCON = rGPHCON & (~(0xffff)); //UART0: RXD0<==>GPH3 TXD0<==>GPH2
rGPHCON = rGPHCON | (0xaaa0) ; //设置GPH端口为UART口
rGPHUP = 0x0; //使能上拉功能
rUFCON1=0x0; // 不使用FIFO
rUMCON1=0x0; //不使用自动流控制
rULCON1=0x3; //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
rUCON1=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止
//信号,传输模式为中断请求模式,接收模式也为中断请求模式。
rUBRDIV1=( (int)(pclk/16./buad+0.5) -1 ); //根据波特率计算UBRDIV0的值
Delay(10);
break;
case 2:
rGPHCON = rGPHCON & (~(0xffff)); //UART0: RXD0<==>GPH3 TXD0<==>GPH2
rGPHCON = rGPHCON | (0xaaa0) ; //设置GPH端口为UART口
rGPHUP = 0x0; //使能上拉功能
rUFCON2=0x0; // 不使用FIFO
rUMCON2=0x0; //不使用自动流控制
rULCON2=0x3; //不采用红外线传输模式,无奇偶校验位,1个停止位,8个数据位
rUCON2=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止
//信号,传输模式为中断请求模式,接收模式也为中断请求模式。
rUBRDIV2=( (int)(pclk/16./buad+0.5) -1 ); //根据波特率计算UBRDIV0的值
Delay(10);
break;
}
}
/************************************/
/*等待发送缓冲器为空*/
/*输入串口号*/
/************************************/
void UartTxEmpty(void)
{
if(UartNum==0)
while(!(rUTRSTAT0&0x2));
else if(UartNum==1)
while(!(rUTRSTAT1&0x2));
else if(UartNum==2)
while(!(rUTRSTAT1&0x2));
}
/************************************/
/*等待接收缓冲器准备好*/
/*输入串口号*/
/************************************/
void UartRxReady(void)
{
if(UartNum==0)
while(!(rUTRSTAT0&0x1));
else if(UartNum==1)
while(!(rUTRSTAT1&0x1));
else if(UartNum==2)
while(!(rUTRSTAT2&0x1));
}
/************************************/
/*发送一个字符*/
/*输入要发送的字符*/
/************************************/
void UartSendByte(char ch)
{
if(UartNum==0)
{
if(ch=='\n')
{
while(!(rUTRSTAT0&0x2)); //等待,直道发送缓冲为空
Delay(10);
WrUTXH0('\r'); //发送回车
}
while(!(rUTRSTAT0&0x2)); //等待,直道发送缓冲为空
WrUTXH0(ch); //发送字符
Delay(10);
}
else if(UartNum==1)
{
if(ch=='\n')
{
while((!rUTRSTAT1&0x2));
WrUTXH1('\r');
Delay(10);
}
while((!rUTRSTAT1&0x2));
WrUTXH1(ch);
Delay(10);
}
else if(UartNum==2)
{
if(ch=='\n')
{
while((!rUTRSTAT1&0x2));
WrUTXH2('\r');
Delay(10);
}
while((!rUTRSTAT1&0x2));
WrUTXH2(ch);
Delay(10);
}
}
/************************************/
/*发送字符串*/
/*输入要发送的字符串*/
/************************************/
void UartSendString(char *str)
{
while(*str)
{
UartSendByte(*str++);
}
}
/************************************/
/*接收一个字符*/
/*输出从终端接收到的字符*/
/************************************/
char UartReceiveByte(void)
{
if(UartNum==0)
{
while(!(rUTRSTAT0&0x1)); //等待接收数据
return RdURXH0();
}
else if(UartNum==1)
{
while(!(rUTRSTAT1&0x1));
return RdURXH1();
}
else if(UartNum==2)
{
while(!(rUTRSTAT2&0x1));
return RdURXH2();
}
return 0;
}
/***************************************/
/*C语言的可变参数,为了达到printf的功能*/
/***************************************/
void UartPrintf(char *fmt,...)
{
va_list ap;
char string[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
UartSendString(string);
va_end(ap);
}
/************************************/
/*接收字符串*/
/*将接收到的字符串保存在输入指针中*/
/************************************/
void UartReceiveString(char *string)
{
char *string2;
char ch;
string2 = string;
while((ch=UartReceiveByte())!='\r')//直到输入回车键
{
if(ch=='\b')
{
if((int)string2<(int)string)
{
UartPrintf("\b \b");
string--;
}
}
else
{
*string++ = ch;
UartSendByte(ch);
}
}
*string = '\0';
UartSendByte('\n');
}
/***************************************/
/*获得键值,如果没有键盘按下,默认返回0*/
/***************************************/
char UartGetKey(void)
{
if(UartNum==0)
{
if(rUTRSTAT0&0x1)
return RdURXH0();
else
return 0;
}
else if(UartNum==1)
{
if(rUTRSTAT1&0x1)
return RdURXH1();
else
return 0;
}
else if(UartNum==2)
{
if(rUTRSTAT2&0x1)
return RdURXH2();
else
return 0;
}
return 0;
}
/**************************************************/
/*等待按下键盘*/
/*与UartReceiveByte()功能一样*/
/**************************************************/
char UartGetch(void)
{
if(UartNum==0)
{
while(!(rUTRSTAT0&0x01));
return RdURXH0();
}
else if(UartNum==1)
{
while(!(rUTRSTAT1&0x01));
return RdURXH1();
}
else if(UartNum==2)
{
while(!(rUTRSTAT2&0x01));
return RdURXH2();
}
return 0;
}