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

📄 st2552.c

📁 通用异步收发器st2552的驱动程序
💻 C
字号:
#include "..\inc\include.h"

void Init16c2552a(void)
{
	INT8U byTemp;
	sio_16c2552a.line_control = 0x80;	        /*set latch for baud rate*/
	sio_16c2552a.DLL = BAUD_REG;		        /*set baud rate*/
	sio_16c2552a.DLM = BAUD_REG >> 8;	        /*set baud rate*/

	sio_16c2552a.line_control = 0x1b;			/*8 bit data,even parity,1 bit stop*/
	sio_16c2552a.FCR = 0xc1;					/*fifo enable and clear, one byte  fifo interupt*/
	sio_16c2552a.modem_control = 0x02;			/*while bit2=1 rts=0 receive status*/
	byTemp = sio_16c2552a.line_status;		    /*read to clear any false*/
	byTemp = sio_16c2552a.modem_status;	        /*read to clear any false*/
	byTemp = sio_16c2552a.Interrupt_Id;	        /*read to clear any false*/
	DISABLE16C2552ATX					        /*处于接收状态*/
	PTX16C2552A = &BYTX16C2552ABUFF[0];
	PRX16C2552A = &BYRX16C2552ABUFF[0];
	PTX16C2552ANOW = &BYTX16C2552ABUFF[0];
}

void Init16c2552b(void)
{
	INT8U byTemp;
	sio_16c2552b.line_control = 0x80;	        /*set latch for baud rate*/
	sio_16c2552b.DLL = BAUD_REG;			    /*set baud rate*/
	sio_16c2552b.DLM = BAUD_REG >> 8;	        /*set baud rate*/

	sio_16c2552b.line_control = 0x1b;		    /*8 bit data,even parity,1 bit stop*/
	sio_16c2552b.FCR = 0xc1;					/*fifo enable and clear, one byte  fifo interupt*/
	sio_16c2552b.modem_control = 0x02;		    /*while bit2=1 rts=0 receive status*/
	byTemp = sio_16c2552b.line_status;			/*read to clear any false*/
	byTemp = sio_16c2552b.modem_status;			/*read to clear any false*/
	byTemp = sio_16c2552b.Interrupt_Id;			/*read to clear any false*/
	DISABLE16C2552BTX                           /*处于接收状态*/
	PTX16C2552B= &BYTX16C2552BBUFF[0];
	PRX16C2552B= &BYRX16C2552BBUFF[0];
	PTX16C2552BNOW = &BYTX16C2552BBUFF[0];
}

#pragma interrupt()
void IntIRQ2()	                                /*A口中断*/
{
	INT8U byFlag;
	asm(" OR.W #$700,SR");	                    /*禁止中断*/
	byFlag = sio_16c2552a.Interrupt_Id & 0xf;
	if((byFlag == 0x4) || (byFlag == 0xc))	    /*接收中断*/
	{
		while(sio_16c2552a.line_status & 0x01)
		{
		    if((INT32U)PRX16C2552A < (INT32U)(&BYRX16C2552ABUFF[0]) + RX16C2552_LENGTH)
				*PRX16C2552A++ = sio_16c2552a.data_io;
			else
				UARTERRFLAG |= UARTAREFULL;
		}
	}
	else if(byFlag == 0x02)	                    /*发送中断*/
	{
		while(((INT32U)PTX16C2552ANOW < (INT32U)PTX16C2552A) && (sio_16c2552a.line_status & 0x20))   /*有发送数据且THR为空*/
			sio_16c2552a.data_io =  *(PTX16C2552ANOW++);
		if(((INT32U)PTX16C2552ANOW >= (INT32U)PTX16C2552A) && (sio_16c2552a.line_status & 0x40))     /*THR和TSR为空,发送完成*/
		{
			DISABLE16C2552ATX	                /*禁止发送中断,并处于接收状态*/
			PTX16C2552A = &BYTX16C2552ABUFF[0];
		}
	}    
}

#pragma interrupt()
void IntIRQ3()	                                /*B口中断*/
{
	INT8U byFlag;
	asm(" OR.W #$700,SR");	                    /*禁止中断*/
	byFlag= sio_16c2552b.Interrupt_Id & 0xf;
	if((byFlag == 0x4) || (byFlag == 0xc))	    /*接收中断*/
	{
		while(sio_16c2552b.line_status & 0x01)
		{
			if((INT32U)PRX16C2552B < (INT32U)(&BYRX16C2552BBUFF[0]) + RX16C2552_LENGTH)
				*PRX16C2552B++ = sio_16c2552b.data_io;
			else
				UARTERRFLAG |= UARTBREFULL;
		}
	}
	else if(byFlag == 0x02)	                    /*发送中断*/
	{
		while(((INT32U)PTX16C2552BNOW < (INT32U)PTX16C2552B) && (sio_16c2552b.line_status & 0x20))   /*有发送数据且THR为空*/
			sio_16c2552b.data_io =  *(PTX16C2552ANOW++);
		if(((INT32U)PTX16C2552BNOW >= (INT32U)PTX16C2552B) && (sio_16c2552b.line_status & 0x40))     /*THR和TSR为空,发送完成*/
		{
			DISABLE16C2552BTX	                /*禁止发送中断,并处于接收状态*/
			PTX16C2552B = &BYTX16C2552BBUFF[0];
		}
	}  
}

⌨️ 快捷键说明

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