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

📄 uart1.c

📁 ARM7 SPI RC531驱动程序,数据手册
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                   
**                                    
**                                        
**
**                                 
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: Uart1.c
**创   建   人: 李功周
**最后修改日期: 2008年10月31日
**描        述: Uart API 函数 
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 李功周
** 版  本: v1.0
** 日 期: 2008年10月31日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
*/
#include <LPC2103.H>
#include "../confing/config.h"
#include "../SPK/SPK.h"


#define		OutTime			1									//读数据时的等待时间
#define		ReadBuffLen		64									//接收缓冲长度

volatile unsigned char Uart1Sending = 0 ;
volatile int  Uart1ReaddataLen = 0 ;							//数据长度
volatile unsigned char Uart1Readdata[ReadBuffLen];				//接收缓冲
volatile int  Uart1InAddr = 0 ;									//接收地址
volatile int  Uart1OutAddr = 0 ;								//读地址
volatile unsigned char Uart1OverData;							//益出数据
volatile unsigned char Uart1BuffOver = 0;						//益出标志



/****************************************************************************
* 名称:UART1_Exception()
* 功能:UART1中断服务程序。
* 入口参数:无
* 出口参数:无
* 说明:
****************************************************************************/
void __irq  UART1_Exception(void)
{
	unsigned char IIR;
	while(((IIR=U1IIR) & 0x01) == 0)
    {  
		switch (IIR & 0x0e)
        {
			case 0x00:                                  	// Modem状态变化中断
			
				break;
			case 0x02://发送中断
                     	Uart1Sending = 0 ;    
             	break;
			case 0x04:                                  	// 接收数据可用
					//	SpkOnTime(0);
                		if(Uart1BuffOver)
						{
							Uart1OverData = U1RBR ; 		
						}
						else
						{
							Uart1Readdata[Uart1InAddr++] = U1RBR;
							Uart1ReaddataLen++;
							if(Uart1InAddr == ReadBuffLen)
						 	{
								Uart1InAddr = 0;	
							}
							if(Uart1InAddr == Uart1OutAddr)
							{
								Uart1BuffOver = 1;		
							}		
						}
                break;
			case 0x06:                                  	// 接收线状态
			//SpkOnTime(100);
                IIR = U1LSR;
			case 0x0c:     
			//SpkOnTime(100);                             	// 字符超时指示
                IIR=U0RBR;                       			// 禁止接收及字符超时中断
                break;
			default :  IIR=U0RBR;
			//SpkOnTime(100);
             	break; 
		}	
	}
	 VICVectAddr = 0;      		// 通知中断控制器中断结束
}



/****************************************************************************
* 名    称:Uart1_SendByte
* 功    能:Uart0发送一个字节。
* 入口参数:Data 发送的数据
* 出口参数:无
*****************************************************************************/
void Uart1_SendByte(unsigned char Data)
{
	while(Uart1Sending);
    U1THR=Data;
	Uart1Sending = 1 ;
}



/****************************************************************************
* 名    称:Uart1_SendStr
* 功    能:Uart0发送一个字符串。
* 入口参数:Data 发送的数据,
			len  发送的长度
* 出口参数:无
*****************************************************************************/
void Uart1_SendStr(unsigned char *Data,int len)
{
	int i = 0;
	for( i = 0 ; i < len ; i++ )
	{
		while(Uart1Sending);
	    U1THR=Data[i];
		Uart1Sending = 1 ;
	}
}




/****************************************************************************
* 名    称:Uart1_ReadByte
* 功    能:接收字符串。
* 入口参数:Data 接收到的数据
			overtime 超时时间 0 直接返回 负数一直等待
* 出口参数:1 有数据, 0 没有数据
*****************************************************************************/
unsigned char Uart1_ReadByte(unsigned char * Data,int overtime)
{
	int i = 0;
	int j = 0;
	if(overtime==0)
	{
		if(Uart1ReaddataLen!=0)
		{
			goto Uart1_ReadByte1;
		}
		else
		{
			
			return 0;
		}
	}
	if(overtime > 0)
	{
		i = 0;
		while( i < overtime )
		{
			for( j = 0 ; j < 1010 ; j++ );
			if(Uart1ReaddataLen!=0)
			{
				goto Uart1_ReadByte1;	
			}
			i++;										
		}
		if(i>=OutTime)
		{
			return 0;	
		}
	}
	else
	{
		while(Uart1ReaddataLen==0);
	}
Uart1_ReadByte1:
	*Data = Uart1Readdata[Uart1OutAddr++];
	if(Uart1OutAddr>=ReadBuffLen)
	{
		Uart1OutAddr = 0;
	}
	Uart1BuffOver = 0 ;
	Uart1ReaddataLen--;
	return 1;
}



/****************************************************************************
* 名    称:Uart1_ReadStr
* 功    能:接收一个字节。
* 入口参数:Data 接收到的数据 
			len  要接收的数据长度
			overtime 超时时间 0 直接返回 负数一直等待
* 出口参数:返回数据长度
*****************************************************************************/
int Uart1_ReadStr(unsigned char *Data,int len,int overtime)
{
	int i;
	i = 0 ;
	while( i < len )
	{		
		if(Uart1_ReadByte(&Data[i],overtime))
		{
			i++;			
			if(i==len)
			{
				return i ;
			}
		}
		else
		{
			return i ;
		}
	}
	return i;	
}




/****************************************************************************
* 名    称:CheckBuff
* 功    能:查询buff的状态。
* 入口参数:无
* 出口参数:返回数据长度
*****************************************************************************/
unsigned int Uart1_CheckBuff(void)
{
	return Uart1ReaddataLen;
}



/****************************************************************************
* 名    称:ClearBuff()
* 功    能:清除buff数据。
* 入口参数:无
* 出口参数:无
*****************************************************************************/
void Uart1_ClearBuff(void)
{
	Uart1ReaddataLen = 0;
	Uart1InAddr = 0 ;
	Uart1OutAddr = 0 ;
	Uart1BuffOver = 0 ;
}




/****************************************************************************
* 名    称:Uart1_Init
* 功    能:Uart0初始化。
* 入口参数:irq_enable =1 使用中断
            uart_bps   波特率
            Parity="NMS" 效验方式
* 出口参数:无
****************************************************************************/
int  Uart1_Init(unsigned int irq_enable,unsigned int uart_bps,unsigned char Parity)
{
    unsigned short Fdiv;
	unsigned char bak;
	
	if( (0==uart_bps)||(uart_bps>115200) ) 
    {
        return 1;
    } 
	
	
	if(irq_enable)
    {
        VICIntSelect &= ~(1<<7);                  			//uart1为IRQ中断
        VICVectCntl9 = 0x20|7;                   			//uart1使用slot9
        VICVectAddr9 = (unsigned int) UART1_Exception;  	//中断入口程序
        VICIntEnable |= (0x1<<7);                			//开UART中断
    }
    
	PINSEL0 = PINSEL0&(0xfff0ffff);
	PINSEL0 = PINSEL0|(0x00050000);
    U1LCR = 0x80;                                  	 		// 允许访问分频因子寄存器 
    Fdiv = (Fpclk / 16) / uart_bps;                      	// 设置波特率 
    U1DLM = Fdiv / 256;							
	U1DLL = Fdiv % 256;	
	
	bak = 0;
	bak = 3;                      							//8位数据位 0->5 1->6 2->7 3->8
    bak |= 0x00;                  							//0->1位停止位 4->2
    if(Parity=='N')
    {
        bak|=0x00;                  						//0->无校验 8->有校验    
        bak|=0x00;                  						//0->奇 0x10->偶 0x20->M 0x30->S 
    }
    else if(Parity=='M')
    {
        bak|=0x08;                  						//0->无校验 8->有校验    
        bak|=0x20;                  						//0->奇 0x10->偶 0x20->M 0x30->S     
    }
    else if(Parity=='S')
    {
        bak|=0x08;                  						//0->无校验 8->有校验    
        bak|=0x30;                  						//0->奇 0x10->偶 0x20->M 0x30->S     
    }
	else
	{
		return 2;
	}
						
    U1LCR = bak;                                   			// 禁止访问分频因子寄存器 
                                                    		// 且设置为8,1,n 
													
	U1FCR = 0x07;                        					// 使能FIFO,并设置触发点为1字节
	
    bak=0;
    bak|=0x01;                              				// 允许RBR中断,即接收中断
    bak|=0x02;                              				// 允许THRE中断,即发送中断	
	
    U1IER = bak;   
	                                 						// 初始化FIFO 
    U1MCR = 0x00;
	
	return 0;
}

⌨️ 快捷键说明

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