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.

LAUNCHXL-F280049C: LAUNCHXL-F280049C

Part Number: LAUNCHXL-F280049C
Other Parts Discussed in Thread: C2000WARE

Thanks for the response for Case Number:  CS1237888 ,

If my ECU is one of the node in Vehicle network, can't the ECU perform Transmit and Receive in the network ?

This is the minimum requirement for every ECU in the vehicle network. Please clarify how my ECU can transmit and Receive in a Single CAN network using F2800049C processor.

The Example "can_ex5_transmit_receive" given in the SDK allowing either Transmit or Receive on mail box 1.

We have tried enable Transmit on mail box 1 and Receive on mail box 2, this combination is not working.

How can we enable both Transmit and Receive on different mail boxes at the same time ?

  • If my ECU is one of the node in Vehicle network, can't the ECU perform Transmit and Receive in the network ?

    It most certainly can. Any CAN node is capable of transmission and reception. 

    The Example "can_ex5_transmit_receive" given in the SDK allowing either Transmit or Receive on mail box 1.

    The key word here is "either". The way that example is written, it can either work for Transmit or for Receive. The same code can be run on the Transmitting node or the receiving node by commenting out the appropriate #define. 

    We have tried enable Transmit on mail box 1 and Receive on mail box 2, this combination is not working.

    I presume you have modified the example to configure two mailboxes, one for transmit and another for receive. Please download my Application report http://www.ti.com/lit/SPRACE5. It has many tested examples. I request you to look at the Debug tips provided. Most CAN issues can be resolved by going through this checklist.

  • Hello Thanks for your response,

    We have gone through the examples in the document SPRACE5.pdf, unfortunately it does not have scenario that we are expecting.

    Yes On CAN A we tried configure Mail Box 1 for Transmit and Mail box 2 for receive . only Transmit is working , the receive functionality is not working.

    Kindly let us know how to make both Transmit and Receive works parallel on CAN A .

  • The given code is not working for loop back

    only Transmit is working

    //#############################################################################
    //
    // FILE: can_ex2_loopback_interrupts.c
    //
    // TITLE: CAN External Loopback with Interrupts Example
    //
    //! \addtogroup driver_example_list
    //! <h1> CAN External Loopback with Interrupts </h1>
    //!
    //! This example shows the basic setup of CAN in order to transmit and receive
    //! messages on the CAN bus. The CAN peripheral is configured to transmit
    //! messages with a specific CAN ID. A message is then transmitted once per
    //! second, using a simple delay loop for timing. The message that is sent is
    //! a 4 byte message that contains an incrementing pattern. A CAN interrupt
    //! handler is used to confirm message transmission and count the number of
    //! messages that have been sent.
    //!
    //! This example sets up the CAN controller in External Loopback test mode.
    //! Data transmitted is visible on the CANTXA pin and is received internally
    //! back to the CAN Core. Please refer to details of the External Loopback
    //! Test Mode in the CAN Chapter in the Technical Reference Manual. Please
    //! refer to the appnote Programming Examples and Debug Strategies for
    //! the DCAN Module (www.ti.com/lit/SPRACE5) for useful information about
    //! this example
    //!
    //! \b External \b Connections \n
    //! - None.
    //!
    //! \b Watch \b Variables \n
    //! - txMsgCount - A counter for the number of messages sent
    //! - rxMsgCount - A counter for the number of messages received
    //! - txMsgData - An array with the data being sent
    //! - rxMsgData - An array with the data that was received
    //! - errorFlag - A flag that indicates an error has occurred
    //!
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without
    // modification, are permitted provided that the following conditions
    // are met:
    //
    // Redistributions of source code must retain the above copyright
    // notice, this list of conditions and the following disclaimer.
    //
    // Redistributions in binary form must reproduce the above copyright
    // notice, this list of conditions and the following disclaimer in the
    // documentation and/or other materials provided with the
    // distribution.
    //
    // Neither the name of Texas Instruments Incorporated nor the names of
    // its contributors may be used to endorse or promote products derived
    // from this software without specific prior written permission.
    //
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //#############################################################################

    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"

    //
    // Defines
    //
    #define MSG_DATA_LENGTH 4
    #define TX_MSG_OBJ_ID 1
    #define RX_MSG_OBJ_ID 2

    //
    // Globals
    //
    volatile uint32_t txMsgCount = 0;
    volatile uint32_t rxMsgCount = 0;
    volatile uint32_t errorFlag = 0;
    uint16_t txMsgData[4];
    uint16_t rxMsgData[4];

    //
    // Function Prototypes
    //
    __interrupt void canISR(void);

    //
    // Main
    //
    void main(void)
    {
    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Initialize GPIO and configure GPIO pins for CANTX/CANRX
    //
    Device_initGPIO();
    GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);
    GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);

    //
    // Initialize the CAN controller
    //
    CAN_initModule(CANA_BASE);

    //
    // Set up the CAN bus bit rate to 500kHz
    // Refer to the Driver Library User Guide for information on how to set
    // tighter timing control. Additionally, consult the device data sheet
    // for more information about the CAN module clocking.
    //
    CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 500000, 20);

    //
    // Enable interrupts on the CAN peripheral.
    //
    CAN_enableInterrupt(CANA_BASE, CAN_INT_IE0 | CAN_INT_ERROR |
    CAN_INT_STATUS);

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
    // This registers the interrupt handler in PIE vector table.
    //
    Interrupt_register(INT_CANA0, &canISR);

    //
    // Enable the CAN interrupt signal
    //
    Interrupt_enable(INT_CANA0);
    CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);

    //
    // Enable CAN test mode with external loopback
    //
    CAN_enableTestMode(CANA_BASE, CAN_TEST_EXL);

    //
    // Initialize the transmit message object used for sending CAN messages.
    // Message Object Parameters:
    // Message Object ID Number: 1
    // Message Identifier: 0x1
    // Message Frame: Standard
    // Message Type: Transmit
    // Message ID Mask: 0x0
    // Message Object Flags: Transmit Interrupt
    // Message Data Length: 4 Bytes
    //
    CAN_setupMessageObject(CANA_BASE, TX_MSG_OBJ_ID, 0x1, CAN_MSG_FRAME_STD,
    CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_TX_INT_ENABLE,
    MSG_DATA_LENGTH);

    //
    // Initialize the receive message object used for receiving CAN messages.
    // Message Object Parameters:
    // Message Object ID Number: 2
    // Message Identifier: 0x1
    // Message Frame: Standard
    // Message Type: Receive
    // Message ID Mask: 0x0
    // Message Object Flags: Receive Interrupt
    // Message Data Length: 4 Bytes (Note that DLC field is a "don't care"
    // for a Receive mailbox
    //
    CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID, 0x1, CAN_MSG_FRAME_STD,
    CAN_MSG_OBJ_TYPE_RX, 0, CAN_MSG_OBJ_RX_INT_ENABLE,
    MSG_DATA_LENGTH);

    //
    // Initialize the transmit message object data buffer to be sent
    //
    txMsgData[0] = 0x12;
    txMsgData[1] = 0x34;
    txMsgData[2] = 0x56;
    txMsgData[3] = 0x78;

    //
    // Start CAN module operations
    //
    CAN_startModule(CANA_BASE);

    //
    // Loop Forever - A new message will be sent once per second.
    //
    for(;;)
    {
    //
    // Check the error flag to see if errors occurred
    //
    if(errorFlag)
    {
    asm(" ESTOP0");
    }

    //
    // Verify that the number of transmitted messages equal the number of
    // messages received before sending a new message
    //
    if(txMsgCount == rxMsgCount)
    {
    CAN_sendMessage(CANA_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH,
    txMsgData);
    }
    else
    {
    errorFlag = 1;
    }

    //
    // Delay 1 second before continuing
    //
    DEVICE_DELAY_US(1000000);

    //
    // Increment the value in the transmitted message data.
    //
    txMsgData[0] += 0x01;
    txMsgData[1] += 0x01;
    txMsgData[2] += 0x01;
    txMsgData[3] += 0x01;

    //
    // Reset data if exceeds a byte
    //
    if(txMsgData[0] > 0xFF)
    {
    txMsgData[0] = 0;
    }
    if(txMsgData[1] > 0xFF)
    {
    txMsgData[1] = 0;
    }
    if(txMsgData[2] > 0xFF)
    {
    txMsgData[2] = 0;
    }
    if(txMsgData[3] > 0xFF)
    {
    txMsgData[3] = 0;
    }
    }
    }

    //
    // CAN ISR - The interrupt service routine called when a CAN interrupt is
    // triggered. It checks for the cause of the interrupt, and
    // maintains a count of all messages that have been transmitted.
    //
    __interrupt void
    canISR(void)
    {
    uint32_t status;

    //
    // Read the CAN interrupt status to find the cause of the interrupt
    //
    status = CAN_getInterruptCause(CANA_BASE);

    //
    // If the cause is a controller status interrupt, then get the status
    //
    if(status == CAN_INT_INT0ID_STATUS)
    {
    //
    // Read the controller status. This will return a field of status
    // error bits that can indicate various errors. Error processing
    // is not done in this example for simplicity. Refer to the
    // API documentation for details about the error status bits.
    // The act of reading this status will clear the interrupt.
    //
    status = CAN_getStatus(CANA_BASE);

    //
    // Check to see if an error occurred.
    //
    if(((status & ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK)) != 7) &&
    ((status & ~(CAN_STATUS_TXOK | CAN_STATUS_RXOK)) != 0))
    {
    //
    // Set a flag to indicate some errors may have occurred.
    //
    errorFlag = 1;
    }
    }

    //
    // Check if the cause is the transmit message object 1
    //
    else if(status == TX_MSG_OBJ_ID)
    {
    //
    // Getting to this point means that the TX interrupt occurred on
    // message object 1, and the message TX is complete. Clear the
    // message object interrupt.
    //
    CAN_clearInterruptStatus(CANA_BASE, TX_MSG_OBJ_ID);

    //
    // Increment a counter to keep track of how many messages have been
    // sent. In a real application this could be used to set flags to
    // indicate when a message is sent.
    //
    txMsgCount++;

    //
    // Since the message was sent, clear any error flags.
    //
    errorFlag = 0;
    }

    //
    // Check if the cause is the receive message object 2
    //
    else if(status == RX_MSG_OBJ_ID)
    {
    //
    // Get the received message
    //
    CAN_readMessage(CANA_BASE, RX_MSG_OBJ_ID, rxMsgData);

    //
    // Getting to this point means that the RX interrupt occurred on
    // message object 2, and the message RX is complete. Clear the
    // message object interrupt.
    //
    CAN_clearInterruptStatus(CANA_BASE, RX_MSG_OBJ_ID);

    //
    // Increment a counter to keep track of how many messages have been
    // received. In a real application this could be used to set flags to
    // indicate when a message is received.
    //
    rxMsgCount++;

    //
    // Since the message was received, clear any error flags.
    //
    errorFlag = 0;
    }

    //
    // If something unexpected caused the interrupt, this would handle it.
    //
    else
    {
    //
    // Spurious interrupt handling can go here.
    //
    }

    //
    // Clear the global interrupt flag for the CAN interrupt line
    //
    CAN_clearGlobalInterruptStatus(CANA_BASE, CAN_GLOBAL_INT_CANINT0);

    //
    // Acknowledge this interrupt located in group 9
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }

    //
    // End of File
    //

  • Debasish,

              Your original post refers to can_ex5_transmit_receive, but you have pasted can_ex2_loopback_interrupts.c in your last post. I am not sure exactly what help you are expecting. In any case, debugging your code is not something we can support on e2e. All C2000ware examples are tested examples and should work “as is”.

  • Hello Sir Please give me proper solution for the  bellow problem ,

    We have gone through the examples in the document SPRACE5.pdf, unfortunately it does not have scenario that we are expecting.

    Yes On CAN A we tried configure Mail Box 1 for Transmit and Mail box 2 for receive . only Transmit is working , the receive functionality is not working.

    Kindly let us know how to make both Transmit and Receive works parallel on CAN A 

  • I just imported can_ex2_loopback_interrupts.c from C:\ti\c2000\C2000Ware_4_01_00_00\driverlib\f28004x\examples\can and ran it on Launchpad. It ran fine without any issues.

    If you are running the Tx and Rx programs on different boards, make sure nodes are not in loopback mode. i.e. the below line should be commented.

    //
    // Enable CAN test mode with external loopback
    //
    CAN_enableTestMode(CANA_BASE, CAN_TEST_EXL);

  • Thank you Sir , Both examples (can_ex5_transmit_receive & can_ex2_loopback_interrupts ) now working .

    In "can_ex5_transmit_receive"  Communication Successful  in CANA Channel both Transmit (Mail box 2 used) and Receive(Mail box 3 used) working parallel.

    Now I am trying for multiple Mail Boxes i.e  16 Mail Boxes for TX and 16 Mail Boxes for RX , please guide me.

    can_ex5_transmit_receive_PARALLEL

    //########################################

    //######DEBASIS//both Transmit and Receive works parallel on CAN A Channel##########
    //######MAIL BOX 2(TX) and MAIL BOX 3(RX) #####


    // FILE: can_ex5_transmit_receive.c
    //
    // TITLE: CAN Configuration for Transmit and Receive.
    //
    //! \addtogroup driver_example_list
    //! <h1> CAN Transmit and Receive Configurations </h1>
    //!
    //! This example shows the basic setup of CAN in order to transmit or receive
    //! messages on the CAN bus with a specific Message ID. The CAN Controller is
    //! configured according to the selection of the define.
    //!
    //! When the TRANSMIT define is selected, the CAN Controller acts as a
    //! Transmitter and sends data to the second CAN Controller connected
    //! externally.If TRANMSIT is not defined the CAN Controller acts as a Receiver
    //! and waits for message to be transmitted by the External CAN Controller.
    //! Please refer to the appnote Programming Examples and Debug Strategies
    //! for the DCAN Module (www.ti.com/lit/SPRACE5) for useful information
    //! about this example
    //!
    //! \note CAN modules on the device need to be connected to via CAN
    //! transceivers.
    //!
    //! \b Hardware \b Required \n
    //! - A C2000 board with CAN transceiver.
    //!
    //! \b External \b Connections \n
    //! - ControlCARD CANA is on DEVICE_GPIO_PIN_CANTXA (CANTXA)
    //! - and DEVICE_GPIO_PIN_CANRXA (CANRXA)
    //!
    //! \b Watch \b Variables \b Transmit \Configuration \n
    //! - MSGCOUNT - Adjust to set the number of messages
    //! - txMsgCount - A counter for the number of messages sent
    //! - txMsgData - An array with the data being sent
    //! - errorFlag - A flag that indicates an error has occurred
    //! - rxMsgCount - Has the initial value as No. of Messages to be received
    //! and decrements with each message.
    //!
    //
    //#############################################################################

    //
    // Included Files
    #include "driverlib.h"
    #include "device.h"

    //
    // Comment to Make the CAN Controller work as a Receiver.
    //
    //#define TRANSMIT
    //
    // Defines
    //
    //#ifdef TRANSMIT
    #define TX_MSG_OBJ_ID 2   //DEBASIS CONFIGURATION 
    //#else
    #define RX_MSG_OBJ_ID 3  //DEBASIS CONFIGURATION 
    //#endif
    #define MSG_DATA_LENGTH 4
    #define MSGCOUNT 10

    //
    // Globals
    //
    //#ifdef TRANSMIT
    volatile uint32_t txMsgCount = 0;
    uint32_t txMsgSuccessful = 1;
    uint16_t txMsgData[4];
    //#else
    volatile uint32_t rxMsgCount = MSGCOUNT;
    uint16_t rxMsgData[4];
    //#endif
    volatile unsigned long i;
    volatile uint32_t errorFlag = 0;
    //
    // Function Prototypes
    //
    __interrupt void canaISR(void);

    //
    // Main
    //
    void main(void)
    {
    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Initialize GPIO and configure GPIO pins for CANTX/CANRX
    // on module A.
    //
    Device_initGPIO();
    GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);
    GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);

    //
    // Initialize the CAN controllers
    //
    CAN_initModule(CANA_BASE);

    //
    // Set up the CAN bus bit rate to 500kHz for each module
    // Refer to the Driver Library User Guide for information on how to set
    // tighter timing control. Additionally, consult the device data sheet
    // for more information about the CAN module clocking.
    //
    CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 500000, 20);

    //

    // Enable interrupts on the CAN A peripheral.
    //
    CAN_enableInterrupt(CANA_BASE, CAN_INT_IE0 | CAN_INT_ERROR |
    CAN_INT_STATUS);

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
    // This registers the interrupt handler in PIE vector table.
    //
    Interrupt_register(INT_CANA0,&canaISR);

    //
    // Enable the CAN-A interrupt signal
    //
    Interrupt_enable(INT_CANA0);

    CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);
    //
    //#ifdef TRANSMIT
    //
    // Initialize the transmit message object used for sending CAN messages.
    // Message Object Parameters:
    // CAN Module: A
    // Message Object ID Number: 1
    // Message Identifier: 0x15555555
    // Message Frame: Extended
    // Message Type: Transmit
    // Message ID Mask: 0x0
    // Message Object Flags: None
    // Message Data Length: 4 Bytes
    //

    CAN_setupMessageObject(CANA_BASE, TX_MSG_OBJ_ID,0x15555555,
    CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_TX, 0,
    CAN_MSG_OBJ_TX_INT_ENABLE, MSG_DATA_LENGTH);

    //
    //
    // Initialize the transmit message object data buffer to be sent
    //
    txMsgData[0] = 0x12;
    txMsgData[1] = 0x34;
    txMsgData[2] = 0x56;
    txMsgData[3] = 0x78;
    //#else

    // Initialize the receive message object used for receiving CAN messages.
    // Message Object Parameters:
    // CAN Module: A
    // Message Object ID Number: 1
    // Message Identifier: 0x15555555
    // Message Frame: Extended
    // Message Type: Receive
    // Message ID Mask: 0x0
    // Message Object Flags: Receive Interrupt
    // Message Data Length: 4 Bytes (Note that DLC field is a "don't care"
    // for a Receive mailbox
    //
    //
    CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID, 0x15555555,
    CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0,
    CAN_MSG_OBJ_RX_INT_ENABLE, MSG_DATA_LENGTH);

    //#endif

    //
    // Start CAN module A operations
    //
    CAN_startModule(CANA_BASE);

    //#ifdef TRANSMIT
    //
    // Transmit messages from CAN-A.
    //
    #if 0
    for(i = 0;i<MSGCOUNT; i++)
    #else
    for(;;)
    #endif
    {
    //
    // Check the error flag to see if errors occurred
    //
    if(errorFlag)
    {
    asm(" ESTOP0");
    }

    //
    // Transmit the message.
    //

    CAN_sendMessage(CANA_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH,
    txMsgData);

    //
    // Delay 0.25 second before continuing
    //
    DEVICE_DELAY_US(250000);

    while(txMsgSuccessful);

    //
    // Increment the value in the transmitted message data.
    //
    txMsgData[0] += 0x01;
    txMsgData[1] += 0x01;
    txMsgData[2] += 0x01;
    txMsgData[3] += 0x01;

    //
    // Reset data if exceeds a byte
    //
    if(txMsgData[0] > 0xFF)
    {
    txMsgData[0] = 0;
    }
    if(txMsgData[1] > 0xFF)
    {
    txMsgData[1] = 0;
    }
    if(txMsgData[2] > 0xFF)
    {
    txMsgData[2] = 0;
    }
    if(txMsgData[3] > 0xFF)
    {
    txMsgData[3] = 0;
    }

    //
    // Update the flag for next message.
    //
    txMsgSuccessful = 1;
    }
    //#else
    //
    // Loop to keep receiving data from another CAN Controller.
    //

    while(rxMsgCount)
    {
    }
    //#endif

    //
    // Stop application after completion.
    //
    asm(" ESTOP0");
    }

    //
    // CAN A ISR - The interrupt service routine called when a CAN interrupt is
    // triggered on CAN module A.
    //
    __interrupt void canaISR(void)
    {
    uint32_t status;

    //
    // Read the CAN-B interrupt status to find the cause of the interrupt
    //
    status = CAN_getInterruptCause(CANA_BASE);

    //
    // If the cause is a controller status interrupt, then get the status
    //
    if(status == CAN_INT_INT0ID_STATUS)
    {
    //
    // Read the controller status. This will return a field of status
    // error bits that can indicate various errors. Error processing
    // is not done in this example for simplicity. Refer to the
    // API documentation for details about the error status bits.
    // The act of reading this status will clear the interrupt.
    //
    status = CAN_getStatus(CANA_BASE);

    //
    // Check to see if an error occurred.
    //


    //#ifdef TRANSMIT
    if(((status & ~(CAN_STATUS_TXOK)) != CAN_STATUS_LEC_MSK) &&
    ((status & ~(CAN_STATUS_TXOK)) != CAN_STATUS_LEC_NONE))
    //#else
    if(((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_MSK) &&
    ((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_NONE))
    //#endif
    {
    //
    // Set a flag to indicate some errors may have occurred.
    //
    errorFlag = 1;
    }
    }
    //#ifdef TRANSMIT
    else if(status == TX_MSG_OBJ_ID)
    {
    //
    // Getting to this point means that the TX interrupt occurred on
    // message object 1, and the message TX is complete. Clear the
    // message object interrupt.
    //
    CAN_clearInterruptStatus(CANA_BASE, TX_MSG_OBJ_ID);

    //
    // Increment a counter to keep track of how many messages have been
    // transmitted. In a real application this could be used to set flags to
    // indicate when a message is transmitted.
    //
    txMsgCount++;

    //
    // Since the message was transmitted, clear any error flags.
    //
    errorFlag = 0;

    //
    // Clear the message transmitted successful Flag.
    //
    txMsgSuccessful = 0;
    }
    //#else
    else if(status == RX_MSG_OBJ_ID)
    {
    //
    // Get the received message
    //
    // CAN_readMessage(CANA_BASE, RX_MSG_OBJ_ID, rxMsgData);

    CAN_readMessage(CANA_BASE, RX_MSG_OBJ_ID, rxMsgData);

    //
    // Getting to this point means that the RX interrupt occurred on
    // message object 1, and the message RX is complete. Clear the
    // message object interrupt.
    //
    CAN_clearInterruptStatus(CANA_BASE, RX_MSG_OBJ_ID);
    //
    // Decrement the counter after a message has been received.
    //
    rxMsgCount--;

    //
    // Since the message was received, clear any error flags.
    //
    errorFlag = 0;
    }
    //#endif
    //
    // If something unexpected caused the interrupt, this would handle it.
    //
    else
    {
    //
    // Spurious interrupt handling can go here.
    }

    //
    // Clear the global interrupt flag for the CAN interrupt line
    //
    CAN_clearGlobalInterruptStatus(CANA_BASE, CAN_GLOBAL_INT_CANINT0);

    //
    // Acknowledge this interrupt located in group 9
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }

    //
    // End of File
    //

  • Debasis,

             Whether you use 1 mailbox or 16 mailboxes, the procedure to configure the mailboxes are exactly the same. Just make sure the transmitting mailbox and the corresponding receive mailbox have the same ARBID (Message ID)

  • Thank you so much Sir ,

    We implemented it's working now.