Hi,
I am transmitting multiple CAN messages with different ID and try to receive only particular CAN message with a particular CAN ID. Can able to transmit multiple messages with different ID. but while receiving I cant able to receive the desired CAN message with a particular CAN ID. Plz help
Transmitter Code:
#include <stdbool.h> #include <stdint.h> #include <math.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_can.h" #include "inc/hw_ints.h" #include "driverlib/can.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/uart.h" #include "driverlib/pin_map.h" #include "utils/uartstdio.h" volatile bool errFlag = 0; // transmission error flag unsigned int sysClock; // clockspeed in hz void delay(unsigned int milliseconds) { SysCtlDelay((sysClock / 3) * (milliseconds / 1000.0f)); } // CAN interrupt handler void CANIntHandler(void) { unsigned long status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE); // read interrupt status if(status == CAN_INT_INTID_STATUS) { // controller status interrupt status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL); // read back error bits, do something with them? errFlag = 1; } else if(status == 1) { // message object 1 CANIntClear(CAN1_BASE, 1); // clear interrupt errFlag = 0; // clear any error flags } else if(status == 2) { // message object 1 CANIntClear(CAN1_BASE, 2); // clear interrupt errFlag = 0; // clear any error flags } else if(status == 3) { // message object 1 CANIntClear(CAN1_BASE, 3); // clear interrupt errFlag = 0; // clear any error flags } else { // should never happen UARTprintf("Unexpected CAN bus interrupt\n"); } } int main(void) { tCANMsgObject msg1,msg2,msg3; // the CAN message object unsigned int msg1Data, msg2Data, msg3Data; // the message data is four bytes long which we can allocate as an int32 unsigned char *msg1DataPtr = (unsigned char *)&msg1Data; unsigned char *msg2DataPtr = (unsigned char *)&msg2Data; unsigned char *msg3DataPtr = (unsigned char *)&msg3Data; // Run from the PLL at 120 MHz. sysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); // Set up debugging UART SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // enable UART0 GPIO peripheral 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, sysClock); // 115200 baud // Set up CAN1 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // enable CAN1 GPIO peripheral GPIOPinConfigure(GPIO_PB0_CAN1RX); GPIOPinConfigure(GPIO_PB1_CAN1TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1); CANInit(CAN1_BASE); CANBitRateSet(CAN1_BASE, sysClock, 500000); CANIntRegister(CAN1_BASE, CANIntHandler); // use dynamic vector table allocation CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); IntEnable(INT_CAN1); CANEnable(CAN1_BASE); // Set up msg object msg1Data = 0; msg1.ui32MsgID = 1; // msg1.ui32MsgIDMask = 0; msg1.ui32Flags = MSG_OBJ_TX_INT_ENABLE; msg1.ui32MsgLen = sizeof(msg1DataPtr); msg1.pui8MsgData = msg1DataPtr; msg2Data = 0; msg2.ui32MsgID = 2; // msg2.ui32MsgIDMask = 0; msg2.ui32Flags = MSG_OBJ_TX_INT_ENABLE; msg2.ui32MsgLen = sizeof(msg2DataPtr); msg2.pui8MsgData = msg2DataPtr; msg3Data = 0; msg3.ui32MsgID = 3; //msg3.ui32MsgIDMask = 0; msg3.ui32Flags = MSG_OBJ_TX_INT_ENABLE; msg3.ui32MsgLen = sizeof(msg3DataPtr); msg3.pui8MsgData = msg3DataPtr; unsigned int t = 0; // loop counter float freq = 0.3; // frequency scaler while(1) { msg1DataPtr[0] = 0x01; msg1DataPtr[1] = 0x04; msg1DataPtr[2] = 0x03; msg1DataPtr[3] = 0x04; msg2DataPtr[0] = 0x02; msg2DataPtr[1] = 0x06; msg2DataPtr[2] = 0x08; msg2DataPtr[3] = 0x10; msg3DataPtr[0] = 0x11; msg3DataPtr[1] = 0x14; msg3DataPtr[2] = 0x13; msg3DataPtr[3] = 0x14; if (UARTCharsAvail(UART0_BASE)) { if(UARTCharGetNonBlocking (UART0_BASE)=='a') { UARTprintf("Sending msg: 0x%02X %02X %02X %02X\n", msg1DataPtr[0], msg1DataPtr[1], msg1DataPtr[2], msg1DataPtr[3]); // write colour to UART for debugging UARTprintf("Sending msg: 0x%02X %02X %02X %02X\n", msg2DataPtr[0], msg2DataPtr[1], msg2DataPtr[2], msg2DataPtr[3]); // write colour to UART for debugging UARTprintf("Sending msg: 0x%02X %02X %02X %02X\n", msg3DataPtr[0], msg3DataPtr[1], msg3DataPtr[2], msg3DataPtr[3]); // write colour to UART for debugging IntMasterDisable(); CANMessageSet(CAN1_BASE, 1, &msg1, MSG_OBJ_TYPE_TX); // send as msg object 1 CANMessageSet(CAN1_BASE, 2, &msg2, MSG_OBJ_TYPE_TX); // send as msg object 1 CANMessageSet(CAN1_BASE, 3, &msg3, MSG_OBJ_TYPE_TX); // send as msg object 1 delay(100); // wait 100ms IntMasterEnable(); if(errFlag) { // check for errors UARTprintf("CAN Bus Error\n"); } } } t++; // overflow is fine } }
Output:
Receiver Code:
/* * CAN bus LED controller slave firmware * Written for TI Tiva TM4C123GH6PM */ #include <stdint.h> #include <stdbool.h> #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_can.h" #include "inc/hw_ints.h" #include "driverlib/can.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/uart.h" #include "driverlib/pin_map.h" #include "utils/uartstdio.h" volatile bool rxFlag = 0; // msg recieved flag volatile bool errFlag = 0; // error flag unsigned int sysClock; // clockspeed in hz // CAN interrupt handler void CANIntHandler(void) { unsigned long status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE); // read interrupt status if(status == CAN_INT_INTID_STATUS) { // controller status interrupt status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL); errFlag = 1; } else if(status == 1) { // msg object 1 CANIntClear(CAN1_BASE, 1); // clear interrupt rxFlag = 1; // set rx flag errFlag = 0; // clear any error flags } else if(status == 2) { // msg object 1 CANIntClear(CAN1_BASE, 2); // clear interrupt rxFlag = 1; // set rx flag errFlag = 0; // clear any error flags } else if(status == 3) { // msg object 1 CANIntClear(CAN1_BASE, 3); // clear interrupt rxFlag = 1; // set rx flag errFlag = 0; // clear any error flags }else { // should never happen UARTprintf("Unexpected CAN bus interrupt\n"); } } int main(void) { tCANMsgObject msg1,msg2,msg3;// the CAN msg object unsigned char msg1Data[8]; // 8 byte buffer for rx message data unsigned char msg2Data[8]; // 8 byte buffer for rx message data unsigned char msg3Data[8]; // 8 byte buffer for rx message data // Run from crystal at 50Mhz sysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); // 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, sysClock); // 115200 baud SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // enable CAN1 GPIO peripheral GPIOPinConfigure(GPIO_PB0_CAN1RX); GPIOPinConfigure(GPIO_PB1_CAN1TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1); CANInit(CAN1_BASE); CANBitRateSet(CAN1_BASE, sysClock, 500000); CANIntRegister(CAN1_BASE, CANIntHandler); // use dynamic vector table allocation CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); IntEnable(INT_CAN1); CANEnable(CAN1_BASE); //IntMasterEnable(); // Set up LED driver // RGBInit(1); // Use ID and mask 0 to recieved messages with any CAN ID msg1.ui32MsgID = 1; //msg.ui32MsgIDMask = 0; msg1.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; msg1.ui32MsgLen = 8; // allow up to 8 bytes // Use ID and mask 0 to recieved messages with any CAN ID msg2.ui32MsgID = 2; //msg.ui32MsgIDMask = 0; msg2.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; msg2.ui32MsgLen = 8; // allow up to 8 bytes // Use ID and mask 0 to recieved messages with any CAN ID msg3.ui32MsgID = 3; //msg.ui32MsgIDMask = 0; msg3.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; msg3.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(CAN1_BASE, 1, &msg1, MSG_OBJ_TYPE_RX); CANMessageSet(CAN1_BASE, 2, &msg2, MSG_OBJ_TYPE_RX); //CANMessageSet(CAN1_BASE, 3, &msg3, MSG_OBJ_TYPE_RX); // unsigned int colour[3]; // float intensity; unsigned int rcv1msg[4]; unsigned int rcv2msg[4]; unsigned int rcv3msg[4]; while(1) { //IntMasterEnable(); if(rxFlag) { // rx interrupt has occured msg2.pui8MsgData = msg2Data; // set pointer to rx buffer CANMessageGet(CAN1_BASE, 2, &msg2, 0); // read CAN message object 1 from CAN peripheral rxFlag = 0; // clear rx flag if(msg2.ui32Flags & MSG_OBJ_DATA_LOST) { // check msg flags for any lost messages UARTprintf("CAN message loss detected\n"); msg2.ui32Flags &= ~MSG_OBJ_DATA_LOST; // Set the new state of the message object. CANMessageSet(CAN1_BASE, 2, &msg2, MSG_OBJ_TYPE_RX); } rcv2msg[0] = msg2Data[0] ; rcv2msg[1] = msg2Data[1] ; rcv2msg[2] = msg2Data[2] ; rcv2msg[3] = msg2Data[3] ; // write to UART for debugging UARTprintf("Received message 0x%02X %02X %02X %02X\n", rcv2msg[0], rcv2msg[1],rcv2msg[2],rcv2msg[3]); } else { #if DEBUG if(bMsgFlag == 0) { UARTPrintf("cant able to receive message"); bMsgFlag = 1; } #endif } } }
Output: