Part Number: TM4C123GH6PM
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;
}