![shequ.stmicroelectronics.cn](./template/st_v1/static/img/logo2.png)
CAN总线的标识符过滤器很重要。3 O+ Q8 } C- z# l# ?2 t( ^ 1. 标识符过滤器是用于接收的,发送的时候无需设置过滤器,这点一定要整明白。 根据发送端发送来的帧数据,通过标识符过滤器就可以设置仅接收需要接收的帧数据有效降低CPU多余的处理时间。 5 c: s4 }: r- J3 v) R 2 什么是标识符? 标识符主要包括如下,也可以简单的理解仅包含ID号,但是在这里下面这些都是要包含的。 ![]() * y2 [2 `3 O4 L% K8 a v- E. H 比如:数据帧和遥控帧,标识符就包含在其中,所以发送端发帧数据给接收端后,接收端就可以通过硬件标识符过滤器进行筛选,节省了CPU时间:. `0 h( _" M" D* x ![]() ![]() ; k4 I; j. J1 z 3. 下面就是最重要的,STM32的CAN总线标识符滤波器组包含两种实现方法: 屏蔽位模式和标识符列表模式,这两种方式怎么理解呢,重点看下面的截图: ![]() 书面上解释屏蔽位模式和标识符列表模式的区别/ O J) f" P) @ r2 ` 屏蔽位模式, j3 i$ M) A8 U1 E: d 在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。 , r9 y2 O: N# B, O0 E0 P 标识符列表模式 在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。2 y" l; C" C! ]+ e5 L+ Q# ^ =================================== 标识符的列表模式比较好理解,就是指的所有的过滤器寄存器位全部用于过滤,简单的说就是发送端发送的标识符所有的位必须跟接收端的滤波器寄存器定义一样。有一个位定义不一样,拒收此消息。7 z u& v' W* S# V& ~" {$ E [: [ ![]() % M5 n/ {8 m. _ 比STM32F103有14个过滤器组,如果采用两个16位的过滤器形式,那么就可以固定识别出14 * 4 = 56个不同的标识符,实际使用中也够用了。为什么是乘以4,注意看上面的截图,4个16位过滤器--标识符列表 =================================== * G7 @' |. t, ?; g, W- h 屏蔽位模式要稍麻烦一些,我们以2个16位过滤器---标识符屏蔽为例进行说明: ![]() ; a6 ]* |0 V6 E- r9 c0 M 将过滤器寄存器分成两个部分,标识符寄存器和屏蔽位寄存器。& m! n7 f6 F y* H& u- | 上面截图中ID部分就是标识符寄存器,屏蔽部分就是屏蔽位寄存器。 比如 ID : 0xFED0;9 p. c, }/ }9 ^3 @) G 屏蔽:0xFFE0;* A* W3 x8 f! g1 [* r3 O& X2 B' z 那就是表示,接收端接受帧数据时,前11位的数值必须跟ID中定义的前11位一致,后面的5位数据忽略。 不管是什么值都可以。也即是说屏蔽位中的数值:! z6 j! D$ V) ^$ \. ` 0: 不关心,该位不用于比较;3 u( E' b N% I2 e2 z# i1 M 1: 必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。 基于此原因: 为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。* j; N( I* a1 x9 n) S. K# H- e% H' b 为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。* [! M' Y( c' e2 v 3 [) U- D2 \$ h! j' d7 [+ \% j' z' q& B |
![]() ![]() |
ST的MASK和List双模式,挺有特色 |