一、背景
在實際應用中,CAN總線上的數據,對于某些CAN節點來說,可能需要的數據并不多,希望收到的數據是自己關心的即可,不必要的數據過濾同時也可以減少中斷的次數,減輕CPU負荷,也可以節省數據記錄設備中的存儲空間。
從上篇文章《[玩轉先楫CANFD外設系列之一]輕松搞起CANFD》中可知道,先楫的CANFD包括了CAN和MCAN。其中HPM6700/HPM6400/HPM6300系列產品用的是CAN,而HPM6200系列使用的是MCAN。本文統稱HPM6700/HPM6400/HPM6300系列產品的CANFD為CAN。
本文闡述CAN外設,MCAN外設不在本文闡述范圍內。
CAN有16組獨立的篩選器,并沒有所謂的列表和掩碼模式的過濾器組。每個篩選器都是獨立,只要任意一組的篩濾器器滿足條件則能被接收。配置也極其簡單,只需要配置ID CODE和對應的匹配MASK位等寄存器則照樣可以實現所謂的列表和掩碼方式。
二、實現流程
對于篩選器來說,CAN可操作的寄存器很少,只需要三個寄存器即可實現篩選ID的效果。分別對應的名稱是ACF_XXX后綴。
(一)ID篩選
寄存器上主要操作ACFCTRL和ACF的CODE_MASK位(一共有29位,滿足標準幀和擴展幀)。
接收匹配MASK的位基于IDCODE來進行匹配。選擇哪個篩選器通過ACFCTRL寄存器的ACFADR配置,一共4bit,也就是16個篩選器。
在can_set_filter這個API中,對于篩選器的選擇,可以這么參考。
由于IDCODE和MASK共用一個寄存器也就是ACF的CODE_MASK,在配置的時候需要選擇的是IDCODE還是MASK。這里需要用到ACFCTRL的SELMASK位。然后依次進行對CODE_MASK賦值。
需要注意的是:
在CAN外設當中,當MASK對應的位為0的時候,必須于IDCODE對應的位進行匹配比較,當為1的時候則忽視。
同樣在can_set_filter這個API也是這么操作。
需要注意的是:IDCODE和MASK的時候,必須是在CAN復位模式下才能設置。
在can的sample當中,注釋也特別提醒。
(二)標準幀和擴展幀篩選
每個篩選器還可以對標準幀和擴展幀進行篩選,主要是通過ACF寄存器的AIDEE和AIDE位進行配置。
這里描述的大概可以這樣理解:
AIDEE=0AIDE=x(不關心)接收標準幀和擴展幀
AIDEE=1 AIDE=0 只接收標準幀
AIDEE=1 AIDE=1 只接收擴展幀
在can_set_filter這個API中,也是通過判斷can_filter_id_mode_t枚舉進行判斷篩選。
(三)篩選器組的啟用和禁用
在手冊中,每個篩選器都可以單獨啟用和禁用。主要通過ACF_EN配置。
(四)實現列表和掩碼模式效果
從上面的配置可知道:
列表模式:
IDCODE配置為需要接收的ID號,MASK配置為0,那么該篩選器就可以實現只接收一個ID的列表方式,比如:
標準幀下,IDCODE=0x21,MASK=0(全部比較)。那么該篩選器只能篩選ID為0x21這個ID。
掩碼模式:
DCODE配置為需要接收的ID號,MASK配置需要比較的位,那么該篩選器就可以實現只接收一個ID的掩碼方式,比如:
標準幀下,IDCODE=0x100,MASK=0x700。需要匹配的位是第十位到第八位,其他的位都不做關心,那么接收的ID范圍就是0x100~0x1ff
三、代碼實現
在hpm_sdk的can這個sample當中,有個測試項目就是篩選器測試,對應的是board_can_filter_test這個函數。這里使用的是內部環回模式,可以不用接外置PHY即可測試。
在函數的開頭注釋就說到兩個注意點,開發者在開發的時候需要注意。
1、CAN的篩選器只能在CAN復位模式下配置,建議使用can_init這個API,通過傳參代入篩選器參數,can_init這個API自動處理。否則需要需要調用can_set_filter這個API,則需要先調用can_reset進行復位。這時候也同樣需要重新設置下波特率。
2、can_filter_config_t結構體的mask成員,1代表在IDCODE對應的位忽視,0代表該位將于IDCODE比較匹配。
這個測試同樣實現了類似所謂掩碼模式和列表模式。
掩碼模式:
log可以看到:
列表模式:
在sample當中,16個篩選器的mask都設置為0,也就是必須與idcode的所有位匹配才接收。
同樣也是發送ID為0~2048的2048個消息幀,應該只能收到16個ID幀。分別是以下
四、總結
1、HPM6700/HPM6400/HPM6300系列產品的CAN長達16個過濾組,如果需要更多的過濾組,可以選擇HPM6200等是MCAN外設,比如hpm6200的MCAN,標準幀可以達到128個過濾組。
2、HPM6700/HPM6400/HPM6300系列產品的CAN過濾組設置相對簡單易用。
3、HPM6700/HPM6400/HPM6300系列產品的CAN過濾組的IDCODE和MASK只能在CAN復位模式下配置。建議每次配置過濾組直接調用can_init這個API。
-
寄存器
+關注
關注
31文章
5343瀏覽量
120379 -
CAN
+關注
關注
57文章
2754瀏覽量
463721 -
總線
+關注
關注
10文章
2881瀏覽量
88090 -
過濾器
+關注
關注
1文章
429瀏覽量
19614
發布評論請先 登錄
相關推薦
英邁儀器在線過濾器:精準過濾,守護精密分析儀器
一文理解布隆過濾器和布谷鳥過濾器
![一文理解布隆<b class='flag-5'>過濾器</b>和布谷鳥<b class='flag-5'>過濾器</b>](https://file1.elecfans.com//web1/M00/F4/79/wKgaoWcsIZCAd4CBAAJAiCQrz_o550.png)
PLC工業過濾器數據采集物聯網解決方案
![PLC工業<b class='flag-5'>過濾器</b>數據采集物聯網解決方案](https://file1.elecfans.com//web2/M00/07/61/wKgZombw1ICAdV3OAAPVgT1WpFg394.png)
康謀分享 | ADTF過濾器全面解析:構建、配置與數據處理應用
![康謀分享 | ADTF<b class='flag-5'>過濾器</b>全面解析:構建、配置與數據處理應用](https://file1.elecfans.com/web2/M00/06/B4/wKgZombqL_yAb9kGAACWYtqYeQ4737.png)
STM32F105基于RT-Thread can過濾器怎么設置才能對擴展幀報文有效?
信號分析和過濾器的作用
RT-Thread驅動開發指南進階篇-動手驅動先楫未適配的外設LCD
![RT-Thread驅動開發指南進階篇-動手驅動<b class='flag-5'>先</b><b class='flag-5'>楫</b>未適配的<b class='flag-5'>外設</b>LCD](https://file1.elecfans.com/web2/M00/C1/D4/wKgaomXarr-AKhdfAAAcu6ZeWvU306.png)
康謀技術| 揭秘汽車功能的核心——深度解讀ADTF中的過濾器圖
![康謀技術| 揭秘汽車功能的核心——深度解讀ADTF中的<b class='flag-5'>過濾器</b>圖](https://file1.elecfans.com/web2/M00/C0/A0/wKgaomW-_vaAOwUGAABTyap0vPo997.png)
評論