STM32F105双CAN双FIFO通讯心得体会

网上关于双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时,就不能正常收发数据,如下帖子描述:

     问题帖: https://bbs.csdn.net/topics/392074227

      出坑帖:STM CAN filter配置纪要_can_filterinitstructure.banknumber-CSDN博客

       

对于双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。 

2)CAN1正常,但是无法进入CAN2 中断,如下帖子描述:

 问题帖:F405RG用cube配置can2一直进不了接收中断但能发(can1也配置了能发能收)!-OpenEdv-开源电子网

出坑帖:http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=607712&highlight=can+cube

里面说的很详细,就不多说。

3)CAN1 正常,但是CAN1发送数据,CAN2在接收数据时,会出现接收硬件错误

 问题帖:http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=618832

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

hcan1.pRxMsg=&RxMsg;

hcan2.pRxMsg=&RxMsg;

实际应为:

hcan1.pRxMsg=&RxMsg;

hcan2.pRx1Msg=&RxMsg;

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

4.总结

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

STM32F105双CAN双FIFO通讯心得体会_两路can通信用同一个fifo行不行-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F105系列芯片上配置CAN2的过滤器,可以按照以下步骤进行: 1. 首先,设置CAN2的过滤器组起始位置为15,可以使用函数`CAN_SlaveStartBank(15)`来实现。这意味着过滤器的编号从15开始。 2. 然后,初始化CAN过滤器结构体`CAN_FilterInitStructure`,并设置过滤器的相关参数。具体的配置如下: - `CAN_FilterInitStructure.CAN_FilterNumber`:设置过滤器的编号为15。 - `CAN_FilterInitStructure.CAN_FilterMode`:设置过滤器的模式为ID掩码模式。 - `CAN_FilterInitStructure.CAN_FilterScale`:设置过滤器的位宽为32位。 - `CAN_FilterInitStructure.CAN_FilterIdHigh`:设置接收方ID为0x11,发送方ID为0x14。 - `CAN_FilterInitStructure.CAN_FilterIdLow`:设置接收方ID的低16位为0x0000。 - `CAN_FilterInitStructure.CAN_FilterMaskIdHigh`:设置ID掩码的高16位为0xffff,表示接收所有的ID。 - `CAN_FilterInitStructure.CAN_FilterMaskIdLow`:设置ID掩码的低16位为0x0000,表示接收所有的ID。 - `CAN_FilterInitStructure.CAN_FilterFIFOAssignment`:设置过滤器的FIFO分配为FIFO0。 - `CAN_FilterInitStructure.CAN_FilterActivation`:使能过滤器。 3. 最后,调用函数`CAN_FilterInit(&CAN_FilterInitStructure)`来初始化CAN过滤器。 如果需要设置多个过滤器,可以按照相同的步骤进行配置,只需将过滤器的编号递增,并设置相应的ID和掩码。 请注意,以上配置仅为示例,具体的配置参数需要根据实际需求和通信协议进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值