在我的应用中、我面临数据丢失。 因此我尝试使用7个报文对象创建 FIFO。
但数据仅在最低的对象中接收。 下面是我的代码
空 CAN_Config (空)
{
//为 CAN TX 和 RX 启用端口 E
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);//启用 Porte
GPIOPinConfigure (GPIO_PE4_CAN0RX);//为 CAN 接收功能配置 PE4
GPIOPinConfigure (GPIO_PE5_CAN0TX);//为 CAN 发送功能配置 PE5
GPIOPinTypeCAN (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);//启用 CAN 的引脚类型
SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
//初始化 CAN0
CANInit (CAN0_BASE);
IntEnable (INT_CAN0);
//启用 CAN 外设上的中断
CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
CANEnable (CAN0_BASE);
}
(小部分
void CAN_info (uint32_t 波特率、uint8_t samplingPoint)
{
//为 CAN 发送和接收分配 CAN 位时序结构值
// ToDo:当前的 bit_time_q 在所有 baudRates 中都是常数;需要对其进行验证。
如果(波特率= 1000)
{
GetBittime.ui32SyncPropPhase1Seg=15;
GetBittime.ui32Phase2Seg=4;
GetBittime.ui32SJW=3;
GetBittime.ui32QuantumPrescaler=4;
}
其他
{
// ToDo:不支持波特率;将其作为错误处理。
}
//设置为该 CAN 分配值
CANBitTimingSet (CAN0_BASE、GetBitTime);
//为接收数据分配 CAN 消息对象结构成员
sMsgObjectRx.ui32MsgIDMask = 0xFFFF;
//前5个消息对象设置了 MSG_OBJ_FIFO 来指示
//它们是 FIFO 的一部分。
sMsgObjectRx.ui32Flags =(MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | MSG_OBJ_EXDED_ID | MSG_OBJ_FIFO);
sMsgObjectRx.pui8MsgData = pui8MsgData;
sMsgObjectRx.ui32MsgLen = 8;
//前三个消息对象设置了 MSG_OBJ_FIFO 来指示
//它们是 FIFO 的一部分。
CANMessageSet (CAN0_BASE、2、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
CANMessageSet (CAN0_BASE、3、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
CANMessageSet (CAN0_BASE、4、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
CANMessageSet (CAN0_BASE、5、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
CANMessageSet (CAN0_BASE、6、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
//最后一个消息对象没有设置 MSG_OBJ_FIFO 来指示这一点
//这是最后一条消息。
sMsgObjectRx.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
CANMessageSet (CAN0_BASE、7、&sMsgObjectRx、MSG_OBJ_TYPE_RX);
}
空 CANIntHandler (空)
{
uint32_t ui32Status;
//读取 CAN 中断状态以查找中断原因
ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);
//如果原因是控制器状态中断,则获取状态
if (ui32Status = CAN_INT_INTID_STATUS)
{
//读取控制器状态
ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);
//设置错误标志
G_bErrFlag = 1;
}
//检查原因是否是我们正在使用的消息对象1
//发送消息。
否则、如果(ui32Status = 1)
{
//---- 发送中断--- //
//如果此条件为真,则发生 TX 中断
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
CANIntClear (CAN0_BASE、1);
G_ui32MsgCount_Tx++;
//清除错误标志
G_bErrFlag = 0;
}
//------ 接收中断--- //
//如果此条件为真,则发生 RX 中断
//报文对象2、报文 RX 完成。
否则 if (ui32Status = 2)
{
G_ui32MsgCount_Rx++;
CANMessageGet (CAN0_BASE、2、&sMsgObjectRx、1);
//清除错误标志
G_bErrFlag = 0;
}
否则 if (ui32Status = 3)
{
G_ui32MsgCount3_Rx++;
CANMessageGet (CAN0_BASE、3、&sMsgObjectRx、1);
//清除错误标志
G_bErrFlag = 0;
}
否则 if (ui32Status = 4)
{
G_ui32MsgCount4_Rx++;
CANMessageGet (CAN0_BASE、4、&sMsgObjectRx、1);
//清除错误标志
G_bErrFlag = 0;
}
否则 if (ui32Status = 5)
{
G_ui32MsgCount5_Rx++;
CANMessageGet (CAN0_BASE、5、&sMsgObjectRx、1);
//清除错误标志
G_bErrFlag = 0;
}
否则 if (ui32Status = 6)
{
G_ui32MsgCount6_Rx++;
CANMessageGet (CAN0_BASE、6、&sMsgObjectRx、1);
//清除错误标志
G_bErrFlag = 0;
}
否则 if (ui32Status = 7)
{
G_ui32MsgCount7_Rx++;
CANMessageGet (CAN0_BASE、7、&sMsgObjectRx、1);
//清除错误标志
G_bErrFlag = 0;
}
}