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

📄 ecan.c

📁 基于TI公司DSP2812 CAN 通讯C源码
💻 C
字号:

#include "DSP281x_Device.h"     // DSP28 Headerfile Include File
#include "DSP281x_Examples.h"   // DSP28 Examples Include File
#include "eCan.h"   // DSP28 Examples Include File
#include "ext_inf.h"
union ERRFLAG_REG bitErrFlag;
struct  ADCTRL stAdCtrl;
struct SYSCHECK sTsysErrCheck;
//0:x5043
//------------------------------
Uint16 nRxDataBuf[8];
int nTxDataBuf[64];
union TxCommand_REG bitTxCommand;

void initCanData()
{
	bitTxCommand.all[0]=0;
	bitTxCommand.all[1]=0;
	bitTxCommand.all[2]=0;
	bitErrFlag.all = 0;	
}

int TxData(unsigned int nAddr,unsigned int nComm,int nRsvd3,int nDataLen,int *nData)
{volatile struct MBOX *mBox;
union  TXMSGID_REG msgid;
long i;
int *p;
Uint32 bit;
	if(nDataLen>64) return(-1);
	msgid.bit.nAddr = nAddr;
	msgid.bit.rsvd3 = nRsvd3;
	msgid.bit.nComm = nComm;
	msgid.bit.IDE = 1;
	msgid.bit.AME = 1;
	msgid.bit.AAM = 0;
	if(nDataLen>64 | nDataLen<1) return(-1);
	
	msgid.bit.bFram = 0;
	msgid.bit.nFramId = 0;
	if(nDataLen > 4)
	{
		msgid.bit.bFram = 1;
	}
	i = 0;
	while((ECanaRegs.CANTRS.all & 0x0000FFFF) !=0 )//while(ECanaRegs.CANTA.all != 0x0000FFFF )
	{
	 	i++;
	 	if(i>1000000)return(-2);
	}  // Wait for all TAn bits to be set..
    ECanaRegs.CANTA.all = 0x0000FFFF;   // Clear all TAn
	p = nData;
	mBox = &(ECanaMboxes.MBOX0);
	ECanaRegs.CANME.all = 0xffff0000;
	for(i=0;i<(nDataLen-1)/4+1;i++)
	{
	
		
		msgid.bit.nFramId = i;
		mBox->MSGID.all =msgid.all ;
		mBox->MSGID.bit.IDE =1;
		
		mBox->MDL.word.LOW_WORD =*(p+i*4+0) ;
		mBox->MDL.word.HI_WORD  =*(p+i*4+1) ;
		mBox->MDH.word.LOW_WORD  =*(p+i*4+2) ;
		mBox->MDH.word.HI_WORD =*(p+i*4+3) ;
		mBox++;
	}	
	ECanaRegs.CANME.all = 0xffffffff;

    
    bit = 0x0000FFFF;
    bit =bit >>(16-i);
	ECanaRegs.CANTRS.all = bit;//0x0000FFFF;  // Set TRS for all transmit mailboxes
	
       
//       MessageReceivedCount++;
	return(0);
}

void Rx_Data(volatile struct MBOX *mBox)
{union  TXMSGID_REG msgid;
	
	CAN_LED = 1;
	sTsysErrCheck.CanLedCtrlTime = lTimeL;
	sTsysErrCheck.can_isr_flag = 0;
	bitErrFlag.bit.can_isr_err = 0;
	
	nRxDataBuf[0] = mBox->MSGID.all;
 	nRxDataBuf[1] = mBox->MSGID.all>>16;
 
 
	nRxDataBuf[2] = mBox->MDL.word.LOW_WORD;NOP;
	nRxDataBuf[3] = mBox->MDL.word.HI_WORD;NOP;

	nRxDataBuf[4] = mBox->MDH.word.LOW_WORD;NOP;
	nRxDataBuf[5] = mBox->MDH.word.HI_WORD;NOP;
	msgid.all = mBox->MSGID.all;
	

	if((mBox->MSGID.all & 0x0fffffff) == 0x0fffffff)
	{
		switch(mBox->MSGID.all & 0x1fffffff )
	 	{
	 		case 0x0fffffff:
	 		{
	 			//broad Time
	 			//TxData(0xffff,0xffff,0xffff,4,nRxDataBuf+2);
	 			
	 			lTimeL = mBox->MDL.all;
	 			lTimeH = mBox->MDH.all;
	 			
	 			break;
	 		}
	 		
	 		case 0x1fffffff:
	 		{
	 			//Write addr retun command  )x1ff
	 			//TxData(0xffff,0xffff,4,nRxDataBuf+2);
	 			if((nYx & 1) ==1)
	 			{
	 				nRtuAddr = mBox->MDL.all;
	 				bitTxCommand.bit.wr_Addr = 0x1;
	 			}
	 			break;
	 		}
	 		default :
	 		break;
	 	}
	}
 	else if( msgid.bit.nAddr == nRtuAddr)
 	{
 		
 		switch(msgid.bit.nComm )
	 	{//wr xs
	 	int n,nf;
	 		case 0x10:
	 		case 0x11:
	 		case 0x12:
	 		case 0x13:
	 		case 0x14:
	 		case 0x15:
	 		case 0x16:
	 		case 0x17:
	 		case 0x18:
	 		case 0x19:
	 		case 0x1a:
	 		case 0x1b:
	 		{
	 			//if(msgid.bit.bFram != 1 && msgid.bit.nFramId != 0) return;
	 			n =  msgid.bit.nComm & 0x0f;
	 			if(n >11) return;
	 			nf = (msgid.bit.nFramId  )*4;
	 			if(nf >16) return;
	
	 			nU_I_Xs[n][nf+0] = mBox->MDL.word.LOW_WORD;
	 			nU_I_Xs[n][nf+1] = mBox->MDL.word.HI_WORD;
	 			nU_I_Xs[n][nf+2] = mBox->MDH.word.LOW_WORD;
	 			nU_I_Xs[n][nf+3] = mBox->MDH.word.HI_WORD;
	 		
	 			if(msgid.bit.bFram == 1 && msgid.bit.nFramId == 0)
	 				bitTxCommand.bit.wr_xs = msgid.bit.nComm ;
	 			break;
	 		}
	 		//rd xs
	 		case 0x20:
	 		case 0x21:
	 		case 0x22:
	 		case 0x23:
	 		case 0x24:
	 		case 0x25:
	 		case 0x26:
	 		case 0x27:
	 		case 0x28:
	 		case 0x29:
	 		case 0x2a:
	 		case 0x2b:
	 		{
	 			if(msgid.bit.bFram == 1 && msgid.bit.nFramId != 0) return;
	 			if(msgid.bit.bFram == 1 ) return;
	 			if(msgid.bit.nFramId >11) return;
	 			bitTxCommand.bit.rd_xs = msgid.bit.nComm;
	 			break;
	 		}
	 		//wr adctrl
	 		case 0x30:
	 		{
	 			if(msgid.bit.nFramId ==0)
	 			{
	 				stAdCtrl.nBeginTimeJG = (Uint32)(nRxDataBuf[3]);
	 				stAdCtrl.nBeginTimeJG = ((stAdCtrl.nBeginTimeJG <<16) & 0xffff0000)+ ((Uint32)nRxDataBuf[2] & 0x0000ffff);
		 			
		 			
					stAdCtrl.nBeginL = nRxDataBuf[4];
					stAdCtrl.nEndL = nRxDataBuf[5];
					
		 			bitTxCommand.bit.wr_adctrl = msgid.bit.nComm;	 			
	 			}
	 			if(msgid.bit.nFramId ==1)
	 			{
	 				stAdCtrl.nMinPoint = nRxDataBuf[2];
	 				stAdCtrl.nBeginU = nRxDataBuf[3];
					stAdCtrl.nEndU =  nRxDataBuf[4];
	 			}
	 			break;
	 		}
	 		//rd adctrl
	 		case 0x31:
	 		{
	 			
	 			bitTxCommand.bit.rd_adctrl = msgid.bit.nComm;
	 			
	 			break;
	 		}
	 		//rd real data
	 		case 0x32:
	 		{
	 			bitTxCommand.bit.rd_real_data = msgid.bit.nComm;
	 			
	 			break;
	 		}
	 			//rd db data
	 		case 0x33:
	 		{
	 			bitTxCommand.bit.rd_db_data = msgid.bit.nComm;
	 			bitTxCommand.bit.db_data_sent_wait_time_flag = 0;
	 			break;
	 		}
	 		//ack_rd_db_data
	 		case 0x34:
	 		{	unsigned int nCurrentDbPos;
	 		//	bitTxCommand.bit.ack_rd_db_data = msgid.bit.nComm;
	 			nCurrentDbPos = nRxDataBuf[2]; //pos of Db
	 			if(nCurrentDbPos < DB_MAX )
	 				nAdresultDb[nCurrentDbPos][28] = 0;
	 			break;
	 		}
	 		//stop_db_data_sent
	 		case 0x35:
	 		{	
	 			bitTxCommand.bit.stop_db_data_sent = msgid.bit.nComm;
	 			bitTxCommand.bit.db_data_sent_wait_time_flag = 0;
	 			break;
	 		}
	 		case 0x36://rd_dreal_data
	 		{	
	 			bitTxCommand.bit.rd_dreal_data = msgid.bit.nComm;
	 			break;
	 		}
	 		case 0x37://rd_Offset_data
	 		{	
	 			bitTxCommand.bit.rd_Offset_data = msgid.bit.nComm;
	 			break;
	 		}
	 		case 0x38://rd_Offset_data and rd_dreal_data
	 		{	
	 			bitTxCommand.bit.rd_dreal_Offset_data = msgid.bit.nComm;
	 			break;
	 		}
	 		default :
	 		break;
	 	}
 	
 	}
}

int nCurrentPosInDb;
unsigned long tWait;
void Can_Err_Fx();
void AnyEcan()
{unsigned long n;
int i;
	
	
	if(bitTxCommand.all[0] == 0 && bitTxCommand.all[1] == 0 && bitTxCommand.all[2] == 0 ) 
	{
		Can_Err_Fx();
		return;
		}
	
	if(bitTxCommand.bit.wr_Addr)//addr return
	{
		
		nTxDataBuf[0] = 0x1fff;
		nTxDataBuf[1] = 0;
		nTxDataBuf[2] = bitTxCommand.all[0];
		nTxDataBuf[3] = bitTxCommand.all[1];
		TxData(nRtuAddr,0xffff,0xffff,4,nTxDataBuf);
		bitTxCommand.bit.wr_Addr = 0;
		SaveAdr(nRtuAddr);
		
		
		
		
		
	}
	else if( bitTxCommand.bit.wr_xs )//wr xs
	{	
		n = bitTxCommand.bit.wr_xs	& 0x0f;
		if(n>11) 
		{bitTxCommand.bit.wr_xs = 0;return;}
		
		nTxDataBuf[0] = 0x0000;
		nTxDataBuf[1] = 0x0000;
		nTxDataBuf[2] = bitTxCommand.all[0];
		nTxDataBuf[3] = bitTxCommand.all[1];
		TxData(nRtuAddr,bitTxCommand.bit.wr_xs,0,4,nTxDataBuf);
		bitTxCommand.bit.wr_xs = 0;
		SaveX5043(n,&(nU_I_Xs[n][0]) );
		bitErrFlag.bit.x5043_save = 1;
		
	}
	else if(bitTxCommand.bit.rd_xs)//rd xs
	{
		n = bitTxCommand.bit.rd_xs	& 0x0f;
		for( i =0 ;i<20;i++)
		{nTxDataBuf[i] = nU_I_Xs[n][i];}
		TxData(nRtuAddr,bitTxCommand.bit.rd_xs,0,20,nTxDataBuf);
		bitErrFlag.bit.x5043_save = 0;
		bitTxCommand.bit.rd_xs = 0;
	}
	
	else if(bitTxCommand.bit.wr_adctrl )//wr_adctrl data
	{		
		nTxDataBuf[0] = 0;
		nTxDataBuf[2] = 0;
		nTxDataBuf[3] = bitTxCommand.all[0];
		nTxDataBuf[4] = bitTxCommand.all[1];
		
		TxData(nRtuAddr,bitTxCommand.bit.wr_adctrl,0,4,nTxDataBuf);
		bitTxCommand.bit.wr_adctrl = 0;
		SaveAdCtrl();
		bitErrFlag.bit.x5043_save =1;
		
	}
	else if(bitTxCommand.bit.rd_adctrl )//rd_adctrl data
	{		
		nTxDataBuf[0] = stAdCtrl.nBeginTimeJG;
		nTxDataBuf[1] = stAdCtrl.nBeginTimeJG>>16;
		nTxDataBuf[2] = stAdCtrl.nBeginL;
		nTxDataBuf[3] = stAdCtrl.nEndL;
		nTxDataBuf[4] = stAdCtrl.nMinPoint;
		nTxDataBuf[5] = stAdCtrl.nBeginU;
		nTxDataBuf[6] = stAdCtrl.nEndU;
		TxData(nRtuAddr,bitTxCommand.bit.rd_adctrl,0,8,nTxDataBuf);
		bitTxCommand.bit.rd_adctrl = 0;
	}
	else if(bitTxCommand.bit.rd_real_data )//rd real data
	{
		
		nTxDataBuf[0] = bitErrFlag.all;//
		nTxDataBuf[1] = 0x0000;//
		nTxDataBuf[2] = bitTxCommand.all[0];
		nTxDataBuf[3] = bitTxCommand.all[1];
		for(i=0;i<20;i++)
			nTxDataBuf[i+4] = nAdresult[i];
		TxData(nRtuAddr,bitTxCommand.bit.rd_real_data,0,20,nTxDataBuf);
		bitTxCommand.bit.rd_real_data = 0;
	}
	else if(bitTxCommand.bit.rd_db_data )//rd db data
	{int i,k;
		/*if(bitTxCommand.bit.db_data_sent_wait_time_flag)
		{
			n = (lTimeL - tWait);
			if(n<50) return;
		}*/
		k = nCurrentPosInDb;
		n = 0;
		for(i=0;i<DB_MAX;i++)
		{	
			if(nAdresultDb[k][28] != 0) n++;
			k = (k+1) & DB_MAX-1;
		}
		if(n == 0)
		{
			bitErrFlag.bit.bDbHaveBreakFlag = 0; //may move 
			bitErrFlag.bit.bHaveOneDbFlag = 0;
			bitErrFlag.bit.bDbHaveDataFlag = 0; 
			bitErrFlag.bit.bDbWillFullFlag = 0;  
		}
		else if(n <= 5)
		{
			bitErrFlag.bit.bDbWillFullFlag = 0; 
		}
		//nCurrentPosInDb = (nCurrentPosInDb) & DB_MAX-1;
		k = nCurrentPosInDb = nCurrentPosInDb & DB_MAX-1;
		for(i=0;i<DB_MAX;i++)
		{
			if(nAdresultDb[k][28] !=0 )
			{
				nCurrentPosInDb = k;				
				break;
			}
			k = (k+1) & DB_MAX-1;
		}
		if(nAdresultDb[nCurrentPosInDb][28] != 0)
		{
			nTxDataBuf[0] = 0xffff;
			nTxDataBuf[1] = nCurrentPosInDb;//farm count
			nTxDataBuf[2] = n;//tol Farm 
			nTxDataBuf[3] = 0;
			for(i=0;i<28;i++)
				nTxDataBuf[i+4] = nAdresultDb[nCurrentPosInDb][i];
			TxData(nRtuAddr,bitTxCommand.bit.rd_db_data,0,32,nTxDataBuf);
			tWait = lTimeL;
			//bitTxCommand.bit.db_data_sent_wait_time_flag = 1;
		}
		else
		{
			nTxDataBuf[0] = 0;
			nTxDataBuf[1] = 0;//farm count
			nTxDataBuf[2] = 0;//tol Farm 
			nTxDataBuf[3] = 0;
			TxData(nRtuAddr,bitTxCommand.bit.rd_db_data,0,4,nTxDataBuf);
			bitTxCommand.bit.rd_db_data = 0;
			tWait = lTimeL;
			bitTxCommand.bit.db_data_sent_wait_time_flag = 0;	
			
		}
		bitTxCommand.bit.rd_db_data = 0;
	}	
	//ack rd db data	
//	else if(bitTxCommand.bit.ack_rd_db_data )
//	{	}
//------------------------------------------	
	//stop_db_data_sent
	else if(bitTxCommand.bit.stop_db_data_sent )
	{
		nTxDataBuf[0] = 0;
		nTxDataBuf[1] = 0;//farm count
		nTxDataBuf[2] = 0;//tol Farm 
		nTxDataBuf[3] = 0;
		TxData(nRtuAddr,bitTxCommand.bit.stop_db_data_sent,0,4,nTxDataBuf);
		bitTxCommand.bit.stop_db_data_sent = 0;
		bitTxCommand.bit.db_data_sent_wait_time_flag = 0;
	}
	else if(bitTxCommand.bit.rd_dreal_data )//rd dreal data
	{	int k,n;
	
		for( n=0;n<20;n++)
		{	k =n*5;
			nTxDataBuf[n] = nAdData[k];
			nTxDataBuf[n+20] = nAdData[k+1];		
		}
		nTxDataBuf[19] = nAdData[5*19 +2];
		nTxDataBuf[19+20] = nAdData[5*19 +3];		
		
		TxData(nRtuAddr,bitTxCommand.bit.rd_dreal_data,0,20*2,nTxDataBuf);
		bitTxCommand.bit.rd_dreal_data = 0;
	}
	//rd_Offset_data
	else if(bitTxCommand.bit.rd_Offset_data )
	{
		
		int k,n;
		
		for( n=0;n<20;n++)
		{	k =n*5;
			nTxDataBuf[n] = nAdData[k+4];		
		}			
		nTxDataBuf[18] = bitErrFlag.all;
		
		TxData(nRtuAddr,bitTxCommand.bit.rd_Offset_data,0,20,nTxDataBuf);
		
		bitTxCommand.bit.rd_Offset_data = 0;
	}
	//rd_dreal_Offset_data
	else if(bitTxCommand.bit.rd_dreal_Offset_data )
	{
		
		int k,n;
	
		for( n=0;n<20;n++)
		{	k =n*5;
			nTxDataBuf[n] = nAdData[k];
			nTxDataBuf[n+20] = nAdData[k+1];
			nTxDataBuf[n+40] = nAdData[k+4];		
		}
	//	nTxDataBuf[18] = nAdData[5*19 +2];
	//	nTxDataBuf[18+20] = nAdData[5*19 +3];	
		//nTxDataBuf[18] = 0;
		//nTxDataBuf[18+20] = 0;	
		nTxDataBuf[18+40] = bitErrFlag.all;//
		TxData(nRtuAddr,bitTxCommand.bit.rd_dreal_Offset_data,0,20*3,nTxDataBuf);
				
		bitTxCommand.bit.rd_dreal_Offset_data = 0;

	}
}
// INT9.5
interrupt void ECAN_RX_ISR(void)//ECAN0INTA_ISR(void)  // eCAN-A
{
  // Insert ISR Code here
volatile struct MBOX *mBox;
unsigned long bRmp,bRmpBit;

int i;
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; 
   mBox = &(ECanaMboxes.MBOX31);
   do
   {	
   		bRmp = ECanaRegs.CANRMP.all & 0xffff0000;
   		bRmpBit = 0x80000000;
   		for(i=0;i<16;i++)
   		{
   			if(bRmp == 0)break;
   			if(bRmp  & 0x80000000)
   			{
   				
   				Rx_Data(mBox - i);
		     	
		     	ECanaRegs.CANRMP.all = bRmpBit;      //清接收标志		     		
   			}
   			bRmp = bRmp << 1;
   			bRmpBit = bRmpBit >> 1;
   		}     	
    }while( ECanaRegs.CANRMP.all & 0xffff0000 != 0);
 
    asm(" 	clrc INTM"); 

}

// INT9.6
interrupt void ECAN_TX_ISR(void)//ECAN1INTA_ISR(void)  // eCAN-A
{
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; 

    asm(" 	clrc INTM"); 

}
void Can_Err_Fx()
{unsigned int i;
	if(sTsysErrCheck.can_isr_flag != 0)
	{
		i = (unsigned int )(nTimeSecond - sTsysErrCheck.can_isr_err_Time);
		if( i > 60 )
		{
			bitErrFlag.bit.can_isr_err = 0x1;
			InitECan( nRtuAddr);
			
		}
		if(i>120)
		{
		sTsysErrCheck.can_isr_err_Time  = nTimeSecond=0;
		for(;;);
		}

	}
	
	else 
	{
		sTsysErrCheck.can_isr_err_Time  = nTimeSecond;
		sTsysErrCheck.can_isr_flag = 0xffff;
		bitErrFlag.bit.can_isr_err = 0x0;
	}
	i=	lTimeL - sTsysErrCheck.CanLedCtrlTime;
	if(i>100)
		CAN_LED = 0;
}	

⌨️ 快捷键说明

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