Part Number: TMS320F28035
Here is a customer issue using CAN in F28035, to communicate with the computer.
When mailboxes 0 and 2 are enabled to receive message, it works, but when mailboxes 0, 1 and 2 are enabled, it fails. The ISR is enabled at the receiving event of mailbox 0, and the set breakpoint can not be accessed with mailboxes 0, 1 and 2 enabled.
The below is the eCAN configuration for mailboxes 0, 1 and 2 enabled. (3,4,5,6 to send,0,1,2 to receive)
void InitECana(void) // Initialize eCAN-A module
{
Uint32 i,*addr;
unsigned long ulECanCntTmp;
struct ECAN_REGS ECanaShadow;
EALLOW;
ECanaRegs.CANME.all=0x00000000;//
// CANTX
ECanaShadow.CANTIOC.all=ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC=1;
ECanaRegs.CANTIOC.all=ECanaShadow.CANTIOC.all;
// CANRX
ECanaShadow.CANRIOC.all=ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC=1;
ECanaRegs.CANRIOC.all=ECanaShadow.CANRIOC.all;
/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */
//HECC mode also enables time-stamping feature
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.SUSP=1;//
ECanaShadow.CANMC.bit.SCB=1; //
ECanaShadow.CANMC.bit.ABO=1; //
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
/* Initialize all bits of 'Master Control Field' to zero */
//Some bits of MSGCTRL comeup in an unknown state.all bits (including reserved bits) of MSGCTRL must be initialized to zero
//ECanaMboxes.MBOX0.MSGCTRL.all =0x00000000;
//...
for(i=0x6100;i<0x6200;i++) //6100-61ffh refer to RAM for can
{
addr=(unsigned long *)i;
*addr=0;
}
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8; // Valid value range is from 0-8.
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
// ½ÓÊÕÓÊÏä
ECanaMboxes.MBOX0.MSGID.all=0xD8ffF300;
ECanaMboxes.MBOX1.MSGID.all=0x07220000 << 2 |0x40000000;
ECanaMboxes.MBOX2.MSGID.all=0xD8ff0000|(CanLoadPositionAddr<<8)|CanLoadSourceAddr; //F1
ECanaMboxes.MBOX3.MSGID.all=0xC50F8003; //100ms
ECanaMboxes.MBOX4.MSGID.all=0xC60F8003;
ECanaMboxes.MBOX5.MSGID.all=0x07EA0000 << 2 | 0x40000000;
ECanaMboxes.MBOX6.MSGID.all=0xD8ff0000|CanLoadPositionAddr; //
//TAn, RMPn, GIFn bits are all zero upon reset and are cleared again as a matter of precaution.
ECanaRegs.CANTA.all=0xFFFFFFFF; //Clear all TAn bits
ECanaRegs.CANRMP.all=0xFFFFFFFF; //Clear all RMPn bits
ECanaRegs.CANGIF0.all=0xFFFFFFFF; //Clear all interrupt flag bits
ECanaRegs.CANGIF1.all=0xFFFFFFFF;
/* Configure bit timing parameters for eCANA*/
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR=1; //=1
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
ECanaShadow.CANES.all=ECanaRegs.CANES.all;//
ulECanCntTmp=0;
while(ECanaShadow.CANES.bit.CCE != 1) //while last 1.1msMax //Wait for CCE bit to be set..
{
//KickDog();//²»Æð
ECanaShadow.CANES.all=ECanaRegs.CANES.all;
ulECanCntTmp++;
if(ulECanCntTmp>20000)//10.4ms
{
break;
}
}
ECanaShadow.CANBTC.all=0;
ECanaShadow.CANBTC.bit.BRPREG=7;//19; // 30000000/{(19+1)*[(2+1)+(1+1)+1}=250KB
ECanaShadow.CANBTC.bit.TSEG2REG=2;//1; // 30000000/{(9+1)*[(2+1)+(1+1)+1}=500KB
ECanaShadow.CANBTC.bit.TSEG1REG=10;
ECanaShadow.CANBTC.bit.SAM=0; //
ECanaShadow.CANBTC.bit.SJWREG=2; //0;
ECanaRegs.CANBTC.all=ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR=0;
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
ECanaShadow.CANES.all=ECanaRegs.CANES.all;
ulECanCntTmp=0;
while(ECanaShadow.CANES.bit.CCE!=0)//14.4us //Wait for CCE bit to be cleared..
{
ECanaShadow.CANES.all=ECanaRegs.CANES.all;
ulECanCntTmp++;
if(ulECanCntTmp>20000)//10.4ms
{
break;
}
}
ui32CanMePara=0x0000007F; // 0x0000007F
ECanaRegs.CANME.all=ui32CanMePara; //Required before writing the MSGIDs
ECanaRegs.CANMD.all=0x00000007; //Mail direction,0:transmit,1:receive 3,4,5,6 to send, 0,1,2 to receive
EDIS;
CanaLAMRegs.LAM0.all=0x87FFFFFF; //
ECanaLAMRegs.LAM1.all=0xFFFFFFFF; //
ECanaLAMRegs.LAM2.all=0x87FF0000;;
}
The only difference between two configuration is
1) for 3 maiboxes
ui32CanMePara=0x0000007F;
ECanaRegs.CANME.all=ui32CanMePara
2)for 2 mailboxes
ui32CanMePara=0x0000007D;
ECanaRegs.CANME.all=ui32CanMePara
Could you help please help provide some suggestion on this issue? I will involve the customer for further information needed. Thank you!