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

