Other Parts Discussed in Thread: SN65HVD1050, TM4C1294NCPDT
主题中讨论的其他器件:SN65HVD1050、 TM4C123
您好!
我使用 SN65HVD1050在 TM4C1294NCPDT 上与 CANbus 配合使用。
这是我在 Tiva 上的代码
volatile uint32_t g_ui32IntCount = 0;
//用于计算所用三条消息中每个消息的消息数的计数器。
volatile uint32_t g_ui32Msg1Count = 0;
volatile uint32_t g_ui32Msg2Count = 0;
volatile uint32_t g_ui32Msg3Count = 0;
//指示消息对象3已发送消息
的标志 volatile bool g_bMsgObj3Sent = 0;
//
指示发生了 volatile bfrag 错误标志;//指示发生了传输错误
//保存单独 CAN 消息
的 CAN 对象 tCANMsgObject g_sCANMsgObject1;
tCANMsgObject g_sCANMsgObject2;
tCANMsgObject g_sCANMsgObject3;
//保存正在传输的4个差分消息内容的消息缓冲器。
uint8_t g_pui8Msg1[4]={0、0、0、0};
uint8_t g_pui8Msg2[5]={2、2、2、2};
uint8_t g_pui8Msg3[6]={3、3、3、3、3、3、 3};
uint8_t g_pui8Msg4[8]={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);
/*启用 CAN 外设*/
SysCtlPeripheralDisable (SYSCTL_Periph_CAN1);
SysCtlPeripheralReset (SYSCTL_Periph_CAN1);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
/*初始化 CAN 控制器*/
CANInit (CAN1_base);
/*设置 CAN 控制器*/
CANBitRateSet (CAN1_base、sysClock、50000);
/*启用 CAN 外设的中断*/
// 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_CAUST);
UARTprintf ("[CAN1IntHandler]2ndcaus:%x\n"、ui32Status);
if (ui32Status = CAN_INT_INTID_STATUS){
ui32Status = CANStatusGet (CAN1_base、CAN_STS_CONTROL);
UARTprintf ("[CAN_INT_INTID_STATUS]状态:%x\n"、ui32Status);
G_bErrFlag = 1;
} 否则、如果(ui32Status = 1){
CANIntClear (CAN1_base、1);
UARTprintf ("[MsgObj1]状态:%x\n"、ui32Status);
G_ui32Msg1Count++;
G_bErrFlag = 0;
} 否则、如果(ui32Status = 2){
CANIntClear (CAN1_base、2);
UARTprintf ("[MsgObj2]状态:%x\n"、ui32Status);
G_ui32Msg2Count++;
G_bErrFlag = 0;
} 否则{
UARTprintf ("不应打印任何内容\n");
}
}
void send_CAN_msg_test(){
PrintCANMessageInfo (&g_sCANMsgObject1、1);
CANMessageSet (CAN1_base、1、&g_sCANMsgObject1、MSG_OBJ_TYPE_TX);
if (g_bErrFlag) UARTprintf ("总线错误\n");
}
void PrintCANMessageInfo (tCANMsgObject * psCANMsg、uint32_t ui32MsgObj)
{
unsigned int uIdx;
UARTprintf ("发送 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");
}
这是我的串行 COM 端口的一个片段。
这是我的设置图片(我使用的是一个 SN65HVD1050和一个 MCP2551)
从 COM 端口可以看到、当发送消息对象1时、中断永远不会发生。 因此它会导致总线错误。
如何解决 CAN 总线的这个问题?
谢谢、
Alex

