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:



