1.在設定cantxmsg.stdid時注意需要將其右移一位,比如如下濾波器配置:
can_filterinitstructure.can_filternumber=0;
can_filterinitstructure.can_filtermode=can_filtermode_idmask;
can_filterinitstructure.can_filterscale=can_filterscale_32bit;
can_filterinitstructure.can_filteridhigh=0x7f20;
can_filterinitstructure.can_filteridlow=0x0000;
can_filterinitstructure.can_filtermaskidhigh=0xf0f0;
can_filterinitstructure.can_filtermaskidlow=0x0000;
can_filterinitstructure.can_filterfifoassignment=can_filter_fifo0;
can_filterinitstructure.can_filteractivation=enable;
can_filterinit(&can_filterinitstructure);
使用的是識別符號掩碼模式,接收到的訊息想要通過濾波器則stdid必須是0x7x2,這時我們可以設定 txmessage.stdid=0x7a2>>1,注意這裡必須要右移一位,因為標準識別符號的長度是11位,它占用的是can_tixr的高11位,所以在最後組合到can_tixr中時是會被左移21位的,如下:
if (txmessage->ide == can_id_standard)
乙個數如果被左移4的整數倍那麼其還可以保持數字不變,只是值擴大了,如0x7f在左移4位之後是0x7f0,7和f都不變只是最後增加了乙個0,左移8位則增加兩個0,但是如果是左移3位則變成0x3f8了,數字全變;因此我們這邊被左移 21位是會導致數字全變的,所以我們採取的措施就是在賦值的時候主動右移一位,這樣它左移21位就相當於原來是只左移20位了。
2.識別符號列表模式允許匹配多個id,你配置了幾個濾波器組就可以匹配幾個id,如下:
can_filterinitstructure.can_filternumber=0;
can_filterinitstructure.can_filtermode=can_filtermode_idlist;
can_filterinitstructure.can_filterscale=can_filterscale_32bit;
can_filterinitstructure.can_filteridhigh=0x7f20;
can_filterinitstructure.can_filteridlow=0x0000;
can_filterinitstructure.can_filtermaskidhigh=0x7f20;
can_filterinitstructure.can_filtermaskidlow=0x0000;
can_filterinitstructure.can_filterfifoassignment=can_filter_fifo0;
can_filterinitstructure.can_filteractivation=enable;
can_filterinit(&can_filterinitstructure);
can_filterinitstructure.can_filternumber=1;
can_filterinitstructure.can_filtermode=can_filtermode_idlist;
can_filterinitstructure.can_filterscale=can_filterscale_32bit;
can_filterinitstructure.can_filteridhigh=0x7c20;
can_filterinitstructure.can_filteridlow=0x0000;
can_filterinitstructure.can_filtermaskidhigh=0x7c20;
can_filterinitstructure.can_filtermaskidlow=0x0000;
can_filterinitstructure.can_filterfifoassignment=can_filter_fifo0;
can_filterinitstructure.can_filteractivation=enable;
can_filterinit(&can_filterinitstructure);
表示id為7f20和7c20的都可以通過。
3.在配置為識別符號列表模式時 can_filterid 和 can_filtermaskid 必須一樣才起效。
stm32 CAN過濾器組
在互聯型產品中,can1和can2分享28個過濾器組 其它stm32f103xx系列產品中有14個過濾器組 位寬設定 四種配置方式 1個32位的遮蔽位模式 2個32位的識別符號列表模式,可以過濾2個識別符號id 2個16位的遮蔽位模式 4個16位的識別符號列表模式,可以過濾4個標準識別符號id 擴充...
STM32,CAN匯流排過濾器的設定詳細講解
遮蔽位模式 在遮蔽位模式下,識別符號暫存器和遮蔽暫存器一起,指定報文識別符號的任何一位,應該按照 必須匹配 和 不用關心 處理。識別符號列表模式 在識別符號列表模式下,遮蔽暫存器也被當做識別符號暫存器用。因此,不是採用乙個識別符號加乙個遮蔽位的方式,而是採用兩個識別符號暫存器。接收報文的每一位都必須...
關於STM32的CAN的過濾器
關於stm32的can的過濾器 stm32普通型晶元的can有14組過濾器組,互聯型有28組過濾器組.一般我們用的都是普通型的,所以在本文中可以說stm32有14組過濾器組.根據配置,每1組過濾器組可以有1個,2個或4個過濾器.這些過濾器相當於關卡,每當收到一條報文時,can要先將收到的報文 從這些...