Other Parts Discussed in Thread: SN65HVD1050,
Hello,
I am using SN65HVD1050 to work with the CANbus on TM4C1294NCPDT.
Here is my code on the Tiva
volatile uint32_t g_ui32IntCount = 0; // Counter that are used to count the number of message on each of the three message that are used. volatile uint32_t g_ui32Msg1Count = 0; volatile uint32_t g_ui32Msg2Count = 0; volatile uint32_t g_ui32Msg3Count = 0; // Flag to indicate message Object 3 has sent a message volatile bool g_bMsgObj3Sent = 0; // Flag to indicate transmission error has occured volatile bool g_bErrFlag = 0; // Can object that hold the separate CAN message tCANMsgObject g_sCANMsgObject1; tCANMsgObject g_sCANMsgObject2; tCANMsgObject g_sCANMsgObject3; // Message buffer that hold the contents of the 4 differenet message that are being transmitted. uint8_t g_pui8Msg1[4] = { 0, 0, 0, 0 }; uint8_t g_pui8Msg2[5] = { 2, 2, 2, 2, 2 }; uint8_t g_pui8Msg3[6] = { 3, 3, 3, 3, 3, 3 }; uint8_t g_pui8Msg4[8] = { 4, 4, 4, 4, 5, 5, 5, 5 }; void init_canbustest(uint32_t sysClock) { SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinConfigure(GPIO_PB0_CAN1RX); GPIOPinConfigure(GPIO_PB1_CAN1TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1); /* Enable CAN Peripheral */ SysCtlPeripheralDisable(SYSCTL_PERIPH_CAN1); SysCtlPeripheralReset(SYSCTL_PERIPH_CAN1); SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1); /* Initialize CAN controller */ CANInit(CAN1_BASE); /* Setup CAN Controller */ CANBitRateSet(CAN1_BASE, sysClock, 500000); /* Enable Interrupt of CAN peripheral */ // CANIntRegister(CAN1_BASE, CAN_irq); CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); IntEnable(INT_CAN1); CANEnable(CAN1_BASE); g_sCANMsgObject1.ui32MsgID = 0x1001; g_sCANMsgObject1.ui32MsgIDMask = 0; g_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE; g_sCANMsgObject1.ui32MsgLen = sizeof(g_pui8Msg1); g_sCANMsgObject1.pui8MsgData = g_pui8Msg1; g_sCANMsgObject2.ui32MsgID = 0x2001; g_sCANMsgObject2.ui32MsgIDMask = 0; g_sCANMsgObject2.ui32Flags = MSG_OBJ_TX_INT_ENABLE; g_sCANMsgObject2.ui32MsgLen = sizeof(g_pui8Msg2); g_sCANMsgObject2.pui8MsgData = g_pui8Msg2; } void CAN1IntHandler() { uint32_t ui32Status; ui32Status = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE); UARTprintf("[CAN1IntHandler]2ndCause: %x\n", ui32Status); if(ui32Status == CAN_INT_INTID_STATUS) { ui32Status = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL); UARTprintf("[CAN_INT_INTID_STATUS]Status: %x\n", ui32Status); g_bErrFlag = 1; } else if(ui32Status == 1) { CANIntClear(CAN1_BASE, 1); UARTprintf("[MsgObj1]Status: %x\n", ui32Status); g_ui32Msg1Count++; g_bErrFlag = 0; } else if(ui32Status == 2) { CANIntClear(CAN1_BASE, 2); UARTprintf("[MsgObj2]Status: %x\n", ui32Status); g_ui32Msg2Count++; g_bErrFlag = 0; } else { UARTprintf("Nothing should be printed\n"); } } void send_can_msg_test() { PrintCANMessageInfo(&g_sCANMsgObject1, 1); CANMessageSet(CAN1_BASE, 1, &g_sCANMsgObject1, MSG_OBJ_TYPE_TX); if(g_bErrFlag) UARTprintf("Bus Error\n"); } void PrintCANMessageInfo(tCANMsgObject *psCANMsg, uint32_t ui32MsgObj) { unsigned int uIdx; UARTprintf("Sending msg: obj=%d ID=0x%04X msg=0x", ui32MsgObj, psCANMsg->ui32MsgID); for(uIdx = 0; uIdx < psCANMsg->ui32MsgLen; uIdx++) { UARTprintf("%02X ", psCANMsg->pui8MsgData[uIdx]); } UARTprintf("\n"); }
Here is a snippet of my Serial COM port.
Here is the picture of my setup (I am using one SN65HVD1050 and one MCP2551)
From the COM port, I can see that the interrupt never happen when the message Object 1 is sent. So it results in BUS Error.
How should I fix this issue of my CAN bus?
Thanks,
Alex