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

📄 interfacelib.c

📁 在DSP上运行的一段C程序源代码
💻 C
字号:

#include "InterfaceLIB.h"

/********** Interface Functions  Definition      **********/


/**********************************************************/
/*         Serial Ports Interface Functions				  */
/**********************************************************/

/**********************************************************/
/*              Initialazing Serialserials                */
/*                                                        */
/* ComNum---    
/* Bitrate---	2400  ,3200  ,4800  ,6525  ,7680  ,       */
/*				9309  ,9600  ,10593 ,11520 ,13050 ,       */
/*				14400 ,15360 ,19200 ,23040 ,26100 ,       */
/*				27927 ,28800 ,30720 ,31779 ,38400 ,       */
/*				57600 ,51200 ,76800 ,102400,115200,       */
/*				122880,153600,204800,307200,614400		  */
/* 非智能:			                                      */
/* Data---      8,7,6,5bit                                */
/* Stop---      1=1,2=1.5,2                               */
/* Parity---    0- no parity                              */
/*              1- odd                                    */
/*		        3- even                                   */
/*		        5- parity bit forced to 1                 */
/*		        7- parity bit forced to 0                 */
/* Count ---    非智能的FIFO大小			         	  */
/* Mode  ---    工作方式0 正常 1 循环		              */
/* 
/**********************************************************/
BOOL InitCom (int ComNum,int Bitrate,int Data,int Stop,
			  int Parity,int Count,	 int Mode )
{
    int Init_Data[3],i,Status;
    int Bitrate_Table[2][25]=						/*	Intelligent Serials								*/
           {2400  ,	3200  ,	4800  ,	6400  ,	7680  ,	
			9600  ,	11520 ,	12800 ,	14400 ,	15360 ,
            19200 ,	25600 ,	28800 ,	30720 ,	38400 ,	
			51200 ,	57600 ,	76800 ,	102400,	115200,
            122880,	153600,	204800,	307200,	614400,
            0x30  ,	0x2c  ,	0x28  ,	0x21  ,	0x17  ,
			0x24  ,	0x13  ,	0x15  ,	0x12  ,	0x0f  ,
            0x20  ,	0x0d  ,	0x0a  ,	0x07  ,	0x14  ,
			0x05  ,	0x10  ,	0x0c  ,	0x01  ,	0x08  ,
            0x7f  ,	0x7e  ,	0x7d  ,	0x00  ,	0x7c
            };

	unsigned char parameter , OldACR ;
    unsigned int divisor , len , AddSerial;
	

	if( ComNum  > 8		|| ComNum  < 1    ||
		Bitrate > 614400|| Bitrate < 2400 ||
		Stop    > 2     || Stop    < 1    ||
		Mode	> 1		|| Mode	   < 0
		)
		return FALSE;                          
	switch(ComNum)
	{
	
	case 7:											/*	unintelligent Serials							*/
	case 8:
		{
			if((Parity < 0 || Parity > 7 || Parity == 2 || Parity == 4 || Parity == 6)
				|| (( (Data & 0x0f) > 8) || ( (Data & 0x0f) < 5 )))
				return FALSE;
			AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
			/*设置波特率 */
			*((int*)(AddSerial+SPR)) = CSR;			/*	Write SPR to Select CSR							*/
			*((int*)(AddSerial+ICR)) = 0x00;		/*	Write 0x00 into CSR for reset 16c954			*/

            *((int*)(AddSerial+LCR)) = 0xBF;		/*	Enable access to the EFR, DLL and DLM registers	*/
            divisor =(unsigned int)(614400/Bitrate);/*	Input frequency is 9.8304Mhz					*/
            parameter = divisor  & 0xFF;
            *((int*)(AddSerial+DLL)) = parameter;	/*	DLL												*/
            parameter = (divisor >> 8) & 0xFF;
			*((int*)(AddSerial+DLM)) = parameter;	/*	DLM												*/
			if(ComNum == 8)
				*((int*)(AddSerial+EFR)) = 0xD0;	/*	EFR, enhance mode select,enable RTS CTS flow control*/
			else
				*((int*)(AddSerial+EFR)) = 0x10;	/*	EFR, enhance mode select,enable RTS CTS flow control*/
            parameter = ((Data - 5) & 0x03) + (((Stop-1) & 0x01) << 2) ;/*	数据位LCR[1:0]和停止位		*/
			parameter |= (Parity & 0x07) << 3;
            *((int*)(AddSerial+LCR)) = parameter;	/* LCR ,设置数据位,停止位,校验位					*/

            parameter = (Mode << 4 ) | 0xa ;
            *((int*)(AddSerial+MCR)) = parameter;	/*	设置模式Mode=0正常,Mode=1循环,out2=1,out1=0,RTS=1,DTR=0*/

			/*设置收到几个字节触发中断*/
            if(Count >= 1 && Count < 128)
            {
				*((int*)(AddSerial+FCR)) = 0x07;		/*	Enable FIFO, Flush THR and RHR			*/
				*((int*)(AddSerial+SPR)) = ACR;			/*	SPR = 0, PT ACR							*/
				*((int*)(AddSerial+ICR)) = 0x60;		/*	ACR, enable 950 mode,ICR read enable	*/
				*((int*)(AddSerial+SPR)) = TTL;			/*	SPR = 4, PT TTL							*/
				*((int*)(AddSerial+ICR)) = Count;		/*	Transmit trigger level					*/
				*((int*)(AddSerial+SPR)) = RTL;			/*	SPR = 5, PT RTL							*/
				*((int*)(AddSerial+ICR)) = Count;		/*	Receive trigger level					*/
				*((int*)(AddSerial+SPR)) = FCL;			/*	SPR = 6, PT FCL							*/
				*((int*)(AddSerial+ICR)) = 1;
				*((int*)(AddSerial+SPR)) = FCH;
				*((int*)(AddSerial+ICR)) = Count;
            }else if(Count < 1 || Count > 127) return FALSE;
			*((int*)(AddSerial+SPR)) = ACR;
			OldACR = *((int*)(AddSerial+ICR));
			*((int*)(AddSerial+ICR)) = OldACR | 0x80 ;
			len = *((int*)(AddSerial+RFL)) & 0xFF ;
			*((int*)(AddSerial+SPR)) = ACR;
			*((int*)(AddSerial+ICR)) = OldACR;

			while(len > 0)
			{
				parameter = *((int*)(AddSerial+RHR));	/*	Clear the reciever FIFO					*/
				len--;
			}
			if(ComNum == 7) *((int*)(AddSerial+IER)) = 1;				/*	IER, enable receive interrupt			*/		
			break;
		}
	default:
		return FALSE;
	}
	return TRUE;
}
			 
BOOL ResetCom(int ComNum)				/*	Reset Com	*/
{
	unsigned int AddSerial;
	if(ComNum < 1 || ComNum > 8) return FALSE;
	switch(ComNum)
	{
	case 7:
	case 8:
		AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
		*((int*)(AddSerial + SPR)) = CSR;	/* SPR = 0x0C, PT CSR						*/
		*((int*)(AddSerial + ICR)) = 0x00;	/* Reset Com								*/
		break;
	default:
		return FALSE;
	}
	return TRUE;
}
BOOL  ReadCom (int  ComNum,				/*	Number of Com 1-8							*/
			   BYTE *pReadBuffer,		/*	Buffer for readed data from com				*/
			   int  ReadBufferSize,		/*	Size of Buffer								*/
			   int  *RealSize			/*	Real Size of readed data					*/
			  )							
{
	unsigned int AddSerial;
	int Status,i,RevDataLen,Count1,Count2;
	if(ComNum < 1 || ComNum > 8 || pReadBuffer == NULL) return FALSE;
	switch(ComNum)
	{
	
	case 7:
	case 8:
		AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
		*((int*)(AddSerial+SPR)) = ACR;						/*	PT ACR									*/
		*((int*)(AddSerial+ICR)) |= 0x80;					/*	ACR = TempACR (ACR[7] = 1)				*/
		Count1 = *((int*)(AddSerial+RFL))&0xFF;				/*	Number of characters int receiver FIFO	*/
		Count2 = *((int*)(AddSerial+RFL))&0xFF;				/*	Number of characters int receiver FIFO	*/
		*((int*)(AddSerial+SPR)) = ACR;						/*	PT ACR									*/
		*((int*)(AddSerial+ICR)) &= 0x7F;					/*	ACR = TempACR (ACR[7] = 0)				*/
		if((Count1 != Count2)|| Count1 > 128 || Count2 > 128 )
		{
			*RealSize = 0;
			return FALSE;									/*	If RHR is Empty,Return					*/
		}
		*RealSize = Count1 >= ReadBufferSize ? ReadBufferSize : Count1;
		if(*RealSize == 0)	return FALSE;
		for(i = 0;i < *RealSize;i++)
			pReadBuffer[i] = (BYTE)(*( (int*)(AddSerial+RHR) ) & 0xFF);
		return TRUE;
	default:
		break;
	}
	*RealSize = 0;
	return FALSE;
}
BOOL WriteCom(int ComNum,				/*	Number of Com								*/
			  BYTE *pWriteBuffer,		/*	Buffer saving data to be writed				*/
			  int WriteSize				/*	Size of Data to be writed					*/
			 )							/*	Suceed ,return TRUE; fail ,return FALSE		*/
{
	unsigned int AddSerial;
	int EmptyLen,i;
	if(ComNum < 1 || ComNum > 8 || pWriteBuffer == NULL) return FALSE;
	switch(ComNum)
	{
	
	case 7:
	case 8:
		if(WriteSize < 1 || WriteSize > 128) 
			return FALSE;
		AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
		*((int*)(AddSerial+SPR)) = ACR;					/*	PT ACR									*/
		*((int*)(AddSerial+ICR)) |= 0x80;				/*	ACR = TempACR (ACR[7] = 1)				*/
		EmptyLen = 128 - *((int*)(AddSerial+TFL))&0xFF;	/*	Number of characters int receiver FIFO	*/
		*((int*)(AddSerial+SPR)) = ACR;					/*	PT ACR									*/
		*((int*)(AddSerial+ICR)) &= 0x7F;				/*	ACR = TempACR (ACR[7] = 0)				*/
		if(WriteSize > EmptyLen) 
			return FALSE;
		else
		{
			for(i = 0;i < WriteSize;i++)
				*((int*)(AddSerial+THR)) = pWriteBuffer[i];/*	Read *RealSize Data			*/
			return TRUE;
		}
	default:
		break;
	}return FALSE;
}


⌨️ 快捷键说明

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