Part Number:TMS320F280039C
使用两个CAN邮箱做接收,采用20ms轮询的方式做接收解析,遇到CAN_NDAT_21寄存器问题
下面是我的CAN邮箱配置:
CAN_setupMessageObject(CANA_BASE, 1, 0x15555555, CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 8);
//accept if ((incomeID & IdMsk) == (objID & IdMsk)) : 0x045XF1XX
CAN_setupMessageObject(CANA_BASE, 2, 0x0450F100,
CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0x11101100,
CAN_MSG_OBJ_USE_ID_FILTER, 8);
//accept 0x049XF1XX
CAN_setupMessageObject(CANA_BASE, 3, 0x0490F100,
CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0x11101100,
CAN_MSG_OBJ_USE_ID_FILTER, 8);
这里是我的轮询的接收函数:
void t20ms_Task(void)
{
if((CanaRegs.CAN_NDAT_21 == 2)&&(((CanaRegs.CAN_IF2CMD.all) & CAN_IF2CMD_BUSY) != CAN_IF2CMD_BUSY))
{
CAN_readMessageWithID(CANA_BASE, 2, &CanRxData.FrameType, &CanRxData.DCCanId, CanRxData.CanData.data);
//Parse CAN data
}
第一个问题:请问CAN_NDAT_21的作用是什么?
第二个问题:只配置邮箱2时,20ms的任务是可以进行CAN数据接收解析的,但是如果配置了邮箱2、3,就无法正常工作
期待社区大佬解惑!
klare G:
根据实验修改了邮箱配置:
CAN_setupMessageObject(CANA_BASE, 2, 0x0450F100, CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0xFFF0FF00, CAN_MSG_OBJ_USE_ID_FILTER | CAN_MSG_OBJ_USE_EXT_FILTER | CAN_MSG_OBJ_USE_DIR_FILTER, 8);
测试总结出CAN_NDAT_21寄存器里边每一位代表一个邮箱数据更新,使用CAN_readMessageWithID函数读取对应邮箱后寄存器内相应的位会被清零
第二个问题会出现是因为我的MASK设置错误导致
综上,所有问题已解决,如果我的上诉理解有问题,请更正我
,
klare G:
有其他的轮询方式接收的指导,也请告知我
,
Yale Li:
你的理解是正确的