i am using TM4C123GH6PM microcontroller. lauchpad (TM4C123GXL).
i am trying to transmit the data from CAN to CAN. in our project board1 TO board 2 .
i am using CAN0 . using pins ...transmit (PE5 ), receive (PE4 ).
for transmit i am using the polling mechanism. and for receiving i am using the interrupt handling mechanism.
now i am facing one problem.
when i am trying to transmit the data from board1 (CAN) to board 2 (CAN) , at first time receiving flag is rised, and from the CAN CONTROL REGISTER -(CAN_CTL_INIT ) bit is also rised. the CAN CONTROL REGISTER get the value as E4.
for the second time transmit the data from board1 (CAN) to board 2(CAN) , then the error flag is gererated. the receive interrupt is not generated .
why its going to the error mode for the second time.
for reference i am attaching my CAN file.can_tx_rx.h
/**************************************************************************** * FILE: Can_tx_rx.c **************************************************************************** * Copyright 2012 Testamatic Systems, Inc., All Rights Reserved. * Testamatic System Confidential **************************************************************************** * DESCRIPTION: This is Wifi_uart file for this project. * * ABBREVIATIONS: None * * TRACEABILITY INFO: * Design Document(s): * Requirements Document(s): * * DEVIATIONS FROM STANDARDS:None *****************************************************************************/ /******************************************************************************** Include files *******************************************************************************/ #include <stdbool.h> #include <stdint.h> #include <string.h> #include <stdlib.h> #include "inc/tm4c1231h6pm.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_gpio.h" #include "driverlib/sysctl.h" #include "driverlib/can.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/rom_map.h" #include "driverlib/uart.h" #include "can_tx_rx.h" #include "bluetooth_uart.h" #include "Eeprom_Emulation.h" #include "Wifi_uart.h" /***************************************************************************** * Macros ****************************************************************************/ /***************************************************************************** * Global Variables ****************************************************************************/ uint8_t pui8BufferOut[8] = {0x61,0x72,0x75,0x6E,0x00,0x00,0x00,0x00}; uint8_t pui8MsgData[8]; uint8_t eeprombuffer[14]; // EEPROM data buffer uint32_t g_ui32MsgCount_Tx = 0 ; // transmitting message counter uint32_t g_ui32MsgCount_Rx = 0; // receving message counter volatile bool g_bErrFlag ; volatile bool g_bRXFlag2 ; struct eeprom_data data; tCANMsgObject sMsgObjectTx,sMsgObjectRx,sMsgObjectTx1; tCANBitClkParms GetBittime; //***************************************************************************** // This function is for making delay(in ms). //***************************************************************************** void Can_Re_Init(void) { CANDisable(CAN0_BASE); // initialize the CAN0 CANInit(CAN0_BASE); can_info(); IntEnable(INT_CAN0); // enable the interrupt on the CAN peripheral CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // enable the CANEnable(CAN0_BASE); } //***************************************************************************** // This function is for making delay(in ms). //***************************************************************************** void can_info(void) { // initialize the CAN0 //CANInit(CAN0_BASE); // assigning the CAN bit timing structure values for CAN transmit and receive GetBittime.ui32SyncPropPhase1Seg=8; GetBittime.ui32Phase2Seg=7; GetBittime.ui32SJW=4; GetBittime.ui32QuantumPrescaler=10; // set that assigning values to that CAN CANBitTimingSet(CAN0_BASE, &GetBittime); // initialize the CAN message object structure members fot transmitting the data sMsgObjectTx.ui32MsgID = 0x400; sMsgObjectTx.ui32Flags = 0; sMsgObjectTx.ui32Flags = MSG_OBJ_TX_INT_ENABLE; sMsgObjectTx.pui8MsgData = pui8BufferOut; sMsgObjectTx.ui32MsgLen = 8; // assign the CAN message object structure members for receving the data sMsgObjectRx.ui32MsgID = 0X101 ; sMsgObjectRx.ui32MsgIDMask = 0Xffff; sMsgObjectRx.ui32Flags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | MSG_OBJ_EXTENDED_ID ); sMsgObjectRx.ui32MsgLen = 8; // set the messgae object 2 for receving the data CANMessageSet(CAN0_BASE, 2, &sMsgObjectRx, MSG_OBJ_TYPE_RX); } //***************************************************************************** // This function is for making delay(in ms). //***************************************************************************** void CAN_Config(void) { // enable the PORT-E for CAN TX & RX SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); // enable the PORTE GPIOPinConfigure(GPIO_PE4_CAN0RX); // configure the PE4 for CAN receiving function GPIOPinConfigure(GPIO_PE5_CAN0TX); // configure the PE5 for CAN transmitting function GPIOPinTypeCAN(GPIO_PORTE_BASE, GPIO_PIN_4 | GPIO_PIN_5); // enable the pin types for CAN SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0); GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, 0); // FOR CAN STB SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4, 0); // FOR CAN shutdown // The GPIO port and pins have been set up for CAN. The CAN peripheral // must be enabled. // CANDisable(CAN0_BASE); // initialize the CAN0 //CANInit(CAN0_BASE); can_info(); IntEnable(INT_CAN0); // enable the interrupt on the CAN peripheral CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // enable the CANEnable(CAN0_BASE); } //***************************************************************************** // This function is for making delay(in ms). //***************************************************************************** void CANIntHandler(void) { uint32_t ui32Status; // Read the CAN interrupt status to find the cause of the interrupt ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE); // If the cause is a controller status interrupt, then get the status if(ui32Status == CAN_INT_INTID_STATUS) { // Read the controller status ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); CANIntClear(CAN0_BASE, CAN_INT_INTID_STATUS); // set the error flag g_bErrFlag = 1; } // Check if the cause is message object 1, which what we are using for // sending messages. else if(ui32Status == 1) { //-----------Transmit Interrupt-----------// // If this condition is true, then the TX interrupt occurred on // message object 1, and the message TX is complete. Clear the // message object interrupt. CANIntClear(CAN0_BASE, 1); g_ui32MsgCount_Tx++; // clear the error flag g_bErrFlag = 0; } else if(ui32Status == 2) { //-------------Receive Interrupt-----------// // If this condition is true, then the RX interrupt occurred on // message object 2, and the message RX is complete. Clear the // message object interrupt. CANIntClear(CAN0_BASE, 2); // g_ui32MsgCount_Rx++; // Set flag to indicate received message is pending. g_bRXFlag2 = 1; // clear the error flag g_bErrFlag = 0; } else { } } //***************************************************************************** // This function is for making delay(in ms). //***************************************************************************** // what ever the data is received check that data is in proper formate, // if its in the proper frame formate means put the data in the CAN buffer void can_frame(void) { if (BT_CAN_Tx_Req_Status()) { can_transmit(); BT_Clr_CAN_Tx_Req_Flg(); } else if (WIFI_CAN_Tx_Req_Status()) { can_transmit(); WIFI_Clr_CAN_Tx_Req_Flg(); } else { /* DO transmits */ } // // if((WIFI_Rx_Buff[9]==0xA5) && ( WIFI_Rx_Buff[10]==0x5A) && ( WIFI_Rx_Buff[11]==0xFE)) // // { // // // if the frame is proper format means enter into the condition // // int j=0,k=10; // for(int i=0; i< 9 ;i++) // { // // // if(( WIFI_Rx_Buff[k]!=0x5A) && ( WIFI_Rx_Buff[k+1]!=0xA5)) // check for the stop bit // // { // pui8BufferOut[j++] = WIFI_Rx_Buff[k++]; // // } // } // // can_transmit(); // // } // // if the data is not in the proper frame format means put that data with its details in EEPROM // else if((BT_Rx_Buff[0]==0xA5) && (BT_Rx_Buff[1]==0x5A) && (BT_Rx_Buff[2]==0xFF)) // check the frame formate // { // // // put zero in the eeprom buffer // // memset((uint8_t*)eeprombuffer,0,strlen((const char *)eeprombuffer)); // // int x=0,y=4; // // for(int z=0; z<BT_Rx_Buff[3] ;z++) // { // if((BT_Rx_Buff[y]!=0x5A) && (BT_Rx_Buff[y+1]!=0xA5)) // checking for the stop bit of the frame // { // eeprombuffer[x++] = BT_Rx_Buff[y++]; // put the each and every data to the eeprom buffer // } // } // // // BT_Msg_Send(eeprombuffer,strlen(eeprombuffer)); // for checking purpose (eeprombuffer) // // memcpy(&data,eeprombuffer,sizeof(eeprombuffer)); // // initialize the EEPROM // // EEPROM_Init(); // // } } //***************************************************************************** // This function is for making delay(in ms). //***************************************************************************** // Send message 1 using CAN controller message object 1. This is // the only message sent using this message object. The // CANMessageSet() function will cause the message to be sent right // away. void can_transmit(void) { // transmite the data through the CAN msg object CANMessageSet(CAN0_BASE, 1, &sMsgObjectTx, MSG_OBJ_TYPE_TX); } // If the flag for message object 1 is set, that means that the RX // interrupt occurred and there is a message ready to be read from // this CAN message object. //void can_recevie(void) //{ // // put the data from the TX message object buffer to the RX message object buffer // // sMsgObjectRx.pui8MsgData = pui8MsgData; // // WIFISend(sMsgObjectRx.pui8MsgData,strlen((const char *)sMsgObjectRx.pui8MsgData)); // // // read the message object from the CAN // // CANMessageGet(CAN0_BASE, 2, &sMsgObjectRx, 0); // // // after receiving the data clear the receive interrupt flag // // g_bRXFlag2 = 0; // //} /***************************************************************************** * * * Rev. SCR Date By Description * ---- --------- -------- ---- ----------------------------------- * 1.0 13 Aug 2016 Arun Created Initial Version for OBD ******************************************************************************/