CAN口调试
STM32有2个3级深度的接收缓冲区:FIFO0和FIFO1,每个FIFO都可以存放3个完整的报文,它们完全由硬件来管理。如果是来自FIFO0的接收中断,则用CAN1_RX0_IRQn中断来处理。如果是来自FIFO1的接收中断,则用CAN1_RX1_IRQn中断来处理。在CAN的初始化配置过程中,用CAN_FilterFIFOAssignment来选择要使用FIFO。
CAN代码初始化流程:
- 使能CAN时钟和对应的GPIO时钟,配置TX和RX的GPIO口
- 配置CAN相关参数 定义了一个CAN_InitTypeDef结构体CAN_InitStructure,用于配置CAN的工作模式和速率。通过CAN_Init函数对CAN进行初始化
- 配置CAN的过滤器,可以根据ID屏蔽数据
- 使能CAN的FIFO接收中断
- 初始化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