Other Parts Discussed in Thread: TMS320F28335, CONTROLSUITE
Hello,
I am using an TMS320f28335 processor and communicating with external world with a grid connect CAN-USB interface device, as per the implementation I am reading the message from the interface on MBOX1 which I have configured to receive message. When I read message from the CAN-USB interface on to my board I am getting the same CAN data i.e. if mail box has 00001000200030004, this data is copied in my entire buffer but when I debug and do single stepping through my code I read entire CAN data correctly and all the data is correctly populated in buffer. I have tried introducing delay to read between two messages but still the same data is copied for the entire length of my buffer.
Attached is the initialization of CAN B which I do and also before reading each message I clear the RMP bit as shown below
ECanbShadow.CANRMP.all = ECanbRegs.CANRMP.all;
ECanbShadow.CANRMP.bit.RMP1 = 1;
ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all;
Am I missing something?
Thanks,
Ajay
void InitECanb()
{
struct ECAN_REGS ECanbShadow;
asm(" EALLOW"); // EALLOW enables access to protected bits
// Configure eCAN RX and TX pins for CAN operation using eCAN regs
ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all;
ECanbShadow.CANTIOC.bit.TXFUNC = 1;
ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;
ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all;
ECanbShadow.CANRIOC.bit.RXFUNC = 1;
ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
// Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31)
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.WUBA = 1;
ECanbShadow.CANMC.bit.SCB = 1;
ECanbShadow.CANMC.bit.SUSP = 1; //enable Free mode
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
// Initialize all bits of 'Master Control Field' to zero
// Some bits of MSGCTRL register come up in an unknown state. For proper operation,
// all bits (including reserved bits) of MSGCTRL must be initialized to zero
ECanbMboxes.MBOX0.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX1.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX2.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX3.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX4.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX5.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX6.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX7.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX8.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX9.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX10.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX11.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX12.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX13.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX14.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX15.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX16.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX17.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX18.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX19.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX20.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX21.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX22.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX23.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX24.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX25.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX26.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX27.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX28.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX29.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX30.MSGCTRL.all = 0x00000000;
ECanbMboxes.MBOX31.MSGCTRL.all = 0x00000000;
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
ECanbRegs.CANTA.all = 0xFFFFFFFF; /* Clear all TAn bits */
ECanbRegs.CANRMP.all = 0xFFFFFFFF; /* Clear all RMPn bits */
ECanbRegs.CANGIF0.all = 0xFFFFFFFF; /* Clear all interrupt flag bits */
ECanbRegs.CANGIF1.all = 0xFFFFFFFF;
// Configure bit timing parameters for eCANB
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.CCR = 1 ; // Set CCR = 1
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
do
{
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
} while(ECanbShadow.CANES.bit.CCE != 1 ); // Wait for CCE bit to be cleared..
ECanbShadow.CANBTC.all = 0;
// The following block for all 150 MHz SYSCLKOUT - Bit rate = 500Kbps
ECanbShadow.CANBTC.bit.BRPREG = 9; //19;
ECanbShadow.CANBTC.bit.TSEG2REG = 2;
ECanbShadow.CANBTC.bit.TSEG1REG = 10;
ECanbShadow.CANBTC.bit.SAM = 1;
ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
do
{
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
} while(ECanbShadow.CANES.bit.CCE != 0 ); // Wait for CCE bit to be cleared..
// Disable all Mailboxes
ECanbRegs.CANME.all = 0; // Required before writing the MSGIDs
asm(" EDIS");
// Write to the MSGID field of TRANSMIT mailboxes MBOX0
// ECanbMboxes.MBOX31.MSGID.all = 0x00400000; //id 0x10
// Write to the MSGID field of RECEIVE mailboxes MBOX1 - 31
// see TI app note SPRU074E, page 2-42, ID is bit[28..18]
ECanbMboxes.MBOX0.MSGID.all = 0x1D000000; //id 0x740
ECanbMboxes.MBOX1.MSGID.all = 0x1D040000; //id 0x741
ECanbMboxes.MBOX2.MSGID.all = 0x1D080000; //id 0x742
ECanbMboxes.MBOX3.MSGID.all = 0x1D0C0000; //id 0x743
ECanbMboxes.MBOX4.MSGID.all = 0x00100000; //id 0x4
ECanbMboxes.MBOX5.MSGID.all = 0x00140000; //id 0x5
ECanbMboxes.MBOX6.MSGID.all = 0x00180000; //id 0x6
ECanbMboxes.MBOX7.MSGID.all = 0x001C0000; //id 0x7
ECanbMboxes.MBOX8.MSGID.all = 0x00200000; //id 0x8
ECanbMboxes.MBOX9.MSGID.all = 0x00240000; //id 0x9
ECanbMboxes.MBOX10.MSGID.all = 0x00280000; //id 0xA
ECanbMboxes.MBOX11.MSGID.all = 0x002C0000; //id 0xB
ECanbMboxes.MBOX12.MSGID.all = 0x00300000; //id 0xC
ECanbMboxes.MBOX13.MSGID.all = 0x00340000; //id 0xD
ECanbMboxes.MBOX14.MSGID.all = 0x00380000; //id 0xE
ECanbMboxes.MBOX15.MSGID.all = 0x003C0000; //id 0xF
ECanbMboxes.MBOX16.MSGID.all = 0x00400000; //id 0x10
ECanbMboxes.MBOX17.MSGID.all = 0x00440000; //id 0x11
ECanbMboxes.MBOX18.MSGID.all = 0x004C0000; //id 0x12
ECanbMboxes.MBOX19.MSGID.all = 0x00500000; //id 0x13
ECanbMboxes.MBOX20.MSGID.all = 0x00540000; //id 0x14
ECanbMboxes.MBOX21.MSGID.all = 0x005C0000; //id 0x15
ECanbMboxes.MBOX22.MSGID.all = 0x00600000; //id 0x16
ECanbMboxes.MBOX23.MSGID.all = 0x00640000; //id 0x17
ECanbMboxes.MBOX24.MSGID.all = 0x006C0000; //id 0x18
ECanbMboxes.MBOX25.MSGID.all = 0x00700000; //id 0x19
ECanbMboxes.MBOX26.MSGID.all = 0x00740000; //id 0x1A
ECanbMboxes.MBOX27.MSGID.all = 0x007C0000; //id 0x1B
ECanbMboxes.MBOX28.MSGID.all = 0x00800000; //id 0x1C
ECanbMboxes.MBOX29.MSGID.all = 0x00840000; //id 0x1D
ECanbMboxes.MBOX30.MSGID.all = 0x008C0000; //id 0x1E
ECanbMboxes.MBOX31.MSGID.all = 0x00900000; //id 0x1F
// Configure Mailboxes 31 and 2 as Tx, 1-30 as Rx
// Since this write is to the entire register (instead of a bit
// field) a shadow register is not required.
ECanbRegs.CANMD.all = 0x7FFFFFFB;
// Enable MBOX0 to MBOX3 Mailboxes */
// Since this write is to the entire register (instead of a bit
// field) a shadow register is not required.
ECanbRegs.CANME.all = 0x0000000F;
// Write to the DLC field of MSGCTRL register of RECEIVE mailboxes MBOX0 - 30
ECanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
/* ECanbMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX10.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX11.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX12.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX13.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX14.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX15.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX16.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX17.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX18.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX19.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX20.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX21.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX22.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX23.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX24.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX25.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX26.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX27.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX28.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX29.MSGCTRL.bit.DLC = 8;
ECanbMboxes.MBOX30.MSGCTRL.bit.DLC = 8;
*/
ECanbShadow.CANOPC.all = ECanbRegs.CANOPC.all;
ECanbShadow.CANOPC.bit.OPC1 = 0;
ECanbRegs.CANOPC.all = ECanbShadow.CANOPC.all;
// enable receive mailbox interrupts, disable transmit mailbox interrupts
// Since this write is to the entire register (instead of a bit
// field) a shadow register is not required.
asm(" EALLOW");
ECanbRegs.CANMIM.all = 0xFFFFFFFF;
asm(" EDIS");
// Enable eCAN0INT
asm(" EALLOW");
ECanbShadow.CANGIM.all = ECanbRegs.CANGIM.all;
ECanbShadow.CANGIM.bit.GIL = 1;
ECanbShadow.CANGIM.bit.I0EN = 1;
ECanbRegs.CANGIM.all = ECanbShadow.CANGIM.all;
asm(" EDIS");
}