FlexCAN初始化注意事项
-
SDK中FlexCAN初始化注意事项:
如果采用中断方式收发,注册回调函数FLEXCAN_DRV_InstallEventCallback和FLEXCAN_DRV_InstallErrorCallback,以及mailbox或fifo,滤波器的初始化需要放在启动接收函数之前
例如,以下为不太合理的邮箱初始化程序:/* Config rx messages mailbox */ for (index = 0; index < Appl_Can_NodeRxMsgCount[canNodeIndex]; index++) { /* Config rx buffer */ status = CAN_ConfigRxBuff(&can_pal_instance, index, &Appl_Can_StdIdBuffCfg, (uint32_t)Appl_Can_NodeRxMsgPtr[canNodeIndex][index].id); /* start to receive message */ status = CAN_Receive(&can_pal_instance, index, (can_message_t *)&Appl_Can_NodeRxMsgPtr[canNodeIndex][index]); }
应更改为:
/* Config rx messages mailbox */ for (index = 0; index < Appl_Can_NodeRxMsgCount[canNodeIndex]; index++) { /* Config rx buffer */ status = CAN_ConfigRxBuff(&can_pal_instance, index, &Appl_Can_StdIdBuffCfg, (uint32_t)Appl_Can_NodeRxMsgPtr[canNodeIndex][index].id); } for (index = 0; index < Appl_Can_NodeRxMsgCount[canNodeIndex]; index++) { /* start to receive message */ status = CAN_Receive(&can_pal_instance, index, (can_message_t *)&Appl_Can_NodeRxMsgPtr[canNodeIndex][index]); }
-
楼主有CAN中断接收的demo吗?
-
-
Y yt0069 在 中 引用了 这个主题
-
G ganyongchao 在 中 引用了 这个主题
-
配置顺序:
-
先配置所有需要配置的邮箱的独立掩码(如果需要):
FLEXCAN_DRV_SetRxMaskType(instance, FLEXCAN_RX_MASK_INDIVIDUAL);
FLEXCAN_DRV_SetRxIndividualMask(); -
再配置所有需要配置的邮箱Mailbox
FLEXCAN_DRV_ConfigRxMb(); -
安装中断回调函数
FLEXCAN_DRV_InstallEventCallback();
FLEXCAN_DRV_InstallErrorCallback(); -
最后启动接收(使能邮箱中断)
FLEXCAN_DRV_Receive();
示例:
/* Set the individual mask type */ FLEXCAN_DRV_SetRxMaskType(CAN_INST, FLEXCAN_RX_MASK_INDIVIDUAL); /* Set standard individual mask, bit 0-11 Optional, this example STD_ID 0x700U - 0x7FFU will be receive */ FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_STD, RX_STD_MAILBOX, 0xF00U); /* Set extended individual mask, bit 0-28 Optional, this example EXD_ID 0x18C00100U - 0x18C001FFU will be receive */ FLEXCAN_DRV_SetRxIndividualMask(CAN_INST, FLEXCAN_MSG_ID_EXT, RX_EXT_MAILBOX, 0x1FFFFF00U); /* After configure all individual masks, then congigure rx mailbox */ status |= FLEXCAN_DRV_ConfigRxMb(CAN_INST, RX_STD_MAILBOX, &rxMbStdInfo, RX_STD_MSG_ID); status |= FLEXCAN_DRV_ConfigRxMb(CAN_INST, RX_EXT_MAILBOX, &rxMbExtInfo, RX_EXTMSG_ID); /* Install rx callback */ FLEXCAN_DRV_InstallEventCallback(CAN_INST, DRV_CAN_RxEventCall, NULL); FLEXCAN_DRV_InstallErrorCallback(CAN_INST, DRV_CAN_ErrorCall, NULL); /* Start receiving data in RX_STD/EXT_MAILBOX. */ status |= FLEXCAN_DRV_Receive(CAN_INST, RX_STD_MAILBOX, &rxStdMsg); status |= FLEXCAN_DRV_Receive(CAN_INST, RX_EXT_MAILBOX, &rxExtMsg);
-
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...