STM32的CAN总线的接收双FIFO的使用问题
通过cubemx生成的HAL库,CAN模块配置如下:
上面代码注释掉了CAN_FIFO0的那部分,可以正常接收到数据(进入CAN_FIFO0接收中断);反之,注释掉CAN_FIFO1的那部分也是可以正常接收到数据(进入CAN_FIFO1接收中断)。但如果两个都配置的话(不注释掉),一直只能进入CAN_FIFO0接收中断。我想要交替触发的效果,可以跟USB双缓冲一样吗?


CAN_HandleTypeDef hcan;
CanTxMsgTypeDef TxMessage;
CanRxMsgTypeDef RxMessage;
/* CAN init function */
void MX_CAN_Init(void)
{
hcan.Instance = CAN;
hcan.pTxMsg = &TxMessage;
hcan.pRxMsg = &RxMessage;
//250K
hcan.Init.Prescaler = 12;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SJW = CAN_SJW_1TQ;
hcan.Init.BS1 = CAN_BS1_7TQ;
hcan.Init.BS2 = CAN_BS2_8TQ;
hcan.Init.TTCM = DISABLE;
hcan.Init.ABOM = ENABLE;
hcan.Init.AWUM = DISABLE;
hcan.Init.NART = DISABLE;
hcan.Init.RFLM = DISABLE;
hcan.Init.TXFP = DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
CAN_FilterConfTypeDef sFilterConfig;
// /*##-2- Configure the CAN Filter ###########################################*/
// sFilterConfig.FilterNumber = 0;
// sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
// sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
// sFilterConfig.FilterIdHigh = 0x0000;
// sFilterConfig.FilterIdLow = 0x0000;
// sFilterConfig.FilterMaskIdHigh = 0x0000;
// sFilterConfig.FilterMaskIdLow = 0x0000;
// sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
// sFilterConfig.FilterActivation = ENABLE;
// sFilterConfig.BankNumber = 14;
// if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
// {
// /* Filter configuration Error */
// Error_Handler();
// }
// HAL_CAN_Receive_IT(&hcan, CAN_FIFO0); //使能CAN接收中断
/*##-2- Configure the CAN Filter ###########################################*/
sFilterConfig.FilterNumber = 1;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO1;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
Error_Handler();
}
HAL_CAN_Receive_IT(&hcan, CAN_FIFO1); //使能CAN接收中断
}上面代码注释掉了CAN_FIFO0的那部分,可以正常接收到数据(进入CAN_FIFO0接收中断);反之,注释掉CAN_FIFO1的那部分也是可以正常接收到数据(进入CAN_FIFO1接收中断)。但如果两个都配置的话(不注释掉),一直只能进入CAN_FIFO0接收中断。我想要交替触发的效果,可以跟USB双缓冲一样吗?


...全文
相关推荐
STM32F4双CAN收发程序 已经调试通过
本例程是STM32F4的一个双CAN收发程序,经过自己的调试现在已经完美运行,希望可以帮助到有需要的人。
23、CAN总线与UART中断驱动通信详解
本文详细解析了CAN总线与UART在嵌入式系统中的中断驱动通信机制。涵盖CAN过滤器配置、消息接收与发送、中断服务程序设计,以及UART初始化、中断处理和队列管理。通过FreeRTOS实现任务调度与数据队列传递,确保高可靠性与实时性。结合代码示例与流程图,深入探讨了ISR编写规范、消息结构设计及系统优化策略,适用于STM32平台的高效通信开发。
STM32的CAN现场总线实验心得-综合文档
STM32的CAN现场总线实验心得工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介首先通读手册中关于 CAN 的文档,必须精读。 STM32F10xxx 参考手册
STM32F429_CAN12.zip
STM32F4的CAN2接收调试很久,按照网络大神说的把CAN1时钟使能且过滤器设置成14并不能成功,后修改了一些其他配置才可以进入接收中断,亲测可进入中断,且数据正确
STM32的CAN-PROFIBUS协议转换器设计.pdf
STM32的CAN-PROFIBUS协议转换器设计.pdf


单片机/工控
