This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Compiler/TMS320F28335: TMS320F28335

Part Number: TMS320F28335
Other Parts Discussed in Thread: TMS320F28335

Tool/software: TI C/C++ Compiler

/* ==============================================================================
         Header files
=================================================================================*/
#include <stdlib.h>
#include "IQmathLib.h"         /* Include header for IQmath library */
//#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
//#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
//#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// Prototype statements for functions found within this file.
void ecan1_inta_isr(void);

// Global variable for this example
struct  CAN_DATA {
    Uint32      data0:32;
    Uint32      data1:32;
    Uint32      data2:32;
    Uint32      id:32;
    Uint32      index:8;
};

struct MBOX can_msg1;
struct MBOX can_msg2;
struct MBOX can_msg3;
struct MBOX can_msg4;
struct MBOX can_msg5;
struct MBOX can_msg6;
struct MBOX can_msg7;
struct MBOX can_msg8;
struct MBOX can_msg9;
struct MBOX can_msg10;
struct MBOX can_msg11;
struct MBOX can_msg12;
struct MBOX can_msg13;
struct MBOX can_msg14;
struct MBOX can_msg15;
struct MBOX can_msg16;

struct CAN_DATA can_data2;
struct CAN_DATA can_data;
int16 new_data = 0;
struct ECAN_REGS ECanaShadow;

Uint32  TestMbox1 = 0;
Uint32  TestMbox2 = 0;
Uint32  TestMbox3 = 0;

//Uint32 ecan1_inta_isr;
//void ecan1_inta_isr(void);

void main(void)
{
    Uint16  i,j;
    Uint16 MessageReceivedCount = 0;
    Uint16 ErrorCount = 0;
    struct ECAN_REGS ECanaShadow;

    InitSysCtrl();
    //InitECanGpio();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    InitCpuTimers(); // For this example, only initialize the Cpu Timers

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1;  //    Enable system clk to eCAN-A
    EDIS;

    GpioCtrlRegs.GPAPUD.all = 0x0000;      // Pullup's enabled GPIO0-GPIO31

    InitECan();     // Initialize the eCAN module
    CAN_Config();


    while(1)   // Begin transmitting
    {
        CANtransmit();
        ECanaRegs.CANTRS.all = 0x00000001; //Set TRS for all transmit mailboxes
        while(ECanaRegs.CANTA.all != 0x00000001 ) {}  // Wait for all TAn bits to be set..
        ECanaRegs.CANTA.all = 0x00000001;   // Clear all TAn
        MessageReceivedCount++;
        //CAN_Receive();
        //CAN_Receive1();
    }
}

interrupt void ecan1_inta_isr(void) {
    int j;
    for (j = 16; j < 32; j++) {         // Read 16 mailboxes   // todo confirm if need shadow register here
        if ((ECanaRegs.CANRMP.all >> j) && 0x1) { // only read the mail box which received message
            mailbox_read(j);       // This func reads the indicated mailbox data
            ECanaShadow.CANRMP.all = ((Uint32) 1 << j);
            ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // clear the Received-Message-Pending Register
        }
    }
    can_data.data0 = can_msg1.MDL.word.HI_WORD;
    can_data.data1 = can_msg1.MDL.word.LOW_WORD;
    can_data.data2 = can_msg1.MDH.word.HI_WORD;
    can_data.index = can_msg1.MDH.byte.BYTE6;
    can_data.id = can_msg1.MSGID.all;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    new_data = 1;
}

void mailbox_read(int16 MBXnbr) {
    volatile struct MBOX *Mailbox;
    Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
    can_msg1.MDL.all = Mailbox->MDL.all;
    can_msg1.MDH.all = Mailbox->MDH.all;
    can_msg1.MSGID.all = Mailbox->MSGID.all;
    return;
}
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

//---------------------------------------------------------------------------
// eCAN External References & Function Declarations:
extern volatile struct ECAN_REGS ECanaRegs;
extern volatile struct ECAN_MBOXES ECanaMboxes;
extern volatile struct LAM_REGS ECanaLAMRegs;
extern volatile struct MOTO_REGS ECanaMOTORegs;
extern volatile struct MOTS_REGS ECanaMOTSRegs;
extern volatile struct ECAN_REGS ECanaShadow;

extern struct MBOX can_msg1;
extern struct MBOX can_msg2;
extern struct MBOX can_msg3;
extern struct MBOX can_msg4;
extern struct MBOX can_msg5;
extern struct MBOX can_msg6;
extern struct MBOX can_msg7;
extern struct MBOX can_msg8;
extern struct MBOX can_msg9;
extern struct MBOX can_msg10;
extern struct MBOX can_msg11;
extern struct MBOX can_msg12;
extern struct MBOX can_msg13;
extern struct MBOX can_msg14;
extern struct MBOX can_msg15;
extern struct MBOX can_msg16;

extern void ecan1_inta_isr(void);

void CAN_Config(void){

    EALLOW;

    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;

    // Mailboxs can be written to 16-bits or 32-bits at a time, Write to the MSGID field of TRANSMIT mailboxes MBOX0 - 15
    ECanaMboxes.MBOX0.MSGID.all = 0x81010000;
    ECanaMboxes.MBOX1.MSGID.all = 0x81020000;
    ECanaMboxes.MBOX2.MSGID.all = 0x81030000;
    ECanaMboxes.MBOX3.MSGID.all = 0x81040000;
    ECanaMboxes.MBOX4.MSGID.all = 0x81050000;
    ECanaMboxes.MBOX5.MSGID.all = 0x81060000;
    // Configure Mailboxes 0-15 as Tx, 16-31 as Rx     // Since this write is to the entire register (instead of a bit     // field) a shadow register is not required.

    ECanaMboxes.MBOX16.MSGID.all = 0x12345678;
    //  ECanaMboxes.MBOX17.MSGID.all = 0x81020000;
    // ECanaMboxes.MBOX18.MSGID.all = 0x81030000;
    // ECanaMboxes.MBOX19.MSGID.all = 0x81040000;
    // ECanaMboxes.MBOX20.MSGID.all = 0x81050000;
    //ECanaMboxes.MBOX21.MSGID.all = 0x81060000;
    ECanaRegs.CANMD.all = 0xFFFF0000;
    // Enable all Mailboxes   // Since this write is to the entire register (instead of a bit    // field) a shadow register is not required.
    //ECanaRegs.CANME.all = 0xFFFFFFFF;
    ECanaRegs.CANME.all = 0xFFFF0001;

    // Specify that 8 bits will be sent
    ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 1;
    ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 4;

    ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8;

    // Configure the eCAN for self test mode    // Enable the enhanced features of the eCAN.
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.STM = 0;    // Configure CAN for self-test mode
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

    /*// Get into Config Mode of CAN  and config bit timing parameters for eCANA  BaudRates */
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 1 ;            // Set CCR = 1
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

    ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    do{
        ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    } while(ECanaShadow.CANES.bit.CCE != 1 );       // Wait for CCE bit to be set..

    ECanaShadow.CANBTC.all = 0;
#if (CPU_FRQ_150MHZ)                       // CPU_FRQ_150MHz is defined in DSP2833x_Examples.h  /* The following block for all 150 MHz SYSCLKOUT (75 MHz CAN clock) - default. Bit rate = 1 Mbps
    ECanaShadow.CANBTC.bit.BRPREG = 9; // 4 for 1Mbps, 9 for 500Kbps, 19 for 250Kbps, 39 for 125Kbps, 49 for 100Kbps
    ECanaShadow.CANBTC.bit.TSEG2REG = 2;
    ECanaShadow.CANBTC.bit.TSEG1REG = 10;
#endif
    ECanaShadow.CANBTC.bit.SAM = 1;
    ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;

    // Get into Normal Mode of CAN
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 0 ;            // Set CCR = 0
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

    ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    do{
        ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    } while(ECanaShadow.CANES.bit.CCE != 0 );       // Wait for CCE bit to be  cleared.. CANES.4 sud be 0

    GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0;   // Enable pullup on GPIO30
    GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0;   // Enable pullup on GPIO31
    GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 3; // Asynch input
    GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; //GPIO30: 0=GPIO, 1=CANRXA    2=rsvd       3=rsvd
    GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; //GPIO31: 0=GPIO, 1=CANTXA    2=rsvd       3=rsvd
    EDIS;
    //******************
    ECanaMboxes.MBOX16.MSGID.all = 0xAAAAAAA0;
    ECanaMboxes.MBOX16.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX17.MSGID.all = 0xAAAAAAA1;
    ECanaMboxes.MBOX17.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX18.MSGID.all = 0xAAAAAAA2;
    ECanaMboxes.MBOX18.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX19.MSGID.all = 0xAAAAAAA3;
    ECanaMboxes.MBOX19.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX20.MSGID.all = 0xAAAAAAA4;
    ECanaMboxes.MBOX20.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX21.MSGID.all = 0xAAAAAAA5;
    ECanaMboxes.MBOX21.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX22.MSGID.all = 0xAAAAAAA6;
    ECanaMboxes.MBOX22.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX23.MSGID.all = 0xAAAAAAA7;
    ECanaMboxes.MBOX23.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX24.MSGID.all = 0xAAAAAAA8;
    ECanaMboxes.MBOX24.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX25.MSGID.all = 0xAAAAAAA9;
    ECanaMboxes.MBOX25.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAA;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAB;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAC;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAD;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAE;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
    ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAF;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;

    //Initial for interupt for receiving event only
    EALLOW;
    ECanaShadow.CANMIL.all = 0xFFFF0000 ; // Interrupts asserted on eCAN1INT
    //ECanaShadow.CANMIL.all  = 0x00000000 ; // Interrupts asserted on eCAN0INT
    ECanaRegs.CANMIL.all = ECanaShadow.CANMIL.all;
    ECanaShadow.CANMIM.all  = 0xFFFF0000;   // Enable interrupts for all mailboxes
    ECanaRegs.CANMIM.all = ECanaShadow.CANMIM.all;

    ECanaShadow.CANGIM.all = 0;
    ECanaShadow.CANGIM.bit.I0EN = 1;   // Enable eCAN1INT or eCAN0INT
    ECanaShadow.CANGIM.bit.I1EN = 1;
    ECanaShadow.CANGIM.bit.GIL = 1;
    ECanaRegs.CANGIM.all = ECanaShadow.CANGIM.all;

    ECanaShadow.CANGIF1.all = ECanaRegs.CANGIF1.all;
    ECanaShadow.CANGIF1.bit.GMIF1 = 1;
    ECanaRegs.CANGIF1.all = ECanaShadow.CANGIF1.all;

    PieVectTable.ECAN1INTA = &ecan1_inta_isr;
    PieVectTable.ECAN0INTA = &ecan1_inta_isr;

    /* Configure PIE interrupts */
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  // Enable vector fetching from PIE block
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;    // Enables PIE to drive a pulse into the CPU
    // The interrupt can be asserted in either of the eCAN interrupt lines
    PieCtrlRegs.PIEIER9.bit.INTx5 = 1;  // Enable INTx.5 of INT9 (eCAN0INT)
    PieCtrlRegs.PIEIER9.bit.INTx6 = 1;  // Enable INTx.6 of INT9 (eCAN1INT)
    //PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    /* Configure system interrupts */
    IER |= 0x0100;     // Enable INT9 of CPU
    EINT;
    // ERTM;     // Enable Global realtime interrupt DBGM
    EDIS;
    //ECanaRegs.CANGIF1.bit.MIV1

}

void CAN_Receive(void)
{
    Uint32 Data1;
    Uint32 Data2;

    float32 AngleOffset;
    Uint16 MaxRMSPhaseCurrent;
    Uint16 MaxIqCommand;
    Uint16 MaxPhaseCurrent;

    float32 TorqueCommand;
    Uint16 EnableCommand;
    Uint16 DirectionBit;

    Uint16 IdKi;
    Uint16 IdKp;
    Uint16 IqKi;
    Uint16 IqKp;

    Uint16 MinBattCurrentForRegenBraking;
    Uint16 HysteresisRegenBraking;

    Uint16 RollingCounter;
    Uint16 MaxRollingCounterErrors;

    Uint32 HVB_BatteryCurrent;
    Uint16 HVB_ContactorClosed;
    Uint16 HVB_ContactorOpenRequest;
    Uint16 HVB_Fault;

    can_msg1.MSGID.all = ECanaMboxes.MBOX16.MSGID.all;
    can_msg2.MSGID.all = ECanaMboxes.MBOX17.MSGID.all;
    can_msg3.MSGID.all = ECanaMboxes.MBOX18.MSGID.all;
    can_msg4.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;
    can_msg5.MSGID.all = ECanaMboxes.MBOX20.MSGID.all;
    can_msg6.MSGID.all = ECanaMboxes.MBOX21.MSGID.all;
    can_msg7.MSGID.all = ECanaMboxes.MBOX22.MSGID.all;
    can_msg8.MSGID.all = ECanaMboxes.MBOX23.MSGID.all;
    can_msg9.MSGID.all = ECanaMboxes.MBOX24.MSGID.all;
    can_msg10.MSGID.all = ECanaMboxes.MBOX25.MSGID.all;
    can_msg11.MSGID.all = ECanaMboxes.MBOX26.MSGID.all;
    can_msg12.MSGID.all = ECanaMboxes.MBOX27.MSGID.all;
    can_msg13.MSGID.all = ECanaMboxes.MBOX28.MSGID.all;
    can_msg14.MSGID.all = ECanaMboxes.MBOX29.MSGID.all;
    can_msg15.MSGID.all = ECanaMboxes.MBOX30.MSGID.all;
    can_msg16.MSGID.all = ECanaMboxes.MBOX31.MSGID.all;

    can_msg1.MSGCTRL.bit.DLC = ECanaMboxes.MBOX16.MSGCTRL.bit.DLC;
    can_msg2.MSGCTRL.bit.DLC = ECanaMboxes.MBOX17.MSGCTRL.bit.DLC;
    can_msg3.MSGCTRL.bit.DLC = ECanaMboxes.MBOX18.MSGCTRL.bit.DLC;
    can_msg4.MSGCTRL.bit.DLC = ECanaMboxes.MBOX19.MSGCTRL.bit.DLC;
    can_msg5.MSGCTRL.bit.DLC = ECanaMboxes.MBOX20.MSGCTRL.bit.DLC;
    can_msg6.MSGCTRL.bit.DLC = ECanaMboxes.MBOX21.MSGCTRL.bit.DLC;
    can_msg7.MSGCTRL.bit.DLC = ECanaMboxes.MBOX22.MSGCTRL.bit.DLC;
    can_msg8.MSGCTRL.bit.DLC = ECanaMboxes.MBOX23.MSGCTRL.bit.DLC;
    can_msg9.MSGCTRL.bit.DLC = ECanaMboxes.MBOX24.MSGCTRL.bit.DLC;
    can_msg10.MSGCTRL.bit.DLC = ECanaMboxes.MBOX25.MSGCTRL.bit.DLC;
    can_msg11.MSGCTRL.bit.DLC = ECanaMboxes.MBOX26.MSGCTRL.bit.DLC;
    can_msg12.MSGCTRL.bit.DLC = ECanaMboxes.MBOX27.MSGCTRL.bit.DLC;
    can_msg13.MSGCTRL.bit.DLC = ECanaMboxes.MBOX28.MSGCTRL.bit.DLC;
    can_msg14.MSGCTRL.bit.DLC = ECanaMboxes.MBOX29.MSGCTRL.bit.DLC;
    can_msg15.MSGCTRL.bit.DLC = ECanaMboxes.MBOX30.MSGCTRL.bit.DLC;
    can_msg16.MSGCTRL.bit.DLC = ECanaMboxes.MBOX31.MSGCTRL.bit.DLC;



    Data1 = ECanaMboxes.MBOX16.MDL.all;
    Data2 = ECanaMboxes.MBOX16.MDH.all;
    AngleOffset = (float32)((Data1) & 0x0000FFFF)*0.01;
    MaxRMSPhaseCurrent = (Uint16)((Data1) & 0xFFFF0000)>>16;
    MaxIqCommand = (Uint16)((Data2) & 0x0000FFFF);
    MaxPhaseCurrent = (Uint16)((Data2) & 0xFFFF0000)>>16;
    can_msg1.MSGID.all = ECanaMboxes.MBOX16.MSGID.all;

    Data1 = ECanaMboxes.MBOX17.MDL.all;
    TorqueCommand = (float32)((Data1) & 0x0000FFFF)*0.01;
    EnableCommand = (Uint16)((Data1) & 0x00010000)>>16;
    DirectionBit = (Uint16)((Data1) & 0x00020000)>>17;
    can_msg2.MSGID.all = ECanaMboxes.MBOX17.MSGID.all;

    Data1 = ECanaMboxes.MBOX18.MDL.all;
    Data2 = ECanaMboxes.MBOX18.MDH.all;
    IdKi = (Uint16)((Data1) & 0x0000FFFF);
    IdKp = (Uint16)((Data1) & 0xFFFF0000)>>16;
    IqKi = (Uint16)((Data2) & 0x0000FFFF);
    IqKp = (Uint16)((Data2) & 0xFFFF0000)>>16;
    can_msg3.MSGID.all = ECanaMboxes.MBOX18.MSGID.all;

    Data1 = ECanaMboxes.MBOX19.MDL.all;
    MinBattCurrentForRegenBraking = (Uint16)((Data1) & 0x000000FF);
    HysteresisRegenBraking = (Uint16)((Data1) & 0x0000FF00)>>8;
    can_msg4.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;

    Data1 = ECanaMboxes.MBOX20.MDL.all;
    RollingCounter = (Uint16)((Data1) & 0x000000FF);
    MaxRollingCounterErrors = (Uint16)((Data1) & 0x0000FF00)>>8;
    can_msg5.MSGID.all = ECanaMboxes.MBOX20.MSGID.all;

    Data1 = ECanaMboxes.MBOX19.MDL.all;
    Data2 = ECanaMboxes.MBOX19.MDH.all;
    HVB_BatteryCurrent = (Uint32)((Data1) & 0xFFFFFFFF);
    HVB_ContactorClosed = (Uint16)(Data2 & 0x00000001);
    HVB_ContactorOpenRequest = (Uint16)((Data2 & 0x00000002)>>1);
    HVB_Fault = (Uint16)((Data2 & 0x00000004)>>2);
    //HVB_Fault = = (Uint16)(Data2 & 0x00000004)>>2);
    can_msg3.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;

}

void CANtransmit(void)
{
    Uint32 Data1;
    Uint32 Data2;
    //Tx Messages
    float32 IaRMS =100.123;
    float32 IbRMS =100.123;
    float32 IcRMS =100.123;
    float32 DCLinkVoltage =650.111;

    Uint16 RawPosition = 12;
    Uint16 Position = 12;
    float32 Thetam = 0.123456;
    float32 VelocityRPM = 321.123;

    float32 IqTableCommand = 123.456;
    float32 IdTableCommand = 123.456;
    float32 IqFeedback = 123.456;
    float32 IdFeedback = 123.456;

    Uint32 FaultRegA  = 0;

    Uint16 EventManager1 = ((Data2) & 0x0000FFFF);
    Uint16 EventManager2 = ((Data2) & 0xFFFF0000)>>16;

    Uint16 ResolverConfigured =1;
    Uint16 Enabled            =1;
    Uint16 Fault              =0;

    float32 DCLinkCurrent       = 123.456;
    Uint16 InverterTemperature = 25;
    Uint16 MotorTemperature    = 35;


    //Control Feedback1
    ECanaMboxes.MBOX0.MDL.byte.BYTE0 = (Uint16)(IaRMS*125) & (0x00FF);
    ECanaMboxes.MBOX0.MDL.byte.BYTE1 = ((Uint16)(IaRMS*125) & 0xFF00)>>8;
    ECanaMboxes.MBOX0.MDL.byte.BYTE2 = (Uint16)(IbRMS*125) & (0x00FF);
    ECanaMboxes.MBOX0.MDL.byte.BYTE3 = ((Uint16)(IbRMS*125) & 0xFF00)>>8;
    ECanaMboxes.MBOX0.MDH.byte.BYTE4 = (Uint16)(IcRMS*125) & (0x00FF);
    ECanaMboxes.MBOX0.MDH.byte.BYTE5 = ((Uint16)(IcRMS*125) & 0xFF00)>>8;
    ECanaMboxes.MBOX0.MDH.byte.BYTE6 = ((Uint16)(DCLinkVoltage*50) & (0x00FF));
    ECanaMboxes.MBOX0.MDH.byte.BYTE7 = ((Uint16)(DCLinkVoltage*50) & 0xFF00)>>8;

    //Control Feedback2 Packing
    ECanaMboxes.MBOX1.MDL.byte.BYTE0 = (Uint16) RawPosition & 0x00FF;
    ECanaMboxes.MBOX1.MDL.byte.BYTE1 = ((Uint16)RawPosition & 0xFF00)>>8;
    ECanaMboxes.MBOX1.MDL.byte.BYTE2 = (Uint16)Position & 0x00FF;
    ECanaMboxes.MBOX1.MDL.byte.BYTE3 = ((Uint16)Position & 0xFF00)>>8;
    ECanaMboxes.MBOX1.MDH.byte.BYTE4 = (Uint16)(Thetam*5000) & 0x00FF;
    ECanaMboxes.MBOX1.MDH.byte.BYTE5 = ((Uint16)(Thetam*5000) & 0xFF00)>>8;
    ECanaMboxes.MBOX1.MDH.byte.BYTE6 = (Uint16)(VelocityRPM*2.5) & 0x00FF;
    ECanaMboxes.MBOX1.MDH.byte.BYTE7 = ((Uint16)(VelocityRPM*2.5) & 0xFF00)>>8;

    //Control Feedback3 Packing
    ECanaMboxes.MBOX2.MDL.byte.BYTE0 = ((Uint16)(IqTableCommand*33.34) & 0x00FF);
    ECanaMboxes.MBOX2.MDL.byte.BYTE1 = ((Uint16)(IqTableCommand*33.34) & 0xFF00)>>8;
    ECanaMboxes.MBOX2.MDL.byte.BYTE2 = ((Uint16)(IdTableCommand*33.34) & 0x00FF);
    ECanaMboxes.MBOX2.MDL.byte.BYTE3 = ((Uint16)(IdTableCommand*33.34) & 0xFF00)>>8;
    ECanaMboxes.MBOX2.MDH.byte.BYTE4 = ((Uint16)(IqFeedback*33.34) & 0x00FF);
    ECanaMboxes.MBOX2.MDH.byte.BYTE5 = ((Uint16)(IqFeedback*33.34) & 0xFF00)>>8;
    ECanaMboxes.MBOX2.MDH.byte.BYTE6 = ((Uint16)(IdFeedback*33.34) & 0x00FF);
    ECanaMboxes.MBOX2.MDH.byte.BYTE7 = ((Uint16)(IdFeedback*33.34) & 0xFF00)>>8;

    //Control Feedback4 Packing
    ECanaMboxes.MBOX3.MDL.byte.BYTE0 = ((Uint32)IqTableCommand & 0x000000FF);
    ECanaMboxes.MBOX3.MDL.byte.BYTE1 = (((Uint32)IqTableCommand & 0x0000FF00)>>8);
    ECanaMboxes.MBOX3.MDL.byte.BYTE2 = (((Uint32)IqTableCommand & 0x00FF0000)>>16);
    ECanaMboxes.MBOX3.MDL.byte.BYTE3 = (((Uint32)IqTableCommand & 0xFF000000)>>24);
    ECanaMboxes.MBOX3.MDH.byte.BYTE4 = ((Uint16)EventManager1 & 0x00FF);
    ECanaMboxes.MBOX3.MDH.byte.BYTE5 = ((Uint16)EventManager1 & 0xFF00)>>8;
    ECanaMboxes.MBOX3.MDH.byte.BYTE6 = ((Uint16)EventManager2 & 0x00FF);
    ECanaMboxes.MBOX3.MDH.byte.BYTE7 = ((Uint16)EventManager2 & 0xFF00)>>8;

    //Control Feedback5 Packing
    ECanaMboxes.MBOX4.MDL.byte.BYTE0 = ((Uint16)ResolverConfigured & 0x0001|(((Uint16)Enabled & 0x0001) <<1) | (((Uint16)Fault & 0x0001)<<2));

    //Control Feedback6 Packing
    ECanaMboxes.MBOX5.MDL.byte.BYTE0 = ((Uint16)(DCLinkCurrent*50) & 0x00FF);
    ECanaMboxes.MBOX5.MDL.byte.BYTE1 = ((Uint16)(DCLinkCurrent*50) & 0xFF00)>>8;
    ECanaMboxes.MBOX5.MDL.byte.BYTE2 = (((Uint16)InverterTemperature)>>8);
    ECanaMboxes.MBOX5.MDL.byte.BYTE3 = (((Uint16)MotorTemperature)>>8);

}




void CAN_Receive1(void)
{
    Uint32 Data1;
    Uint32 Data2;

    float32 AngleOffset;
    Uint16 MaxRMSPhaseCurrent;
    Uint16 MaxIqCommand;
    Uint16 MaxPhaseCurrent;

    float32 TorqueCommand;
    Uint16 EnableCommand;
    Uint16 DirectionBit;

    Uint16 IdKi;
    Uint16 IdKp;
    Uint16 IqKi;
    Uint16 IqKp;

    Uint16 MinBattCurrentForRegenBraking;
    Uint16 HysteresisRegenBraking;

    Uint16 RollingCounter;
    Uint16 MaxRollingCounterErrors;

    Uint32 HVB_BatteryCurrent;
    Uint16 HVB_ContactorClosed;
    Uint16 HVB_ContactorOpenRequest;
    Uint16 HVB_Fault;

    ECanaMboxes.MBOX16.MSGID.all = 0x12345678;
    ECanaMboxes.MBOX16.MSGCTRL.bit.DLC =8;


    /* ECanaMboxes.MBOX16.MSGID.bit.IDE =0;
    ECanaMboxes.MBOX16.MSGID.bit.AME =1;
    ECanaMboxes.MBOX16.MSGID.bit.STDMSGID = 0x00000201;
     */


    //ECanaMboxes.MBOX17.MSGID.all = 0x02020000;
    ECanaMboxes.MBOX17.MSGID.bit.IDE =0;
    ECanaMboxes.MBOX17.MSGID.bit.AME =1;
    ECanaMboxes.MBOX17.MSGID.bit.STDMSGID = 0x2020;

    //ECanaMboxes.MBOX18.MSGID.all = 0x02030000;
    ECanaMboxes.MBOX18.MSGID.bit.IDE =0;
    ECanaMboxes.MBOX18.MSGID.bit.AME =1;
    ECanaMboxes.MBOX18.MSGID.bit.STDMSGID = 0x2030;

    //ECanaMboxes.MBOX19.MSGID.all = 0x02040000;
    ECanaMboxes.MBOX19.MSGID.bit.IDE =0;
    ECanaMboxes.MBOX19.MSGID.bit.AME =1;
    ECanaMboxes.MBOX19.MSGID.bit.STDMSGID = 0x2040;

    //ECanaMboxes.MBOX20.MSGID.all = 0x02050000;
    ECanaMboxes.MBOX20.MSGID.bit.IDE =0;
    ECanaMboxes.MBOX20.MSGID.bit.AME =1;
    ECanaMboxes.MBOX20.MSGID.bit.STDMSGID = 0x2050;

    //ECanaMboxes.MBOX21.MSGID.all = 0x01070000;
    ECanaMboxes.MBOX21.MSGID.bit.IDE =0;
    ECanaMboxes.MBOX21.MSGID.bit.AME =1;
    ECanaMboxes.MBOX21.MSGID.bit.STDMSGID = 0x1070;

    Data1 = ECanaMboxes.MBOX16.MDL.all;
    Data2 = ECanaMboxes.MBOX16.MDH.all;
    AngleOffset = (float32)((Data1 & 0x0000FFFF)*0.01);
    MaxRMSPhaseCurrent = (Uint16)((Data1 & 0xFFFF0000)>>16);
    MaxIqCommand = (Uint16)((Data2 & 0x0000FFFF));
    MaxPhaseCurrent = (Uint16)((Data2 & 0xFFFF0000)>>16);
    can_msg1.MSGID.all = ECanaMboxes.MBOX16.MSGID.all;

    Data1 = ECanaMboxes.MBOX17.MDL.all;
    TorqueCommand = (float32)((Data1 & 0x0000FFFF)*0.01);
    EnableCommand = (Uint16)((Data1 & 0x00010000)>>16);
    DirectionBit = (Uint16)((Data1 & 0x00020000)>>17);
    can_msg2.MSGID.all = ECanaMboxes.MBOX17.MSGID.all;

    Data1 = ECanaMboxes.MBOX18.MDL.all;
    Data2 = ECanaMboxes.MBOX18.MDH.all;
    IdKi = (Uint16)((Data1 & 0x0000FFFF));
    IdKp = (Uint16)((Data1 & 0xFFFF0000)>>16);
    IqKi = (Uint16)((Data2 & 0x0000FFFF));
    IqKp = (Uint16)((Data2 & 0xFFFF0000)>>16);
    can_msg3.MSGID.all = ECanaMboxes.MBOX18.MSGID.all;

    Data1 = ECanaMboxes.MBOX19.MDL.all;
    MinBattCurrentForRegenBraking = (Uint16)((Data1 & 0x000000FF));
    HysteresisRegenBraking = (Uint16)((Data1 & 0x0000FF00)>>8);
    can_msg4.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;

    Data1 = ECanaMboxes.MBOX20.MDL.all;
    RollingCounter = (Uint16)((Data1) & 0x000000FF);
    MaxRollingCounterErrors = (Uint16)((Data1) & 0x0000FF00)>>8;
    can_msg5.MSGID.all = ECanaMboxes.MBOX20.MSGID.all;

    Data1 = ECanaMboxes.MBOX19.MDL.all;
    Data2 = ECanaMboxes.MBOX19.MDH.all;
    HVB_BatteryCurrent = (Uint32)((Data1) & 0xFFFFFFFF);
    HVB_ContactorClosed = (Uint16)(Data2 & 0x00000001);
    HVB_ContactorOpenRequest = (Uint16)((Data2 & 0x00000002)>>1);
    HVB_Fault = (Uint16)((Data2 & 0x00000004)>>2);
    //HVB_Fault = = (Uint16)((Data2 & 0x00000004)>>2);
    can_msg3.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;

}
/* ==============================================================================
         Header files
=================================================================================*/
#include <stdlib.h>
#include "IQmathLib.h"         /* Include header for IQmath library */
//#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
//#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
//#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// Prototype statements for functions found within this file.
void ecan1_inta_isr(void);

// Global variable for this example
struct  CAN_DATA {
    Uint32      data0:32;
    Uint32      data1:32;
    Uint32      data2:32;
    Uint32      id:32;
    Uint32      index:8;
};

struct MBOX can_msg1;
struct MBOX can_msg2;
struct MBOX can_msg3;
struct MBOX can_msg4;
struct MBOX can_msg5;
struct MBOX can_msg6;
struct MBOX can_msg7;
struct MBOX can_msg8;
struct MBOX can_msg9;
struct MBOX can_msg10;
struct MBOX can_msg11;
struct MBOX can_msg12;
struct MBOX can_msg13;
struct MBOX can_msg14;
struct MBOX can_msg15;
struct MBOX can_msg16;

struct CAN_DATA can_data2;
struct CAN_DATA can_data;
int16 new_data = 0;
struct ECAN_REGS ECanaShadow;

Uint32  TestMbox1 = 0;
Uint32  TestMbox2 = 0;
Uint32  TestMbox3 = 0;

//Uint32 ecan1_inta_isr;
//void ecan1_inta_isr(void);

void main(void)
{
    Uint16  i,j;
    Uint16 MessageReceivedCount = 0;
    Uint16 ErrorCount = 0;
    struct ECAN_REGS ECanaShadow;

    InitSysCtrl();
    //InitECanGpio();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    InitCpuTimers(); // For this example, only initialize the Cpu Timers

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1;  //    Enable system clk to eCAN-A
    EDIS;

    GpioCtrlRegs.GPAPUD.all = 0x0000;      // Pullup's enabled GPIO0-GPIO31

    InitECan();     // Initialize the eCAN module
    CAN_Config();


    while(1)   // Begin transmitting
    {
        CANtransmit();
        ECanaRegs.CANTRS.all = 0x00000001; //Set TRS for all transmit mailboxes
        while(ECanaRegs.CANTA.all != 0x00000001 ) {}  // Wait for all TAn bits to be set..
        ECanaRegs.CANTA.all = 0x00000001;   // Clear all TAn
        MessageReceivedCount++;
        //CAN_Receive();
        //CAN_Receive1();
    }
}

interrupt void ecan1_inta_isr(void) {
    int j;
    for (j = 16; j < 32; j++) {         // Read 16 mailboxes   // todo confirm if need shadow register here
        if ((ECanaRegs.CANRMP.all >> j) && 0x1) { // only read the mail box which received message
            mailbox_read(j);       // This func reads the indicated mailbox data
            ECanaShadow.CANRMP.all = ((Uint32) 1 << j);
            ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // clear the Received-Message-Pending Register
        }
    }
    can_data.data0 = can_msg1.MDL.word.HI_WORD;
    can_data.data1 = can_msg1.MDL.word.LOW_WORD;
    can_data.data2 = can_msg1.MDH.word.HI_WORD;
    can_data.index = can_msg1.MDH.byte.BYTE6;
    can_data.id = can_msg1.MSGID.all;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    new_data = 1;
}

void mailbox_read(int16 MBXnbr) {
    volatile struct MBOX *Mailbox;
    Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
    can_msg1.MDL.all = Mailbox->MDL.all;
    can_msg1.MDH.all = Mailbox->MDH.all;
    can_msg1.MSGID.all = Mailbox->MSGID.all;
    return;
}
Hi,

I am using the TMS320F28335 for CAN messages testing of Tx Messages and Rx Messages .

I have written interrupted based ocde .I am sharing the code here.

I am not able to see the register values updated correspondingeCAN MBX .

For example I am sending the message from Can messages tool and I have not seen them in CANTx MBOX and same way I am not able to see the Rx MBOX register of specified data.

Regards,

Ram

/* ==============================================================================
         Header files
=================================================================================*/
#include <stdlib.h>
#include "IQmathLib.h"         /* Include header for IQmath library */
//#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
//#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
//#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// Prototype statements for functions found within this file.
void ecan1_inta_isr(void);

// Global variable for this example
struct  CAN_DATA {
    Uint32      data0:32;
    Uint32      data1:32;
    Uint32      data2:32;
    Uint32      id:32;
    Uint32      index:8;
};

struct MBOX can_msg1;
struct MBOX can_msg2;
struct MBOX can_msg3;
struct MBOX can_msg4;
struct MBOX can_msg5;
struct MBOX can_msg6;
struct MBOX can_msg7;
struct MBOX can_msg8;
struct MBOX can_msg9;
struct MBOX can_msg10;
struct MBOX can_msg11;
struct MBOX can_msg12;
struct MBOX can_msg13;
struct MBOX can_msg14;
struct MBOX can_msg15;
struct MBOX can_msg16;

struct CAN_DATA can_data2;
struct CAN_DATA can_data;
int16 new_data = 0;
struct ECAN_REGS ECanaShadow;

Uint32  TestMbox1 = 0;
Uint32  TestMbox2 = 0;
Uint32  TestMbox3 = 0;

//Uint32 ecan1_inta_isr;
//void ecan1_inta_isr(void);

void main(void)
{
    Uint16  i,j;
    Uint16 MessageReceivedCount = 0;
    Uint16 ErrorCount = 0;
    struct ECAN_REGS ECanaShadow;

    InitSysCtrl();
    //InitECanGpio();
    DINT;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    InitCpuTimers(); // For this example, only initialize the Cpu Timers

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1;  //    Enable system clk to eCAN-A
    EDIS;

    GpioCtrlRegs.GPAPUD.all = 0x0000;      // Pullup's enabled GPIO0-GPIO31

    InitECan();     // Initialize the eCAN module
    CAN_Config();


    while(1)   // Begin transmitting
    {
        CANtransmit();
        ECanaRegs.CANTRS.all = 0x00000001; //Set TRS for all transmit mailboxes
        while(ECanaRegs.CANTA.all != 0x00000001 ) {}  // Wait for all TAn bits to be set..
        ECanaRegs.CANTA.all = 0x00000001;   // Clear all TAn
        MessageReceivedCount++;
        //CAN_Receive();
        //CAN_Receive1();
    }
}

interrupt void ecan1_inta_isr(void) {
    int j;
    for (j = 16; j < 32; j++) {         // Read 16 mailboxes   // todo confirm if need shadow register here
        if ((ECanaRegs.CANRMP.all >> j) && 0x1) { // only read the mail box which received message
            mailbox_read(j);       // This func reads the indicated mailbox data
            ECanaShadow.CANRMP.all = ((Uint32) 1 << j);
            ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // clear the Received-Message-Pending Register
        }
    }
    can_data.data0 = can_msg1.MDL.word.HI_WORD;
    can_data.data1 = can_msg1.MDL.word.LOW_WORD;
    can_data.data2 = can_msg1.MDH.word.HI_WORD;
    can_data.index = can_msg1.MDH.byte.BYTE6;
    can_data.id = can_msg1.MSGID.all;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    new_data = 1;
}

void mailbox_read(int16 MBXnbr) {
    volatile struct MBOX *Mailbox;
    Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
    can_msg1.MDL.all = Mailbox->MDL.all;
    can_msg1.MDH.all = Mailbox->MDH.all;
    can_msg1.MSGID.all = Mailbox->MSGID.all;
    return;
}