Tool/software: TI-RTOS
I have been trying to run CANIntHandler() on TI-RTOS as a Hardware Interrupt (Hwi) with interrupt number 55( As of datasheet 55 is assigned for can0 ). But the interrupt status was ended up showing ERROR .
I have assigned can_rx() as a task.
Please help me out with the code
/* XDCtools Header files */ #include <xdc/std.h> #include <xdc/cfg/global.h> #include <xdc/runtime/System.h> /* BIOS Header files */ #include <ti/sysbios/BIOS.h> /* Board Header file */ #include "Board.h" #include <stdint.h> #include <stdbool.h> #include <math.h> #include "inc/hw_gpio.h" #include "inc/hw_types.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/pin_map.h" #include "driverlib/gpio.h" #include "driverlib/qei.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #include "inc/hw_can.h" #include "driverlib/can.h" #include "driverlib/interrupt.h" #include "driverlib/timer.h" volatile bool rxFlag = 0; // msg recieved flag volatile bool errFlag = 0; // error flag void hardware_init(void); void can_rx(void); void CANIntHandler(void); void main(void) { hardware_init(); BIOS_start(); } void hardware_init(void) { // Set the clocking to run directly from the crystal. SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); // Set up debugging UART SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); UARTStdioConfig(0, 115200, SysCtlClockGet()); // Set up CAN0 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); GPIOPinConfigure(GPIO_PE4_CAN0RX); GPIOPinConfigure(GPIO_PE5_CAN0TX); GPIOPinTypeCAN(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); CANInit(CAN0_BASE); CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 500000); //CANIntRegister(CAN0_BASE, CANIntHandler); // use dynamic vector table allocation CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); IntEnable(INT_CAN0); CANEnable(CAN0_BASE); } // CAN interrupt handler void CANIntHandler(void) { unsigned long status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE); // read interrupt status if(status == CAN_INT_INTID_STATUS) { // controller status interrupt status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); UARTprintf("%l/", status); // this showed ERROR in my code errFlag = 1; } else if(status == 1) { // msg object 1 CANIntClear(CAN0_BASE, 1); // clear interrupt rxFlag = 1; // set rx flag errFlag = 0; // clear any error flags } else { // should never happen UARTprintf("Unexpected CAN bus interrupt\n"); } } void can_rx(void) { tCANMsgObject msg; // the CAN msg object // uint8_t msgData[8]; unsigned char msgData[8]; // 8 byte buffer for rx message data unsigned int uIdx; // Use ID and mask 0 to recieved messages with any CAN ID msg.ui32MsgID = 0; msg.ui32MsgIDMask = 0; msg.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; msg.ui32MsgLen = 8; // allow up to 8 bytes // Load msg into CAN peripheral message object 1 so it can trigger interrupts on any matched rx messages CANMessageSet(CAN0_BASE, 1, &msg, MSG_OBJ_TYPE_RX); while(1) { if(rxFlag) { // rx interrupt has occured msg.pui8MsgData = msgData; // set pointer to rx buffer CANMessageGet(CAN0_BASE, 1, &msg, 0); // read CAN message object 1 from CAN peripheral rxFlag = 0; // clear rx flag if(msg.ui32Flags & MSG_OBJ_DATA_LOST) { // check msg flags for any lost messages UARTprintf("CAN message loss detected\n"); } UARTprintf("Msg ID=0x%08X len=%u data=0x", msg.ui32MsgID, msg.ui32MsgLen); for(uIdx = 0; uIdx < msg.ui32MsgLen; uIdx++) { UARTprintf("%d\ ", msgData[uIdx]); } } } return 0; }