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

📄 uart.c

📁 sl811hs 的驱动
💻 C
字号:
// edit by chendong ,2004-4-22

//ULCON1: [31..8]     [7]    [6]   [5..3]    [2]     [1..0]
//				      IR      X     PMD      STB       WL
//                     0      1     000       0        11   
//                  NORMAL  UCLK    NO P    1STOP      8BIT

//UCON1:  [31..8]     [7]    [6]    [5]     [4..3]   [2]     [1..0]    
//                    LPB    SBK    DSR      TxM     RxSI     RxM                    
//                     00    0      0        01       0        01 
//

//USTAT1  [31..8]     [7]    [6]    [5]     [4]     [3]     [2]     [1]     [0] 
//                    TC     TBE    RDR     DTR     BKD     FE       PE     OV        
//                            @      @                    

//UBRDIV1 [31..16]    [15..4]     [3..1] 
//                      CNT0       CNT1
//                    101111       0000          >>>38400              


#include "vd.h"

extern B32 ltoa(B32 value,char data[],B32 radix);         	//transfer value to string,radix=[2..36]

void uartinit(void);
void uartsend(char data[]);
char uartreceive(char data[]);

char queuepush_T(char data);
char queuepop_T(void);
B16 queuetest_T(void);
char queuepush_R(char data);
char queuepop_R(void);
B16 queuetest_R(void);

void uartpush(char data[]);
void uartpushdata(char data[],int num);
B16 uartpop(char data[]);

void B32tos(B32 value,char data[]);

char dataall[255];

B8 UARTBUF_T[65536];
B8 UARTBUF_R[65536];

B16 UARTBUF_T_T=0;			//T=TOP  B=BOTTOM
B16 UARTBUF_R_T=0;			//T 指向最后应该输入数据的位置
B16 UARTBUF_T_B=0;			//B 指向最早输入数据的位置
B16 UARTBUF_R_B=0;			//B=T 意味着空 T+1=B 意味着满

void uartinit(void)
{
	ULCON1=0x00000003;//串口0,速率38400,内部晶阵。
	UCON1=0x00000009;
	UBRDIV1=0x00000280;
}

void uartsend(char data[])
{
	B32 i;
	for(i=0;data[i]!='\0';i++)
	{
		while((USTAT1&0x00000040)==0x00000000);
		UTXBUF1=(B32)data[i];           //汉字的显示先写入高字节,再写入低字节,  注意下面的说明
	}

}

char uartreceive(char data[])
{
	if((USTAT1&0x00000020)!=0x00000000)
	{
		data[0]=(char)URXBUF1;
		data[1]='\0';
		return(1);
	}
	else
		return(0);
}

///////////////////////////////
B16 queuetest_T()
{
	B16 data;
	if(UARTBUF_T_T>=UARTBUF_T_B)
		data=UARTBUF_T_T-UARTBUF_T_B;
	else
		data=UARTBUF_T_T-UARTBUF_T_B+65536;
	return(data);		
}

char queuepush_T(char data)
{
	if(((USTAT1&0x00000040)!=0x00000000)&(UARTBUF_T_T==UARTBUF_T_B))
		UTXBUF1=(int)data; 
	else if(UARTBUF_T_T+1!=UARTBUF_T_B)
	{
		UARTBUF_T[UARTBUF_T_T]=data;
		UARTBUF_T_T++;
	}
	else
	{
		uartsend("TXDBUFF overflow!");	
		ltoa((B32)UARTBUF_T_T,dataall,10);
		uartsend(dataall);
		uartsend("\n\r");
		
		ltoa((B32)UARTBUF_T_B,dataall,10);
		uartsend(dataall);
		uartsend("\n\r");
		
		return(0);
	}
	return(1);
}


char queuepop_T(void)
{
	char data;
	
	if(UARTBUF_T_T!=UARTBUF_T_B)
	{
		data=UARTBUF_T[UARTBUF_T_B];
		UARTBUF_T_B++;
	}
	
	return(data);
	

}

void uartpush(char data[])
{
	int i=0;
	while(data[i]!='\0')
	{
		queuepush_T(data[i]);
		i++;
	}
	
	//if((USTAT1&0x00000040)!=0x00000000)
		//if(queuetest_T()!=0)
			//UTXBUF1=queuepop_T();	
}

void uartpushdata(char data[],int num)
{
	int i=0;
	for(i=0;i<num;i++)
		queuepush_T(data[i]);
	
	if((USTAT1&0x00000040)!=0x00000000)
		if(queuetest_T()!=0)
			UTXBUF1=queuepop_T();	
}
//////////////////////////////////
B16 queuetest_R()			//返回值为队列中的数据数目
{
	B16 data;
	if(UARTBUF_R_T>=UARTBUF_R_B)
		data=UARTBUF_R_T-UARTBUF_R_B;
	else
		data=UARTBUF_R_T-UARTBUF_R_B+65536;
	return(data);		
}

char queuepush_R(char data)
{
	if(UARTBUF_R_T+1!=UARTBUF_R_B)
	{
		UARTBUF_R[UARTBUF_R_T]=data;
		UARTBUF_R_T++;
	}
	else
	{
		uartsend("RXDBUFF overflow!");
		return(0);
	}
	return(1);
}


char queuepop_R(void)
{
	char data;
	
	if(UARTBUF_R_T!=UARTBUF_R_B)
	{
		data=UARTBUF_T[UARTBUF_R_B];
		UARTBUF_R_B++;
	}
	else if((USTAT1&0x00000020)!=0x00000000)
	{
		data=(char)URXBUF1;
	}
		
	return(data);
	

}

B16 uartpop(char data[])
{
	B16 i,num;
	num=queuetest_R();
	for(;i<num;i++)
		data[i]=queuepop_R();
	data[i]='\0';	
	return(num);					//返回数据个数			
}
//////////////////////////
void B32tos(B32 value,char data[])
{
	data[0]=value%256;
	value=value/256;
	data[1]=value%256;
	value=value/256;
	data[2]=value%256;
	value=value/256;
	data[3]=value%256;
	data[4]='\0';
	

}

⌨️ 快捷键说明

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