Iam working on CAN based project. I have CAN transceiver code on one tivac and CAN receive code on another. I tried to communicate, The receiver code works fine it receives the data properly but the real problem is with transceiver code it can able to transmit properly but it also receives something like garbage value which should not happen i don't know where the problem is plz help. Note: The receiver code does n.t contain any transmission value.
Tranceiver 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 "driverlib/debug.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" //#include "drivers/rgb.h" volatile bool rxFlag = 0; // msg recieved flag volatile bool errFlag = 0; // error flag unsigned int sysClock; // clockspeed in hz volatile uint32_t g_ui32RXMsgCount = 0; volatile uint32_t g_ui32TXMsgCount = 0; tCANMsgObject g_sCAN0RxMessage; tCANMsgObject g_sCAN0TxMessage; //#define CAN1RXID 0 //#define RXOBJECT 1 //#define CAN1TXID 2 //#define TXOBJECT 2 // CAN interrupt handler void delay(unsigned int milliseconds) { SysCtlDelay((sysClock / 3) * (milliseconds / 1000.0f)); } 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 // g_ui32RXMsgCount++; rxFlag = 1; // set rx flag errFlag = 0; // clear any error flags } //else if(status == 1) //{ //CANIntClear(CAN1_BASE, 1); // clear interrupt //g_ui32TXMsgCount++; //errFlag = 0; // clear any error flags //} else { // should never happen UARTprintf("Unexpected CAN bus interrupt\n"); } } int main(void) { // tCANMsgObject msg; // the CAN msg object //unsigned char msgData[8]; // 8 byte buffer for rx message data tCANMsgObject msg; // the CAN message object unsigned int msgData[8]; unsigned int msgTData; // the message data is four bytes long which we can allocate as an int32 unsigned char *msgDataPtr = (unsigned char *)&msgTData; // make a pointer tofv msgData so we can access individual bytes // 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_GPION); //GPIOPinTypeGPIOInput(GPIO_PORTJ_BASE, GPIO_PIN_0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // enable CAN1 GPIOperipheral 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 tableallocation 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 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 anymatched rx messages CANMessageSet(CAN1_BASE, 1, &msg, MSG_OBJ_TYPE_RX); //msgTData = 0; msg.ui32MsgID = 1; msg.ui32MsgIDMask = 0; msg.ui32Flags = MSG_OBJ_TX_INT_ENABLE; msg.ui32MsgLen = sizeof(msgDataPtr); msg.pui8MsgData = msgDataPtr; // unsigned int colour[3]; // float intensity; unsigned int rcvmsg[8]; // unsigned int x,y,z; while(1) { IntMasterEnable(); if(rxFlag) { // rx interrupt has occured msg.pui8MsgData = msgData; // set pointer to rx buffer CANMessageGet(CAN1_BASE, 1, &msg, 0); // read CAN messageobject 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"); msg.ui32Flags &= ~MSG_OBJ_DATA_LOST; // // Set the new state of the message object. // CANMessageSet(CAN1_BASE, 1, &msg, MSG_OBJ_TYPE_RX); //colour[0] = msgData[0] * 0xFF; //colour[1] = msgData[1] * 0xFF; // colour[2] = msgData[2] * 0xFF; //intensity = msgData[3] / 255.0f; // scale from 0-255 to float 0-1 // write to UART for debugging // UARTprintf("Received colour\tr: %d\tg: %d\tb: %d\ti: %d\n", colour[0],colour[1], colour[2], intensity); //UARTprintf("Received colour\tr: %d\tg: %d\tb: %d\ti: %d\n", msgData[0],msgData[1],msgData[2], msgData[3]); } // read in colour data from rx buffer (scale from 0-255 to 0-0xFFFF for LEDdriver) // colour[0] = msgData[0] * 0xFF; // colour[1] = msgData[1] * 0xFF; // colour[2] = msgData[2] * 0xFF; // intensity = msgData[3] / 255.0f; // scale from 0-255 to float 0-1 rcvmsg[0] = msgData[0] ; rcvmsg[1] = msgData[1] ; rcvmsg[2] = msgData[2] ; rcvmsg[3] = msgData[3] ; //rcvmsg[4] = msgData[4] ; //rcvmsg[5] = msgData[5] ; // rcvmsg[6] = msgData[6] ; //x=msgData[4]; //y=msgData[5]; //z=(x<<8)|y; // write to UART for debugging UARTprintf("Received message 0x%02X %02X %02X %02X\n", rcvmsg[0], rcvmsg[1],rcvmsg[2],rcvmsg[3]); //UARTprintf("Received message 0x%02X %02X %02X %02X\n",rcvmsg[1]); //UARTprintf("Analog Volatage : %d \n", z); //UARTprintf("Analog Volatage : %d \n", rcvmsg[6]); // write to UART for debugging // UARTprintf("Received colour\tr: %d\tg: %d\tb: %d\ti: %d\n", colour[0], colour[1], colour[2], intensity); // set colour and intensity //RGBSet(colour, intensity); } else #if DEBUG if(bMsgFlag == 0) { UARTPrintf("cant able to receive message"); bMsgFlag = 1; } #endif //UARTprintf("can't able to receive message\n"); msgDataPtr[0] = 0x01; msgDataPtr[1] = 0x00; msgDataPtr[2] = 0x06; msgDataPtr[3] = 0x05; CANMessageSet(CAN1_BASE,1, &msg,MSG_OBJ_TYPE_TX); // send as msg object 1 // UARTprintf("cant able to transmit message\n"); UARTprintf("Sending msg: 0x%02X %02X %02X %02X\n", msgDataPtr[0], msgDataPtr[1], msgDataPtr[2], msgDataPtr[3]); delay(1000); // wait 100ms IntMasterEnable(); if(errFlag) { // check for errors UARTprintf("CAN Bus Error\n"); } // t++; // overflow is fine //if(GPIOPinRead(GPIO_PORTJ_BASE, GPIO_PIN_0)) //{ // UARTprintf("cant able to transmit message\n"); // } // wait 100ms } //delay(1000); // wait 100ms //return 0; }
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" //#include "drivers/rgb.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 { // should never happen UARTprintf("Unexpected CAN bus interrupt\n"); } } int main(void) { tCANMsgObject msg; // the CAN msg object unsigned char msgData[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 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(CAN1_BASE, 1, &msg, MSG_OBJ_TYPE_RX); // unsigned int colour[3]; // float intensity; unsigned int rcvmsg[4]; while(1) { //IntMasterEnable(); if(rxFlag) { // rx interrupt has occured msg.pui8MsgData = msgData; // set pointer to rx buffer CANMessageGet(CAN1_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"); msg.ui32Flags &= ~MSG_OBJ_DATA_LOST; // // Set the new state of the message object. // CANMessageSet(CAN1_BASE, 1, &msg, MSG_OBJ_TYPE_RX); //colour[0] = msgData[0] * 0xFF; //colour[1] = msgData[1] * 0xFF; // colour[2] = msgData[2] * 0xFF; //intensity = msgData[3] / 255.0f; // scale from 0-255 to float 0-1 // write to UART for debugging // UARTprintf("Received colour\tr: %d\tg: %d\tb: %d\ti: %d\n", colour[0], colour[1], colour[2], intensity); //UARTprintf("Received colour\tr: %d\tg: %d\tb: %d\ti: %d\n", msgData[0], msgData[1],msgData[2], msgData[3]); } // read in colour data from rx buffer (scale from 0-255 to 0-0xFFFF for LED driver) // colour[0] = msgData[0] * 0xFF; // colour[1] = msgData[1] * 0xFF; // colour[2] = msgData[2] * 0xFF; // intensity = msgData[3] / 255.0f; // scale from 0-255 to float 0-1 rcvmsg[0] = msgData[0] ; rcvmsg[1] = msgData[1] ; rcvmsg[2] = msgData[2] ; rcvmsg[3] = msgData[3] ; // write to UART for debugging UARTprintf("Received message 0x%02X %02X %02X %02X\n", rcvmsg[0], rcvmsg[1],rcvmsg[2],rcvmsg[3]); // write to UART for debugging // UARTprintf("Received colour\tr: %d\tg: %d\tb: %d\ti: %d\n", colour[0], colour[1], colour[2], intensity); // set colour and intensity //RGBSet(colour, intensity); } else { #if DEBUG if(bMsgFlag == 0) { UARTPrintf("cant able to receive message"); bMsgFlag = 1; } #endif //UARTprintf("can't able to receive message\n"); } } //return 0; }
Output: