TM4C123AE6PM: Loopback CAN data not being received.

Part Number: TM4C123AE6PM


It's probably something simple but I can't fined it.  I set up CAN-0 in loopback/test mode and send a message, it is successfully sent and received, however the pointer to the received data is 0 instead of the correct address in Ram.  Program as follows:

u8 TxData[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };

u8 Can0Data17[8];            // Transmit Data.
tCANMsgObject Can0MsgObj17;
u8 Can0Data18[8];            // Receive Data.
tCANMsgObject Can0MsgObj18;
    
void main(void) {

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); 
    (there’s delay in here)
    GPIOPinTypeCAN  (GPIO_PORTB_BASE, PB_Can2Rx_BIT | PB_Can2Tx_BIT );
    GPIOPinConfigure(GPIO_PB4_CAN0RX);
    GPIOPinConfigure(GPIO_PB5_CAN0TX);

    CANInit(CAN0_BASE);
    CANBitRateSet(CAN0_BASE, GetClkSpeed(), 500000);
    CANIntRegister(CAN0_BASE, Can0_Isr);
    CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
    IntEnable(INT_CAN0);
    CANEnable(CAN0_BASE);

    HWREG(CAN0_BASE + CAN_O_CTL) |= CAN_CTL_TEST;
    HWREG(CAN0_BASE + CAN_O_TST) |= CAN_TST_LBACK;

    u8 Can0Data18[8];
    Can0MsgObj18.ui32MsgID     = 0;    // Receive Message Object.
    Can0MsgObj18.ui32MsgIDMask = 0;
    Can0MsgObj18.ui32Flags     = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    Can0MsgObj18.ui32MsgLen    = 8;
    CANMessageSet(CAN0_BASE, MsgObj18, &Can0MsgObj18, MSG_OBJ_TYPE_RX);

    u8 Can0Data17[8];
    memcpy(Can0Data17, TxData, 8);
    Can0MsgObj17.ui32MsgID     = 0x100;    // Transmit Message Object.
    Can0MsgObj17.ui32MsgIDMask = 0x0;
    Can0MsgObj17.ui32Flags     = MSG_OBJ_TX_INT_ENABLE;
    Can0MsgObj17.ui32MsgLen    = 8;
    Can0MsgObj17.pui8MsgData   = Can0Data17;
    CANMessageSet(CAN0_BASE, MsgObj17, &Can0MsgObj17, MSG_OBJ_TYPE_TX);
}


void Can0_Isr(void) {

    u8  Status = CAN0_STS_R & 0x000000FF;        // Get Status.
    CAN0_STS_R = 0;                              // Reset Status.
    u32 Which  = CAN0_INT_R;                     // Which Message Object.
    Which = ((Which-1) & 0x1F) + 1;

    // Deal with Status Here.

    switch(Which) {

        case 17:
            // Transmit successful.
            break;

        case 18:
            CANMessageGet(CAN0_BASE, MsgObj18, &Can0MsgObj18, false);

            // Here:
            // Can0MsgObj18.ui32MsgID  is 100,
            // Can0MsgObj18.ui32MsgLen is 8,
            // but Can0MsgObj18.pui8MsgData is 0 instead of Can0Data17.

}

 

Thanks, Doug