Hello,
I just upgraded to TivaWare 2.1.3.156, and my application which runs on a EK-TM4C1294XL just stopped receiving CAN packets.
My application is based on the examples/peripherals/can/simple_rx.c, and after upgrading to 2.1.3.156, I only receive the first CAN packet.
Excerpt of the code:
void motorCAN_Init(void) { MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); MAP_GPIOPinConfigure(GPIO_PA0_CAN0RX); MAP_GPIOPinConfigure(GPIO_PA1_CAN0TX); MAP_GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); MAP_CANInit(CAN0_BASE); MAP_CANBitRateSet(CAN0_BASE, TM4C129FREQ, 1000000); CANIntRegister(CAN0_BASE, CAN0IntHandler); // Enable interrupts on the CAN peripheral. MAP_CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR);// | CAN_INT_STATUS); MAP_IntEnable(INT_CAN0); MAP_CANEnable(CAN0_BASE); g_sCAN0RxMessage.ui32MsgID = CAN0RXID; g_sCAN0RxMessage.ui32MsgIDMask = 0; g_sCAN0RxMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; g_sCAN0RxMessage.ui32MsgLen = sizeof(g_sRXMsgData); g_sCAN0RxMessage.pui8MsgData = (uint8_t *)&g_sRXMsgData; MAP_CANMessageSet(CAN0_BASE, RXOBJECT, &g_sCAN0RxMessage, MSG_OBJ_TYPE_RX); g_sCAN0TxMessage.ui32MsgID = CAN0TXID; g_sCAN0TxMessage.ui32MsgIDMask = 0; g_sCAN0TxMessage.ui32Flags = MSG_OBJ_NO_FLAGS; g_sCAN0TxMessage.ui32MsgLen = sizeof(g_sTXMsgData); g_sCAN0TxMessage.pui8MsgData = (uint8_t *)&g_sTXMsgData; }
static void CAN0IntHandler(void) { uint32_t ui32Status; // Read the CAN interrupt status to find the cause of the interrupt ui32Status = MAP_CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE); // If this was a status interrupt acknowledge it by reading the CAN // controller status register. if (ui32Status == CAN_INT_INTID_STATUS) { ui32Status = MAP_CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); g_ui32ErrFlag |= ui32Status; // Send error to external handler if (g_ui32ErrFlag) motorCAN_ISRHook(g_ui32ErrFlag | CAN_HOOK_ERROR_MASK); MAP_CANIntClear(CAN0_BASE, CAN_INT_INTID_STATUS); } // Check if the cause is message object RXOBJECT, which we are using // for receiving messages. else if (ui32Status == RXOBJECT) { MAP_CANIntClear(CAN0_BASE, RXOBJECT); g_ui32RXMsgCount++; g_ui32ErrFlag = 0; // Set flag to indicate received message is pending. motorCAN_ISRHook(ui32Status); } } // Hook which runs on ISR context!! void motorCAN_ISRHook(uint32_t ui32Status) { if (xCANParserTaskHandle != NULL) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; xTaskNotifyFromISR(xCANParserTaskHandle, ui32Status, eSetValueWithOverwrite, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } } uint32_t motorCAN_ReceiveMessage(uint8_t *pui8RXBuff) { ROM_CANMessageGet(CAN0_BASE, RXOBJECT, &g_sCAN0RxMessage, false); for (int i=0; i<g_sCAN0RxMessage.ui32MsgLen; i++) pui8RXBuff[i] = g_sCAN0RxMessage.pui8MsgData[i]; return g_sCAN0RxMessage.ui32MsgLen; }
// task while: ui32Notification = ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // Get the CAN message tFbkMsg sFbkMsg; sFbkMsg.length = motorCAN_ReceiveMessage(sFbkMsg.data);
At first glance, it seems that the new CANIntClear, does not really clear the interrupt.
When I revert the changes made by the new TivaWare to CANIntClear, it works.
What can be the issue?