STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1,每个FIFO都可以存放3个完整的报文,它们完全由硬件来管理。如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理。在CAN的初始化配置过程中,用CAN_FilterFIFOAssignment来选择要使用FIFO。

CAN代码初始化流程:

  1. 使能CAN时钟和对应的GPIO时钟,配置TX和RX的GPIO口
  2. 配置CAN相关参数 定义了一个CAN_InitTypeDef结构体CAN_InitStructure,用于配置CAN的工作模式和速率。通过CAN_Init函数对CAN进行初始化
  3. 配置CAN的过滤器,可以根据ID屏蔽数据
  4. 使能CAN的FIFO接收中断
  5. 初始化NVIC外设,编写CAN中断处理函数 https://shequ.stmicroelectronics.cn/thread-640528-1-1.html https://shequ.stmicroelectronics.cn/thread-635480-1-1.html

https://zhuanlan.zhihu.com/p/144051429

https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252

CAN模式

共有四种模式: CAN_MODE_LOOPBACK自发自收,无法接收外部CAN信号,及触发不了接收中断。

#define CAN_MODE_NORMAL (0x00000000U) /*!< Normal mode */

#define CAN_MODE_LOOPBACK ((uint32_t)CAN_BTR_LBKM) /*!< Loopback mode */

#define CAN_MODE_SILENT ((uint32_t)CAN_BTR_SILM) /*!< Silent mode */

#define CAN_MODE_SILENT_LOOPBACK ((uint32_t)(CAN_BTR_LBKM | CAN_BTR_SILM))

/*!< Loopback combined with silent mode */

在CAN通信的正常模式(Nomal)中,RX收到一个正确的报文,TX脚会返回一个ACK信号,告诉发送端此报文发送成功,以维持正常通信

因为如果CAN通信配置为静默模式,RX脚会正常接收数据,TX脚不对外发送数据,那么当总线中仅有发送端和静默设备时,因为发送端不会收到ACK信号,会认为发送失败,于是通信会不成功

所以, 使用静默模式前提, 要确保CAN总线中至少有一个其他的正常设备能够返回ACK信号.

当我们配置为静默模式时,CAN过滤器会正常工作,

硬件上可以把CAN收发器的TX脚和MCU对应管脚断开仍能正常工作, 软件上配置TX脚为输入上拉模式或者映射到空的脚上都可以正常工作

https://blog.csdn.net/weixin_43873656/article/details/144188005