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

      出坑帖:https://blog.csdn.net/huan447882949/article/details/73478228

       

對於雙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 中斷,如下帖子描述:

 問題帖:http://www.openedv.com/forum.php?mod=viewthread&tid=94488&extra=

出坑帖: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.總結

  有問題歡迎多討論。希望大家解決了問題的都能把帖子結一下,爲自己,也爲大家做點貢獻。

 

 

 

發佈了15 篇原創文章 · 獲贊 9 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章