STM32F103學習筆記(6)——CAN通訊(下)—— 過濾器配置

liu_endong發表於2021-01-04

1. 前言

元旦嗨了幾天,今天回來補一下CAN的過濾器。

就使用而言,實際上CAN的過濾器非常簡單,只需要幾個簡單的引數配置,不需要學習什麼郵箱FIFO、還回什麼靜默什麼的。

我一直認為,所有的東西想要入門最簡單的是找個例子拿來用,你把這個例子將清楚了,我會套著用了,然後再去學習基礎知識就會知道自己在學什麼,要不然我TMD學了兩天各種亂七八糟的定義過兩天又全都忘光了,實踐的時候發現還入不了門,學了等於白學,又讓人對這個想學的東西產生厭惡感。

可能是網上的教程可能都不太適合我,所以在使用參考資料寫程式碼時候非常困難,在這裡寫下我的學習過程。

2. 怎麼用

(1)在傳送函式設定

設定標準識別符號和擴充套件識別符號,同時在下面一行設定使用標準幀或擴充套件幀

(2)在CAN初始化裡面配置

這個過濾器ID並非標準幀ID,而是加了很多東西的ID,後面章節詳解

這個過濾器的配置要看這裡

總結之後,重要的是下面這個表

ID對應CAN_FilterIdHigh和CAN_FilterIdLow,ID高11位對應傳送方設定的標準識別符號(TxMessage.StdId=0x01),本次只講標準格式的配置,一切從簡,所以不講擴充套件幀相關的配置,後續請各位讀者自行研究或等我後期修改

遮蔽位對應CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow


如果要使用掩碼模式,就是CAN_FilterMode=CAN_FilterMode_IdMask,則規則為:

識別符號表示想要接收的ID幀,如傳送識別符號為0x01,則過濾器ID前11位應為0000 0000 001。

因為本次講解標準模式,無需配置擴充套件幀,全為0即可。IDE因為使用標準模式配置為0。RTR因為傳輸資料幀也配置為0。

綜上,總的ID暫存器的值應該為:0000 0000 0010 0000 0000 0000 0000 0000

上述最終的ID值,綠色為CAN_FilterIdHigh的值0x0020,紅色為CAN_FilterIdLow的值0x0000,注意這裡的字元必須是4個字,不能是0x20,我試過不行,具體原因以後再看,我們們今天先入門哈哈。

如果要接收和這個一模一樣的資料幀,則直接配置CAN_FilterMaskId為1111 1111 1111 1111 1111 1111 1111 1111,意思是接收所有的位都要和ID值的所有位相等

轉換16進製為CAN_FilterMaskIdHigh值是FFFF,CAN_FilterMaskIdLow是FFFF


綜上,我們傳送方配置是

    TxMessage.StdId=0x01;			// 標準識別符號 0-7ff(1111 111)
    TxMessage.ExtId=0x00;			// 設定擴充套件標示符 0-1FFFFFFF
    TxMessage.IDE=CAN_Id_Standard; // 標準幀
    TxMessage.RTR=CAN_RTR_Data;		 // 資料幀

接收方的過濾器配置是

    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0020;32位ID
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;//32位MASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;

 

 

以上。

寫到這裡發現,入門需要使用的東西都講完了。。

至於郵箱、掛號什麼的的基本都由硬體完成,不需要什麼配置了,溢位什麼的後面再看看吧。

相關文章