单片机学习小组
直播中

李林

7年用户 1150经验值
私信 关注

如何实现双CAN通信?

如何实现双CAN通信

回帖(1)

陈芸

2022-2-28 13:51:39
网上关于双CAN通信的例子很少,大多都是单CAN通信,即使有,也是关于用一个FIFO的通讯,过程中遇到很多问题,在手头只有一个很小的开发板的情况下,费劲周折,终于解决了问题,不多说,直接把入坑与出坑的事情说一下吧。

1. 工程制作

关于双CAN基础框架,使用CubeMX自己搭建即可:









配置波特率为500K,CAN1的接收中断对应RX0,CAN2的接收中断对应RX1这是重要的第一点

2.代码补充

点击生产代码,并在can.c文件中/* USER CODE BEGIN 1 */和/* USER CODE END 1 */之间增加两个函数,分别为:HAL_CAN1_Config(void)和HAL_CAN1_Config(void),并在里面做Filter初始化。代码参照如下:





在Main函数中while(1)之前调用一下完成Filter的初始化调用,并开启CAN接收中断启动函数:

HAL_CAN_Receive_IT(&hcan1, CAN_Filter_FIFO0)

HAL_CAN_Receive_IT(&hcan2, CAN_Filter_FIFO1)





在main.c的/* USER CODE BEGIN 4 */和/* USER CODE END 4 */之重写接收回调函数HAL_CAN_Receive_IT(&hcan, CAN_FIFO0):



3.  遇到的坑以及出坑记录

  1)CAN1和CAN2 共用FIFO时收发正常,但同时用FIFO0和FIFO1时,就不能正常收发数据
对于双CAN STM32芯片,如果sFilterConfig.BankNumber=0,则所有过滤器组分配给CAN2使用,CAN1没得用。若sFilterConfig.BankNumber=27,则所有过滤器组分配给CAN1使用,CAN2就没得用了。

具体结合到本案例,客户代码里对CAN1、CAN2的过滤器进行配置时,当前过滤器组始终为0,即sFilterConfig.FilterNumber=0,而分配给CAN2的过滤器组又是从BANK 14开始的,即sFilterConfig.BankNumber = 14。

这样配置的话,CAN1接收,CAN2发的确不会有问题。反过来,CAN1发送,CAN2接收就会有问题。因为他一方面只是将Filter BANK 14到27分配给CAN2,同时又选择Filter BANK 0来配置CAN2的接收滤波器。所以要想CAN1发送,CAN2接收正常,其它参数不动的话,为CAN2配置滤波器时选择的过滤器组【Filter BANK】至少为14才可以,即sFilterConfig.FilterNumber=14。

这个的出坑还是自己出的:FIFO0和FIFO1对应的RXMSG是不一样的,因为没有注意到,结果写成了一样,

hcan1.pRxMsg=&RxMsg;

hcan2.pRxMsg=&RxMsg;

实际应为:

hcan1.pRxMsg=&RxMsg;

hcan2.pRx1Msg=&RxMsg;

也就是问题帖中二楼说的,没有定义pRx1Msg,造成了pRxMsg是一个空指针,故报硬件错误。

4.总结

  有问题欢迎多讨论。希望大家解决了问题的都能把帖子结一下,为自己,也为大家做点贡献。





举报

更多回帖

发帖
×
20
完善资料,
赚取积分