完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
网上关于双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.总结 有问题欢迎多讨论。希望大家解决了问题的都能把帖子结一下,为自己,也为大家做点贡献。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
597浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 16:45 , Processed in 1.196135 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号