#include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_can.h" #include "inc/hw_ints.h" #include "inc/hw_nvic.h" #include "inc/hw_sysctl.h" #include "driverlib/can.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "utils/uartstdio.h" volatile unsigned long g_ulMsgCount = 0; volatile unsigned long g_bErrFlag = 0; //***************************************************************************** // This function provides a 1 second delay using a simple polling method. //***************************************************************************** void SimpleDelay(void) { // Delay cycles for 1 second SysCtlDelay(SysCtlClockGet(SYSTEM_CLOCK_SPEED) / 3); } void CANIntHandler(void) { unsigned long ulStatus; ulStatus = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE); if(ulStatus == CAN_INT_INT0ID_STATUS) { ulStatus = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL); g_bErrFlag = 1; } else if(ulStatus == 1) { CANIntClear(CAN0_BASE, 1); g_ulMsgCount++; g_bErrFlag = 0; } else { } } tCANMsgObject sTXCANMessage; tCANMsgObject sRXCANMessage; unsigned char ucTXMsgData[4], ucRXMsgData[4]; int main(void) { HWREG(SYSCTL_MWRALLOW) = 0xA5A5A5A5; SysCtlClockConfigSet(SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2 | SYSCTL_USE_PLL | (SYSCTL_SPLLIMULT_M & 0x0F)); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinConfigure(GPIO_PB4_CAN0RX); GPIOPinConfigure(GPIO_PB5_CAN0TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); CANInit(CAN0_BASE); CANEnable(CAN0_BASE); CANClkSourceSelect(CAN0_BASE,CAN_CLK_M3); CANBitRateSet(CAN0_BASE, SysCtlClockGet(SYSTEM_CLOCK_SPEED), 500000); CANIntRegister(CAN0_BASE,INT_CAN0INT0,&CANIntHandler); // if using dynamic vectors CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); *(unsigned long *)ucTXMsgData = 0; sTXCANMessage.ulMsgID = 1; sTXCANMessage.ulMsgIDMask = 0; sTXCANMessage.ulFlags = MSG_OBJ_NO_FLAGS; sTXCANMessage.ulMsgLen = sizeof(ucTXMsgData); sTXCANMessage.pucMsgData = ucTXMsgData; *(unsigned long *)ucRXMsgData = 0; sRXCANMessage.ulMsgID = 1; sRXCANMessage.ulMsgIDMask = 0; sRXCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE; sRXCANMessage.ulMsgLen = sizeof(ucRXMsgData); sRXCANMessage.pucMsgData = ucRXMsgData; for(;;) { CANMessageSet(CAN0_BASE, 1, &sRXCANMessage, MSG_OBJ_TYPE_RX); CANMessageSet(CAN0_BASE, 2, &sTXCANMessage, MSG_OBJ_TYPE_TX); SimpleDelay(); CANMessageGet(CAN0_BASE, 2, &sRXCANMessage, true); (*(unsigned long *)ucTXMsgData)++; } }