天天看點

stm32之can總線過濾器研究

stm32的can總線的配置如下:

can_initstructure.can_ttcm=disable;//禁止時間觸發通信模式

can_initstructure.can_abom=disable;

can_initstructure.can_awum=disable;

can_initstructure.can_nart=disable;//can封包隻被發送1次,不管發送的結果如何(成功、出錯或仲裁丢失) 

can_initstructure.can_rflm=disable;

can_initstructure.can_txfp=disable;

can_initstructure.can_mode=can_mode_normal;

//can_mode_loopback

//can_mode_normal

can_initstructure.can_sjw=can_sjw_1tq;

can_initstructure.can_bs1=can_bs1_5tq;//1--16

can_initstructure.can_bs2=can_bs2_2tq;//1--8

can_initstructure.can_prescaler=2;

      can_init(&can_initstructure);

       /* can filter init

*/

can_filterinitstructure.can_filternumber=0;//選擇過濾器0

can_filterinitstructure.can_filtermode=can_filtermode_idmask;//指定過濾器被設定為辨別符屏蔽模式

can_filterinitstructure.can_filterscale=can_filterscale_32bit;//給出過濾器位寬為32位

下面根據設定的參數不同來決定can總線can總線的配置情況:

1、對擴充資料幀進行過濾:(隻接收擴充資料幀)

can_filterinitstructure.can_filteridhigh   =

(((u32)slave_id<<3)&0xffff0000)>>16;

can_filterinitstructure.can_filteridlow   =

(((u32)slave_id<<3)|can_id_ext|can_rtr_data)&0xffff;

can_filterinitstructure.can_filtermaskidhigh  =

0xffff;

can_filterinitstructure.can_filtermaskidlow   =

(注:标準幀資料幀、标準遠端幀和擴充遠端幀均被過濾)

2、對擴充遠端幀過濾:(隻接收擴充遠端幀)

(((u32)slave_id<<3)|can_id_ext|can_rtr_remote)&0xffff;

can_filterinitstructure.can_filtermaskidlow   = 0xffff;

3、對标準遠端幀過濾:(隻接收标準遠端幀)

(((u32)slave_id<<21)&0xffff0000)>>16;

(((u32)slave_id<<21)|can_id_std|can_rtr_remote)&0xffff;

4、對标準資料幀過濾:(隻接收标準資料幀)

(((u32)slave_id<<21)|can_id_std|can_rtr_data)&0xffff;

5、對擴充幀進行過濾:(擴充幀不會被過濾掉)

(((u32)slave_id<<3)|can_id_ext)&0xffff;

can_filterinitstructure.can_filtermaskidlow   = 0xfffc;

6、對标準幀進行過濾:(标準幀不會被過濾掉)

(((u32)slave_id<<21)|can_id_std)&0xffff;

注:slave_id為要過濾的id号。