?? ecan.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 + -