⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_driver.c

📁 USB通信测试软件 -- 与S3C44B0的下位机通信的软件. XP驱动------------ PDIUSBD12的PC机驱动程序.USB_Test---------S3C44B0X板的USB固件程
💻 C
字号:
/*
;************************************************************************************************************
;*									 	江西师范大学理电学院创新中心
;*											 
;*                                             创新研发小组
;*--------------------------------------------- 文件信息 -----------------------------------------------------                                      
;*
;* 文件名称 : Uart_driver.c	
;* 文件功能 : 该文件为串口的驱动。
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2006/04/20
;* 版本声明 : V1.0.1
;*-------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : 
;* 创建日期 : 
;* 版本声明 : 
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "..\..\Startup44b0\inc\44b.h"
#include "..\..\Startup44b0\inc\44blib.h"
#include "..\..\Startup44b0\inc\option.h"
#include "..\inc\Uart_driver.h"


#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>


static int whichUart=0;		//串口选择变量

/*
*************************************************************************************************************
- 函数名称 : Uart_Init(int mclk,int baud,char port)
- 函数说明 : 串口初始化
- 输入参数 : mclk,baud,port
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Init(int mclk,int baud,char port)
{
    int i;
    if (mclk == 0)
	{
		mclk = MCLK;
    }
    i = mclk / (baud * 16);							                 // 圆整 (int)((mclk/16.)/baud + 0.5) -1;
    if (port == 0)
    {												                                 //UART0 配置各控制寄存器
        rUFCON0 = 0x0;           					                                             // 禁用 FIFO 
        rUMCON0 = 0x0;
        rULCON0=0x3;     							                //正常模式,无奇偶校验,一个停止位,8个数据位
        //rULCON0=0x7;     						                    //正常模式,无奇偶校验,两个停止位,8个数据位
        rUCON0=0x245;     //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
        rUBRDIV0 = i;								                       //( (int)(mclk/16/baud + 0.5) -1 );
     }
    else if (port == 1)
    {												                                 //UART0 配置各控制寄存器
	 	rUFCON1 = 0x0;								                                             // 禁用 FIFO
    	rUMCON1 = 0x0;
        rULCON1 = 0x3;     							                //正常模式,无奇偶校验,一个停止位,8个数据位
    	//rULCON1 = 0x7;							                //正常模式,无奇偶校验,两个停止位,8个数据位							
    	rUCON1  = 0x245;  //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
    	rUBRDIV1 = i;								                      //( (int)(mclk/16./baud + 0.5) -1 );
    }
    for(i=0;i<100;i++);
}

/*
*************************************************************************************************************
- 函数名称 : Uart_Select
- 函数说明 : 串口的选择 
- 输入参数 : 串口0,1
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Select(int ch)
{
    whichUart=ch;
}

/*
*************************************************************************************************************
- 函数名称 : Uart_TxEmpty(int ch)
- 函数说明 : 等待串口空
- 输入参数 : 串口端口 ch
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_TxEmpty(int ch)
{
    if(ch==0)
	while(!(rUTRSTAT0 & 0x4)); //wait until tx shifter is empty.
    else
    	while(!(rUTRSTAT1 & 0x4)); //wait until tx shifter is empty.
}

/*
*************************************************************************************************************
- 函数名称 : Uart_Getch
- 函数说明 : 选择接收数据就绪的串口 
- 输入参数 : 无
- 输出参数 : RdURXH0(),RdURXH1()
*************************************************************************************************************
*/
char Uart_Getch(void)
{
    if(whichUart==0)
    {	    
	while(!(rUTRSTAT0 & 0x1)); //Receive data read
	return RdURXH0();
    }
    else
    {
	while(!(rUTRSTAT1 & 0x1)); //Receive data ready
	return	rURXH1;
    }
}
/*
*************************************************************************************************************
- 函数名称 : Uart_GetKey
- 函数说明 : 得到串口的键值
- 输入参数 : port
- 输出参数 : RdURXH0()或0,rURXH1或0
*************************************************************************************************************
*/
char Uart_GetKey(void)
{
    if(whichUart==0)
    {	    
	if(rUTRSTAT0 & 0x1)    //Receive data ready
    	    return RdURXH0();
	else
	    return 0;
    }
    else
    {
	if(rUTRSTAT1 & 0x1)    //Receive data ready
	    return rURXH1;
	else
	    return 0;
    }
}

/*
*************************************************************************************************************
- 函数名称 : Uart_GetString(char *string)
- 函数说明 : 串口得到字符串
- 输入参数 : string
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_GetString(char *string)
{
    char *string2=string;
    char c;
    while((c=Uart_Getch())!='\r')
    {
	if(c=='\b')
	{
	    if(	(int)string2 < (int)string )
	    {
		Uart_Printf("\b \b");
		string--;
	    }
	}
	else 
	{
	    *string++=c;
	    Uart_SendByte(c);
	}
    }
    *string='\0';
    Uart_SendByte('\n');
}

/*
*************************************************************************************************************
- 函数名称 : Uart_GetIntNum()
- 函数说明 : 从串口得到数字
- 输入参数 : 无
- 输出参数 : 得到的数字值
*************************************************************************************************************
*/
int Uart_GetIntNum(void)
{
    char str[30];
    char *string=str;
    int base=10;
    int minus=0;
    int lastIndex;
    int result=0;
    int i;
    
    Uart_GetString(string);
    
    if(string[0]=='-')
    {
        minus=1;
        string++;
    }
    
    if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))
    {
	base=16;
	string+=2;
    }
    
    lastIndex=strlen(string)-1;
    if( string[lastIndex]=='h' || string[lastIndex]=='H' )
    {
	base=16;
	string[lastIndex]=0;
	lastIndex--;
    }

    if(base==10)
    {
	result=atoi(string);
	result=minus ? (-1*result):result;
    }
    else
    {
	for(i=0;i<=lastIndex;i++)
	{
    	    if(isalpha(string[i]))
	    {
		if(isupper(string[i]))
		    result=(result<<4)+string[i]-'A'+10;
		else
		    result=(result<<4)+string[i]-'a'+10;
	    }
	    else
	    {
		result=(result<<4)+string[i]-'0';
	    }
	}
	result=minus ? (-1*result):result;
    }
    return result;
}

/*
*************************************************************************************************************
- 函数名称 : Uart_SendByte(int data)
- 函数说明 : 串口发送字节
- 输入参数 : data
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_SendByte(int data)
{
    if(whichUart==0)
    {
	if(data=='\n')
	{
	    while(!(rUTRSTAT0 & 0x2));
	    Delay(10);	//because the slow response of hyper_terminal 
	    WrUTXH0('\r');
	}
	while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
	Delay(10);
	WrUTXH0(data);
    }
    else
    {
	if(data=='\n')
	{
    	    while(!(rUTRSTAT1 & 0x2));
	    Delay(10);	//because the slow response of hyper_terminal 
	    rUTXH1='\r';
	}
	while(!(rUTRSTAT1 & 0x2));  //Wait until THR is empty.
	Delay(10);
	rUTXH1=data;
    }	
}		
		
/*
*************************************************************************************************************
- 函数名称 : Uart_SendString(char *pt)
- 函数说明 : 串口发送字符串
- 输入参数 : pt
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_SendString(char *pt)
{
    while(*pt)
	Uart_SendByte(*pt++);
}

/*
*************************************************************************************************************
- 函数名称 : Uart_Printf(char *fmt,...)
- 函数说明 : 串口打印字符
- 输入参数 : fmt ...
- 输出参数 : 无
*************************************************************************************************************
*/
void Uart_Printf(char *fmt,...)                         //如果您不使用 vsprintf(), 代码量将大幅增加
{
    va_list ap;
    char string[256];      
    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
   
}

/*
*************************************************************************************************************
*-                            				结束文件													   -*
*************************************************************************************************************
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -