今天和大家分享一下CAN濾波器相關的內容,濾波器主要用來設置CAN的接收ID,當CAN總線上所掛接的節點較多,數據量較大的話,對單節點的接收判斷可能造成較大的壓力、占用較多的資源。為了解決這個問題,可以通過設置濾波器實現只接收特定ID。ST系列單片機的濾波器設置非常繞,很容易把自己繞暈了,下面以STM8為例和大家分享一下。
注意,此文需要看多遍。
前言
在CAN協議里,報文的標識符不代表節點的地址,而是跟報文的內容相關的。因此,發送者以廣播的形式把報文發送給所有的接收者。節點在接收報文時,根據標識符的值決定軟件是否需要該報文;如果需要,就拷貝到RAM里;如果不需要,報文就被丟棄且無需軟件的干預。為滿足這一需求,beCAN為應用程序提供了個可配置的、位寬可變的6個(0-5)過濾器組,用于只接收那些軟件需要的報文。硬件過濾的做法節省了CPU開銷,否則就必須由軟件進行過濾,從而占用一定的CPU資源。
濾波器設置
濾波器設置包括下面幾個寄存器:CAN濾波模式寄存器1 (CAN_FMR1)和CAN濾波模式寄存器2(CAN_FMR2)、CAN濾波配置寄存器1 (CAN_FCR1)、CAN濾波配置寄存器2 (CAN_FCR2)和CAN濾波配置寄存器3 (CAN_FCR3),CAN濾波組i寄存器x (CAN_FiRx) (i = 0 .. 5, x = 1 .. 8)。
濾波模式寄存器用于設置濾波器為標識符列表模式和掩碼模式,濾波配置寄存器用于開啟或關閉濾波器和濾波器的寬度設置,濾波組用于具體濾波設置。
6個可配置的位寬可變的過濾器組,通過FSCx0(x=1..6)和FSCx1(x=1..6)設置濾波寬度,
就32位濾波器設置進行解讀,CAN報文分為標準幀和擴展幀,標準幀ID11位,擴展幀29位,ID與濾波配置映射關系如上表所示,如濾波模式設置可知可以分為兩個ID或者一個ID+Mask。當需要過濾某一段ID時,使用ID+Mask模式,當過濾具體ID時直接使用ID模式即可。
如果我的擴展id是0x12345678 ;想只接收0x12xxxxxx的標識符號,該如何設置濾波器?
此處采用32位濾波器0進行濾波配置,因此FSC00 = 1;FSC01 = 1;FMH0 = 0;FML0 = 0;
擴展id為0x12345678 (0001,0010,0011,0100,0101,0110,0111,1000)
將擴展幀ID填入CAN幀ID格式中
RTR位我們設置為0表示數據幀,IDE位設置為1表示擴展ID,因為我們的ID是29位的,所以RTR = 0;IDE = 1;
在濾波器中填充如下:
如果要關心到具體的某一個比特位置;如果要過濾讓它只接收0x12xxxxxx的表示符號;
這時候要根據它實際在identify中的位置去修改idmask ; 前八個比特,對應的就是黃色和綠色的部分,所以其他的顏色,可以都填0表示不需要關心,則這里填入:1 1 1 1 ,1 x x x,我們這里填0xF8 ;
CAN_F0R1 = 0x91; CAN_F0R2 = 0x00; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00; CAN_F0R5 = 0x91; CAN_F0R6 = 0x00; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;
同理,對于下面的配置是只接收標準id= 0x321(0011,0010,0001)的ID(也是32位過濾器),因為也是數據幀,所以RTR = 0,標準的id,所以IDE = 0 ;所以填入到:
CAN_F0R1 = 0x64; CAN_F0R2 = 0x20; CAN_F0R3 = 0x00; CAN_F0R4 = 0x00; CAN_F0R5 = 0xFF; CAN_F0R6 = 0xE0; CAN_F0R7 = 0x00; CAN_F0R8 = 0x00;
設置過濾器0只接收ID為0x1828A0EF和0x1828A0EE的數據幀。(工作在標識符列表模式)
首先我們把這兩個ID寫成二進制:
0x1828A0EF:0001 1000 0010 1000 1010 0000 1110 1111 0x1828A0EE:0001 1000 0010 1000 1010 0000 1110 1110
然后我們將0x1828A0EF二進制的格數據組成如上圖mapping所示的格式
Can_fxr1:1100 0001 0xc1 Can _fxr2:0100 1001 0x49 //這里有個RTR位我們設置為0表示數據幀,IDE位設置為1表示擴展ID, Can _fxr3:0100 0001 0x41 Can _fxr4:1101 1110 0xDE
這時我們工作在標識符列表模式,identifier/Mask的寄存器相當于identifier使用。
再將0x1828A0EE二進制的格數據組成如上圖mapping所示的格式
Can _fxr5:1100 0001 0xc1 Can _fxr6:0100 1001 0x49 //這里有個RTR位我們設置為零表示數據幀,IDE設置為1表示擴展ID Can _fxr7:0100 0001 0x41 Can _fxr8:1101 1100 0xDC
16位配置模式也經常使用,如CAN網絡管理中往往涉及到網絡管理ID-0x4xx,因此需要利用ID和Mask模式,其余的采用ID模式,可以建立濾波器設置寄存器數組。
0x400網段,0x330,0x320 0x400: 展開 0000 0100 0000 0000,采用標準幀數據幀格式 0x330: 展開 0000 0011 0011 0000 0x320: 展開 0000 0011 0010 0000 CAN_F0R1: 100 0000 0 0x80 CAN_F0R2: 000 00 000 0x00 CAN_F0R3: 111 0000 0 0xE0 CAN_F0R4: 00000000 0x00 CAN_F0R5: 011 0011 0 0x66 CAN_F0R6: 00000000 0x00 CAN_F0R7: 011 0010 0 0x64 CAN_F0R8: 00000000 0x00 FSC00 = 0; FSC01 = 1; FMH0 = 1; FML0 = 0; FACT0 = 1;
在以往的項目中用過多個品牌的單片機,包括國產的,一直感覺ST的濾波器設置比較麻煩,每次用到的時候都要花較長時間去回憶。
來源:玩轉嵌入式
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
單片機
+關注
關注
6043文章
44620瀏覽量
638481 -
濾波器
+關注
關注
161文章
7860瀏覽量
178924 -
CAN
+關注
關注
57文章
2769瀏覽量
464370 -
STM8
+關注
關注
18文章
392瀏覽量
56941
發布評論請先 登錄
相關推薦
評論