一、背景
在實(shí)際應(yīng)用中,CAN總線上的數(shù)據(jù),對(duì)于某些CAN節(jié)點(diǎn)來(lái)說(shuō),可能需要的數(shù)據(jù)并不多,希望收到的數(shù)據(jù)是自己關(guān)心的即可,不必要的數(shù)據(jù)過(guò)濾同時(shí)也可以減少中斷的次數(shù),減輕CPU負(fù)荷,也可以節(jié)省數(shù)據(jù)記錄設(shè)備中的存儲(chǔ)空間。
從上篇文章《[玩轉(zhuǎn)先楫CANFD外設(shè)系列之一]輕松搞起CANFD》中可知道,先楫的CANFD包括了CAN和MCAN。其中HPM6700/HPM6400/HPM6300系列產(chǎn)品用的是CAN,而HPM6200系列使用的是MCAN。本文統(tǒng)稱HPM6700/HPM6400/HPM6300系列產(chǎn)品的CANFD為CAN。
本文闡述CAN外設(shè),MCAN外設(shè)不在本文闡述范圍內(nèi)。
CAN有16組獨(dú)立的篩選器,并沒(méi)有所謂的列表和掩碼模式的過(guò)濾器組。每個(gè)篩選器都是獨(dú)立,只要任意一組的篩濾器器滿足條件則能被接收。配置也極其簡(jiǎn)單,只需要配置ID CODE和對(duì)應(yīng)的匹配MASK位等寄存器則照樣可以實(shí)現(xiàn)所謂的列表和掩碼方式。
二、實(shí)現(xiàn)流程
對(duì)于篩選器來(lái)說(shuō),CAN可操作的寄存器很少,只需要三個(gè)寄存器即可實(shí)現(xiàn)篩選ID的效果。分別對(duì)應(yīng)的名稱是ACF_XXX后綴。
(一)ID篩選
寄存器上主要操作ACFCTRL和ACF的CODE_MASK位(一共有29位,滿足標(biāo)準(zhǔn)幀和擴(kuò)展幀)。
接收匹配MASK的位基于IDCODE來(lái)進(jìn)行匹配。選擇哪個(gè)篩選器通過(guò)ACFCTRL寄存器的ACFADR配置,一共4bit,也就是16個(gè)篩選器。
在can_set_filter這個(gè)API中,對(duì)于篩選器的選擇,可以這么參考。
由于IDCODE和MASK共用一個(gè)寄存器也就是ACF的CODE_MASK,在配置的時(shí)候需要選擇的是IDCODE還是MASK。這里需要用到ACFCTRL的SELMASK位。然后依次進(jìn)行對(duì)CODE_MASK賦值。
需要注意的是:
在CAN外設(shè)當(dāng)中,當(dāng)MASK對(duì)應(yīng)的位為0的時(shí)候,必須于IDCODE對(duì)應(yīng)的位進(jìn)行匹配比較,當(dāng)為1的時(shí)候則忽視。
同樣在can_set_filter這個(gè)API也是這么操作。
需要注意的是:IDCODE和MASK的時(shí)候,必須是在CAN復(fù)位模式下才能設(shè)置。
在can的sample當(dāng)中,注釋也特別提醒。
(二)標(biāo)準(zhǔn)幀和擴(kuò)展幀篩選
每個(gè)篩選器還可以對(duì)標(biāo)準(zhǔn)幀和擴(kuò)展幀進(jìn)行篩選,主要是通過(guò)ACF寄存器的AIDEE和AIDE位進(jìn)行配置。
這里描述的大概可以這樣理解:
AIDEE=0AIDE=x(不關(guān)心)接收標(biāo)準(zhǔn)幀和擴(kuò)展幀
AIDEE=1 AIDE=0 只接收標(biāo)準(zhǔn)幀
AIDEE=1 AIDE=1 只接收擴(kuò)展幀
在can_set_filter這個(gè)API中,也是通過(guò)判斷can_filter_id_mode_t枚舉進(jìn)行判斷篩選。
(三)篩選器組的啟用和禁用
在手冊(cè)中,每個(gè)篩選器都可以單獨(dú)啟用和禁用。主要通過(guò)ACF_EN配置。
(四)實(shí)現(xiàn)列表和掩碼模式效果
從上面的配置可知道:
列表模式:
IDCODE配置為需要接收的ID號(hào),MASK配置為0,那么該篩選器就可以實(shí)現(xiàn)只接收一個(gè)ID的列表方式,比如:
標(biāo)準(zhǔn)幀下,IDCODE=0x21,MASK=0(全部比較)。那么該篩選器只能篩選ID為0x21這個(gè)ID。
掩碼模式:
DCODE配置為需要接收的ID號(hào),MASK配置需要比較的位,那么該篩選器就可以實(shí)現(xiàn)只接收一個(gè)ID的掩碼方式,比如:
標(biāo)準(zhǔn)幀下,IDCODE=0x100,MASK=0x700。需要匹配的位是第十位到第八位,其他的位都不做關(guān)心,那么接收的ID范圍就是0x100~0x1ff
三、代碼實(shí)現(xiàn)
在hpm_sdk的can這個(gè)sample當(dāng)中,有個(gè)測(cè)試項(xiàng)目就是篩選器測(cè)試,對(duì)應(yīng)的是board_can_filter_test這個(gè)函數(shù)。這里使用的是內(nèi)部環(huán)回模式,可以不用接外置PHY即可測(cè)試。
在函數(shù)的開(kāi)頭注釋就說(shuō)到兩個(gè)注意點(diǎn),開(kāi)發(fā)者在開(kāi)發(fā)的時(shí)候需要注意。
1、CAN的篩選器只能在CAN復(fù)位模式下配置,建議使用can_init這個(gè)API,通過(guò)傳參代入篩選器參數(shù),can_init這個(gè)API自動(dòng)處理。否則需要需要調(diào)用can_set_filter這個(gè)API,則需要先調(diào)用can_reset進(jìn)行復(fù)位。這時(shí)候也同樣需要重新設(shè)置下波特率。
2、can_filter_config_t結(jié)構(gòu)體的mask成員,1代表在IDCODE對(duì)應(yīng)的位忽視,0代表該位將于IDCODE比較匹配。
這個(gè)測(cè)試同樣實(shí)現(xiàn)了類(lèi)似所謂掩碼模式和列表模式。
掩碼模式:
log可以看到:
列表模式:
在sample當(dāng)中,16個(gè)篩選器的mask都設(shè)置為0,也就是必須與idcode的所有位匹配才接收。
同樣也是發(fā)送ID為0~2048的2048個(gè)消息幀,應(yīng)該只能收到16個(gè)ID幀。分別是以下
四、總結(jié)
1、HPM6700/HPM6400/HPM6300系列產(chǎn)品的CAN長(zhǎng)達(dá)16個(gè)過(guò)濾組,如果需要更多的過(guò)濾組,可以選擇HPM6200等是MCAN外設(shè),比如hpm6200的MCAN,標(biāo)準(zhǔn)幀可以達(dá)到128個(gè)過(guò)濾組。
2、HPM6700/HPM6400/HPM6300系列產(chǎn)品的CAN過(guò)濾組設(shè)置相對(duì)簡(jiǎn)單易用。
3、HPM6700/HPM6400/HPM6300系列產(chǎn)品的CAN過(guò)濾組的IDCODE和MASK只能在CAN復(fù)位模式下配置。建議每次配置過(guò)濾組直接調(diào)用can_init這個(gè)API。
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
CAN
+關(guān)注
關(guān)注
57文章
2744瀏覽量
463614 -
總線
+關(guān)注
關(guān)注
10文章
2878瀏覽量
88051 -
過(guò)濾器
+關(guān)注
關(guān)注
1文章
428瀏覽量
19593
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論