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

📄 dkk6interfacelib.c

📁 在DSP处理器上运行的一段C程序
💻 C
字号:

#include "InterfaceLIB.h"

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


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

/**********************************************************/
/*              Initialazing Serialserials                */
/*                                                        */
/*                                                          */
/* 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+LCR)) = 0x80;            // Enable access to the divisor latches by setting DLAB in LCR
		   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	
          
          //使能增强功能 使能串口8自动流控制功能
          *((int*)(AddSerial+LCR)) = 0xBF;             //if want to use EFR,LCR must be 0xBF
          if(ComNum == 8)
		  {	
				
				*((int*)(AddSerial+EFR)) = 0xD0;	   //0xD0 - 11010000:bit6=1,bit7=1 enable RTS CTS flow control,bit4=1 enable enhanced function
		  }
		  else
		  {
		  	    *((int*)(AddSerial+EFR)) = 0x10;
		  }
          
          //设置工作模式  RTS输出低电平 INT output Enable
          *((int*)(AddSerial+LCR)) = 0x7F;             //use MCR, LCR[7] must be 0
          parameter = (Mode << 4 ) | 0xA ;             //0x0A - 00001010 设置模式Mode=0正常,Mode=1循环,INT output=1,out1=0,RTS=1,DTR=0
          *((int*)(AddSerial+MCR)) = parameter;	
          
          //使能RX TX FIFO, Reset RX TX FIFO  
   	      *((int*)(AddSerial+LCR)) = 0x7F;
   	      *((int*)(AddSerial+FCR)) = 0x01;             //0x01-00000001:Enable FIFO
   	      *((int*)(AddSerial+FCR)) = 0x07;             //0x07-00000111:Reset FIFO

          //设置收到几个字节触发中断,以及流控制上下限
          if((Count >= 36) && (Count <= 90))        
          {
		 
	         //中断	 
			 *((int*)(AddSerial+LCR)) = 0xBF;              //enable FCTR
     	     *((int*)(AddSerial+FCTR)) = (TABLED&SELRX);   //0x30 - 00110000: bit4=1 bit5=1 select Table-D; bit7=0 set RX
		     *((int*)(AddSerial+TRG))  = Count;            //set Trigger Level Register
		     *((int*)(AddSerial+FCTR)) = (TABLED|SELTX);   //0x30 - 00110000: bit4=1 bit5=1 select Table-D; bit7=1 set TX
		     *((int*)(AddSerial+TRG))  = Count;            //set Trigger Level Register
		     		     
		     //流控制
		     *((int*)(AddSerial+FCTR)) = (TABLED|0x03|0x40);  //0x03-00000011:bit1=1,bit0=1 设置流控制的值+-36;0x40-01000000:bit6=1 选择增强模式 , 才能访问EMSR和FLVL
		     *((int*)(AddSerial+LCR)) = 0x7F;                 //LCR[7]=0 才能访问EMSR
		     *((int*)(AddSerial+EMSR)) = EMSR11;              //bit5=1 bit4=1 设置流控制的值
				
				 if(ComNum == 7)
				 {
	         *((int*)(AddSerial+IER)) = 0x01;                 //IER, enable receive interrupt
         }
          }
          else if((Count<36)||(Count>90)) 
               {
      	           return FALSE;
      	       }
		  //取出当前接收缓存中的数据个数
		  *((int*)(AddSerial+EMSR)) = (0xFC&EMSR11);       //bit1=0 bit0=0 RX FIFO Counter Mode
    	  len = (*((int*)(AddSerial+FLVL)))&0xFF;
		  while(len > 0)
		  {
				parameter = *((int*)(AddSerial+RHR));     //Clear the reciever FIFO
				len--;
		  }

          //设置数据位、停止位、奇偶校验位 	
          parameter = ((Data - 5) & 0x03) + (((Stop-1) & 0x01) << 2) ;   //数据位LCR[1:0]和停止位	
          parameter |= (Parity & 0x07) << 3;
          *((int*)(AddSerial+LCR)) = parameter;
			
		  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,CountR;
	if(ComNum < 1 || ComNum > 8 || pReadBuffer == NULL) return FALSE;
	switch(ComNum)
	{
	
	case 7:
	case 8:
		AddSerial = 0x00816000 + (ComNum - 7) * 0x1000;
			////取出当前接收缓存中的数据个数
			*((int*)(AddSerial+EMSR)) = (0xFC&0x30);    //bit1=0 bit0=0 RX FIFO Counter Mode
			CountR = (*((int*)(AddSerial+FLVL)))&0xFF;
			if(CountR > 128)
			{
				*RealSize = 0;
				return FALSE;
			}
		    *RealSize = CountR >= ReadBufferSize ? ReadBufferSize : CountR;
		    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,CountW;
	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+EMSR)) = (0x01|EMSR11);   //bit1=0 bit0=1 TX FIFO Counter Mode
		   CountW = (*((int*)(AddSerial+FLVL)))&0xFF;
		   EmptyLen = 128 - CountW;	
		   if(WriteSize > EmptyLen) 
	       {
			   return FALSE;
		   }
    	   else
		   {
			   for(i = 0;i < WriteSize;i++)
			      *((int*)(AddSerial+THR)) = pWriteBuffer[i];
			   return TRUE;
		   }
	default:
		break;
	}return FALSE;
}

⌨️ 快捷键说明

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