您好:
我在使用TM4C129芯片的CAN外设的过程中出现一个问题
“发送标准帧数据帧之后无法再接收标准帧远程帧“
使用流程:
1、初始化CAN
2、接收数据,可以接收所有类型的数据
3、发送一个标准帧数据帧的CAN帧
4、再次接收数据,发现标准帧远程帧收不到,其他类型的CAN帧可以正常接收
5、仿真发现问题:
1、接收正常的数据是进入两次CAN接收中断,第一次表明有数据接收完成,第二次表明某一个消息对象接收完成可以读取数据
2、接收标准帧远程帧的时候只进入一次接收中断,表明有数据接收完成,不进入第二次中断,其他类型的帧正常
6、猜想,在查找问题的过程中发现,发送数据的时候使用CANMessageSet()函数,会写过滤寄存器,不知道是不是发数据的时候将标准帧远程帧过滤掉了
7、发数据与接收不到的数据对应关系:
发送标准帧数据帧之后无法接受标准帧远程帧
发送标准帧远程帧之后无法接受标准帧数据帧
发送扩展帧数据帧之后无法接受扩展帧远程帧
发送扩展帧远程帧之后无法接受扩展帧数据帧
8、 重启之后可以再次接收所有数据
9、产品已经入测试阶段,请尽快回复一下看看是什么地方的问题
附程序:
1、CAN初始化:
int InitCAN0(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_CAN0RX);
GPIOPinConfigure(GPIO_PA1_CAN0TX);
GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);
CANInit(CAN0_BASE);
if(g_sParameters.CANpara[0].CANmode == 1)
{
HWREG(CAN0_BASE + CAN_O_CTL) = HWREG(CAN0_BASE + CAN_O_CTL) | CAN_CTL_TEST;
HWREG(CAN0_BASE + CAN_O_TST) = HWREG(CAN0_BASE + CAN_O_TST) | CAN_TST_LBACK;
}
CANBitRateSet(CAN0_BASE, g_ui32SysClock, g_sParameters.CANpara[0].CANbandrates);
CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable(INT_CAN0);
CANEnable(CAN0_BASE);
// 使用os不需要在此处配置中断函数
// IntRegister(INT_CAN1,CAN1IntHandler);
g_sCAN0RxMessage.ui32MsgID = 0;
g_sCAN0RxMessage.ui32MsgIDMask = 0;
g_sCAN0RxMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
g_sCAN0RxMessage.ui32MsgLen = 8;
CANMessageSet(CAN0_BASE, 10, &g_sCAN0RxMessage, MSG_OBJ_TYPE_RX);
return 0;
}
2、发送函数
void Can0_Send(int objectID)
{
tCANMsgObject CAN0_t;
CANMessageBuff TxMsg;
if(!Can_Ring_out(&Can0TxRingBuff,&TxMsg))
{
return;
}
CAN0_t.ui32MsgID = TxMsg.MSG_ID;
CAN0_t.ui32MsgIDMask = 0;
CAN0_t.ui32Flags = 0;
CAN0_t.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
if((TxMsg.msg_len & 0x40) == 0x40)
CAN0_t.ui32Flags |= MSG_OBJ_REMOTE_FRAME;
if((TxMsg.msg_len & 0x80) == 0x80)
CAN0_t.ui32Flags |= MSG_OBJ_EXTENDED_ID;
CAN0_t.ui32MsgLen = TxMsg.msg_len & 0x0f;
CAN0_t.pui8MsgData = (uint8_t *)&(TxMsg.data);
if((TxMsg.msg_len & 0x40) == 0x40)
{
CANMessageSet(CAN0_BASE, objectID, &CAN0_t, MSG_OBJ_TYPE_TX_REMOTE);
CAN0_send_LED_set();
}
else
{
CANMessageSet(CAN0_BASE, objectID, &CAN0_t, MSG_OBJ_TYPE_TX);
CAN0_send_LED_set();
}
}
3、中断处理函数
void CAN0IntHandler(void)
{
uint32_t ui32Status;
uint8_t port = 0;
ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
if(ui32Status == CAN_INT_INTID_STATUS)
{
ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);
g_ui32ErrFlag[port] |= ui32Status;
}
else if(ui32Status == RXOBJECT)
{
CANIntClear(CAN0_BASE, RXOBJECT);
Can0_Recv(RXOBJECT);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 10)
{
CANIntClear(CAN0_BASE, 10);
Can0_Recv(10);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 11)
{
CANIntClear(CAN0_BASE, 11);
Can0_Recv(11);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 12)
{
CANIntClear(CAN0_BASE, 12);
Can0_Recv(12);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 2)
{
CANIntClear(CAN0_BASE, 2);
g_cont_num.CAN0_tx_byte_cnt++;
Can0_Send(2);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 3)
{
CANIntClear(CAN0_BASE, 3);
g_cont_num.CAN0_tx_byte_cnt++;
Can0_Send(3);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 4)
{
CANIntClear(CAN0_BASE, 4);
g_cont_num.CAN0_tx_byte_cnt++;
Can0_Send(4);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 5)
{
CANIntClear(CAN0_BASE, 5);
g_cont_num.CAN0_tx_byte_cnt++;
Can0_Send(5);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 6)
{
CANIntClear(CAN0_BASE, 6);
g_cont_num.CAN0_tx_byte_cnt++;
Can0_Send(6);
g_ui32ErrFlag[port] = 0;
}
else if(ui32Status == 7)
{
CANIntClear(CAN0_BASE, 7);
g_cont_num.CAN0_tx_byte_cnt++;
Can0_Send(7);
g_ui32ErrFlag[port] = 0;
}
else
{
CANIntClear(CAN0_BASE, ui32Status);
}
return;
}