你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32之CAN通讯接收过滤器过滤分析

[复制链接]
STMCU小助手 发布时间:2022-1-20 20:56
一、前言
学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有标识符的协议。如下图所示的CAN通讯发送数据的数据帧,Arbitration Field即是具有优先级的标识ID,Data Field即是要发送的数据,Arbitration Field、Data Field就是我们关注的重点,因为CAN通讯协议里边这些发送出来的标识ID并不代表节点的地址,数据是以广播形式发送出来,每个节点都是可以接收,至于接收到的数据是不是想要的?就需要对这些标识的ID进行筛选和过滤,再去提取数据。: E0 {+ c" p" H$ p' K, @( g6 X& w1 o
二、CAN 通讯接收过滤器的分析
首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。
8 [9 W9 i1 t  A- w( p& O
  1. typedef struct
    - Z7 l% L, U5 H9 e- @/ V, ]0 h
  2. {; E: r. U7 ~, D6 O. b. Z4 P3 \
  3.   uint32_t StdId;    //11位 标准帧ID即Arbitration Field
    & x0 B9 u1 L3 T% c
  4.   uint32_t ExtId;    //29位 扩展帧ID$ ]3 w9 S2 Q* f. Y- n# _# b2 Z$ j
  5.   uint8_t IDE;       //1位  O:标准帧,1:扩展帧3 D4 ?- b/ b& m: V& S9 p
  6.   uint8_t RTR;       //1位  0:数据帧,1:远程帧
    " k6 \4 e' s3 |( P
  7.   uint8_t DLC;       //4位  发送的数据的长度, ~  w) d) Z2 O6 G8 Q& ?
  8.   uint8_t Data[8];   //8位  发送的数据即Data Field7 h2 d$ r. ~& [
  9. } CanTxMsg;# q' \: j2 c$ P/ W2 C  t& `. J
复制代码
% S; o1 u/ Z* S3 x( K8 ?7 e1 U
因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMx,FSCx的设置,如下图所示:

1 |! q7 D( D! `6 z& G0 R3 R
1100486-20170306184647656-1740544022.png
. ~. ~( A% }% a. W
$ q3 h. C1 L. O. Q
看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识IDCanTxMsg.StdId是0x000~0x00f,接收过滤先用标识符屏蔽模式来过滤标识的ID,如下所示:
  1. <font color="rgb(255, 0, 0)">ID  :</font>     000 0000 0000 <font color="rgb(163, 21, 21)">xxxx</font>               <div><font color="rgb(163, 21, 21)">屏蔽</font> <font color="rgb(163, 21, 21)">:</font>     111 1111 1111 0000   </div>
复制代码

* S: A% L% o( r2 c% q+ y, Z9 ~1 I, C- H
x代表0或者1都是可以通过,0000到1111的任意组合,这样就可以过滤出0x000~0x00f的数据的,所以屏蔽的意思就是让某个范围的标识符ID可以通过,目的是过滤出一组标志符。那么如果想过滤出一个数据0x003,用标识符屏蔽模式实现方式如下,
  1. <div><font color="rgb(255, 0, 0)">ID  :</font>     000 0000 0000 0011               </div><div><font color="rgb(163, 21, 21)">屏蔽</font> <font color="rgb(163, 21, 21)">:</font>     111 1111 1111 1111   </div>
复制代码
* u9 w$ L0 X/ j3 j; r3 y

+ @0 l% O1 h! B9 N8 P
如果接收过滤使用标识符列表模式来过滤标识ID,如下所示,
  1. <div><font color="rgb(255, 0, 0)">ID  :</font>    000 0000 0001  </div><div><font color="rgb(255, 0, 0)">ID  :</font>    000 0000 0010</div>
复制代码
. _) v, E1 o4 i, @, z

' Y. C$ K% ^: g. K
这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID后跟发送过来的CanTxMsg.StdId进行校对,如果是则去接收数据,不是则过滤掉数据,标识符列表模式目的是过滤出一个标志符ID。
三、CAN 接收过滤器的四种工作模式的程序配置
" d9 t* q* g5 c1、32位标识符屏蔽模式2 T5 S& n' K2 w% |9 j8 p( e; E

  V% L, G: N" w2 Q% a6 @ 1100486-20170306174607938-1478027373.png
1 G6 [' @2 F) x2 \* r+ A* {

' L3 }6 k& O9 s% V假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f
  1. ID      : 0000 001x xxx0 0000 0000 0000 0000 0000  //分别对应CAN_FxR1高16位、CAN_FxR1低16位
    5 ]. i5 q3 Q, T) X
  2. 屏蔽    : 1111 1110 0001 1111 1111 1111 1111 1111  //分别对应CAN_FxR2高16位、CAN_FxR2低16位
复制代码

) n4 a) H! J$ C) e9 P9 }; s+ F. p% |) W. j
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX32IDMASK);                                      //32位标识符屏蔽模式
    ( p3 b8 \1 l: N: I
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)  _9 A% \: m* C' x& I/ q8 }
  3. {
    3 g6 s/ R" S! L8 O/ x
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;2 w6 o8 f( G- P+ S; t7 u+ r
  5.    1 l8 h2 s+ i+ i" K9 `
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选; A+ w- {1 p* M. N% y, W
  7.    if(FilterMode==CANRX32IDMASK)
    1 S: b) f3 }7 k" |0 Q
  8.    {
    ) o& @# K5 W' _$ e
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    $ t& O9 f6 p( ~- Q/ }
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    - N# K& g* t6 H  @. ?: O
  11.    }
    ; s; c& W1 m; f  l
  12.    else if(FilterMode==CANRX32IDLIST)" v7 }9 m1 H: l0 ?, k
  13.    {7 ~* A8 ^$ t1 l' [( V
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    & s) {; j  ^; f# Z0 r
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 ! G) L+ g1 q& A& n( y3 f3 Y* t7 Z4 F
  16.    }
    / @7 H2 V' |; k, h7 X' t% |
  17.    else if(FilterMode==CANRX16IDMASK)3 D, {/ j) P3 {* K
  18.    {
    9 l+ R7 D( n9 ], V* q& _: B
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    & [$ ?: Z: S7 f
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽 5 d. [) }! f2 t# P6 p
  21.    }) z6 ?0 B: u% }
  22.    else if(FilterMode==CANRX16IDLIST): Y: U* `$ G' }1 I, G+ c1 N
  23.    {
    9 \' Z# f% U9 N1 O
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    5 |  o4 Z) q) j$ t9 d: i
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    2 C+ j1 q0 H0 e4 G5 }
  26.    }
    ' \- i7 A5 t' a& I/ F) g
  27.     //标识符寄存器FxR1
    2 a7 A- h( _2 Y
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5;                  //32位ID,高16位
    - c! u! @! B/ p, H6 `# z
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                     //低16位
    8 M: \1 V  P$ r, u
  30.    //屏蔽寄存器FxR26 I) ^3 w% j; Q+ l( p
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f;                //32位MASK,高16位
    $ s! g/ q0 l0 p- k7 i+ A
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;                 //低16位
    - q9 [& G2 y9 c; }6 Z. ^) B8 i
  33.        
    - [+ s3 [0 i' @" w/ s, H: L6 V. H
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0
    ' P: u( k8 @4 }2 a! D) ^7 o+ G6 H
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0
    : [0 a8 _7 a8 a" e
  36. . A& Z! P( Q% Y# l8 @8 @% N
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化) u$ v( `; O2 E0 {
  38. }
    + Z8 p- }2 V& a+ h' M$ W3 z8 H* T- L: G6 p
复制代码
! {, d( y; J! [+ f, T

' h% A) g9 w  o4 C8 M8 Y
) F& ~8 {7 G7 `' X' L/ F, U0 f" C2、32位标识符列表模式: F: V9 _  f. a

# t- C+ z9 M4 O, j* D" u 1100486-20170308163452531-1730489200.png ; P, U; n( |2 `' _

% a, Z; F# Y- a假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。
  1. ID      : 0000 0010 0010 0000 0000 0000 0000 0000  //分别对应CAN_FxR1高16位、CAN_FxR1低16位  //0x011  O/ s: X5 \$ w6 D8 D
  2. 屏蔽    : 0000 0010 0100 1111 1111 1111 1111 1111  //分别对应CAN_FxR2高16位、CAN_FxR2低16位  //0x0127 i# Z4 x& z; v! j; ^. \+ S
复制代码

7 C1 G6 Q7 }8 G2 D
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX32IDLIST);                                      //32位标识符列表模式
    + K# \1 G' e& n/ d4 Q/ }
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)8 p9 f/ b0 L, |3 t: E
  3. {& `0 |6 m0 g, F% K
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;
    , `  I* ~+ [% T. B; L; ?
  5.    ( \1 |. t; W" O3 ?
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选
    2 h& {, a' N7 q) P# O9 I* @
  7.    if(FilterMode==CANRX32IDMASK)
    # b9 U$ n& z( H$ Z: ]
  8.    {
    # S: Z2 T+ j- V3 A; s5 R2 {6 A
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式( ~6 \. i" X, u- |; z: i6 Y" N
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    6 Q  @+ o5 e0 H, b- D5 W0 e( S
  11.    }
    ! ]% L- J+ I* D/ M' y
  12.    else if(FilterMode==CANRX32IDLIST)
    6 e, D1 l$ q8 B( H4 h: H
  13.    {
    4 Z& B" p+ x' v1 k: t
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    8 Z* g* M6 p1 E- y; R
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    + g! V: q- _) t; Z/ H2 _/ H6 J
  16.    }
    6 n4 j* D# S$ c; i
  17.    else if(FilterMode==CANRX16IDMASK)5 {4 W0 `5 _) d( Z2 e1 _( Y
  18.    {
    ( k* \8 U& }) {. S9 e' O
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式* i7 V) J2 V; r' E; n/ M0 F
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    1 `' _# p4 c- }5 G! A
  21.    }8 l% Y! Q% f! f/ o+ U
  22.    else if(FilterMode==CANRX16IDLIST)5 E8 |  u. P2 I
  23.    {! z8 Z3 p& Z, }7 ~- \5 n
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式% X5 {1 R* `8 C
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    * z7 U: @. A" P3 J5 _/ J: `' W
  26.    }
    1 U0 g' N! T& g( r6 ~
  27.     //标识符寄存器FxR1: f# F2 t" N4 S# ~
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5;                  //32位ID,高16位3 i# @+ w* v4 u7 R2 y4 R, F
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                     //低16位
    + y1 c5 z9 _7 Z, p; N
  30.    //屏蔽寄存器FxR2
      N* \* Z" O$ O2 z4 F
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5;              //32位MASK,高16位5 c6 B4 N6 m2 o4 Z
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;                 //低16位
    9 k! Z) c$ z$ U" x( z
  33.        
    % a5 K% J5 t- ?+ ]8 J2 J6 x
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0/ T: y) m" ?# @
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0
    * \+ W1 q7 x+ O+ a. r' ^' X! ]
  36. 7 T) L: P# N. l8 B5 E
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化/ o: q! }$ R/ C- G/ z0 a* F+ t+ u
  38. }
    * X( f2 z0 f& w) O# a
复制代码
% p- h/ V% l- L* T* A: \, y

3 x* }! Q4 J2 L% I3、16位标识符屏蔽模式
* z8 U( p0 S, O0 \: M! O( |- G5 C0 e
1100486-20170308164239641-1269194157.png
* `7 Y/ c% y, m! v+ ~7 \

) J  B7 g$ h) A& z( z3 l) F假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。
  1. ID      : 0000 001x xxx0 0000  //分别对应CAN_FxR1低16位  CAN_FilterIdLow
    1 G+ ]0 I, _& W' B' E1 [
  2. 屏蔽    : 1111 1110 0001 1111  //分别对应CAN_FxR1高16位  CAN_FilterIdHigh* w& M( U. N) `
  3. ( v1 d- S6 U6 a5 L4 d% w
  4. ID      : 0000 000x xxx0 0000  //分别对应CAN_FxR2低16位  CAN_FilterMaskIdLow* v" l! P7 p0 h$ [7 |8 O! ^! i8 S
  5. 屏蔽    : 1111 1110 0001 1111  //分别对应CAN_FxR2高16位  CAN_FilterMaskIdHigh4 G: `* X) s- q/ r& z
复制代码
. I! A( z) T& n/ @
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX16IDMASK);                                      //16位标识符屏蔽模式
    $ m' s+ M* Y- R' O
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)# w2 F# U, w6 R" I  J
  3. {5 J" J- K2 e6 P; M! f5 n' c
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;% ]: R! G0 q' G4 j& {) ?
  5.    
    : s, S; P( S" m/ l( O
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选/ a# x0 S1 a$ j2 _
  7.    if(FilterMode==CANRX32IDMASK)' B: U' m0 e  q8 X
  8.    {
    ; B  @; K+ j) E. A
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式7 K) h* E5 Z) |; o9 Y
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 ( L/ [$ P5 D$ F) |! e* [
  11.    }9 K) v- I, W. t3 ?, k4 J
  12.    else if(FilterMode==CANRX32IDLIST)
    ( ?# ?6 Q. {" P" u( B2 E( C
  13.    {( c" r& Y7 \+ v) z
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    . n2 r  V' Q5 a; b& l* O5 r: F$ N
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    # [, z- @8 F2 y% j
  16.    }
    + l( L+ G: r" F0 T& E$ L3 P# q
  17.    else if(FilterMode==CANRX16IDMASK)- Y) _: g) \& x
  18.    {6 |. P- |4 R2 _6 x  M1 @- k3 t6 L
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式' O; ]  A  t7 p# {' a
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽 * c1 f2 H! e/ R7 W+ P" W+ T
  21.    }3 a/ B' P5 Z* y9 E) A$ B, Z
  22.    else if(FilterMode==CANRX16IDLIST)+ m3 E5 h9 u- p9 v9 J1 \
  23.    {- Y& |$ X. G+ w: O
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    5 p  T& ~0 P- E( h. F7 t
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽: g' S% x; M3 ?  i( G
  26.    }$ L" M+ B6 f, |) A; {
  27.     //标识符寄存器FxR18 H' R; P8 H$ B+ G4 `, X5 \
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f;                    //32位ID,高16位3 Q! v+ c4 ]; G; M
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5;                   //低16位
    $ O0 t0 F; n! f2 P. Z3 W; F4 u
  30.    //屏蔽寄存器FxR2
    ' K, w* I* {% i- p" q* P1 Z
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f;                //32位MASK,高16位) `8 @  k- Q, u! M" D# v$ ~: z
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5;               //低16位6 h2 ]- O5 w' T5 [
  33.        
    2 t9 G+ m5 a/ A0 n
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0
    # N$ x1 m0 w) t* W8 y
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0
    6 ]. ^; K# r* B3 h0 ?8 H
  36. + I2 f; H" x; w8 r  s) k
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化
    0 p; ^/ U, d( W! }$ j! v9 g
  38. }
复制代码
( O4 {9 s7 ~4 |  j

3 w8 e$ m  F+ }* y4、16位标识符列表模式
2 n; R- @$ \. w3 r! _( c+ ~. D! i! }) M- w
1100486-20170308171618219-1716149981.png
5 F: |1 U" D; D) V
: @* e' [: O8 y; O& q
假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。
  1. ID      : 0000 0010 0000 0000  //分别对应CAN_FxR1低16位  CAN_FilterIdLow  //0x010% I/ x: }) O5 o2 ~
  2. ID      : 0000 0011 1110 0000  //分别对应CAN_FxR1高16位  CAN_FilterIdHigh //0x01f. t- G1 L0 ?/ f1 g
  3. * i- v# i# q: o1 J
  4. ID      : 0000 0000 0010 0000  //分别对应CAN_FxR2低16位  CAN_FilterMaskIdLow //0x001
    5 h9 S0 i/ s" Y4 t6 Q+ F
  5. ID      : 0000 0001 1110 0000  //分别对应CAN_FxR2高16位  CAN_FilterMaskIdHigh //0x00f4 }3 g* I4 B* ]6 T" i# |+ Z& N% U
复制代码
; T+ g* O" _* ^0 T$ P/ p! ?
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX16IDLIST);                                      //16位标识符列表模式; z, [( n0 t  O3 b0 I' @% ~+ E$ L' W
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)3 ?3 d6 g+ H( W0 l, b/ p: P# v# Z
  3. {
    3 x  |$ Y4 V7 g
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;. K2 a6 |& n1 ]4 P4 \8 J+ _
  5.      M% G! P0 {1 K; z
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选% w: z! l* t7 U1 _
  7.    if(FilterMode==CANRX32IDMASK)
    / e" w' `& a& v
  8.    {
    9 K( y# g0 H: x4 N% }8 r# y
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式3 {0 b. N8 g2 C9 u5 V
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 * A: I6 r8 G$ n& {
  11.    }5 c( W5 d5 j$ t1 ^0 @6 s
  12.    else if(FilterMode==CANRX32IDLIST)# V0 V; \. S5 u. i
  13.    {) S% P0 T& U# `, P1 n2 _
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式; H( U9 E! `( n9 E$ [& ^* C
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    3 {: w- {/ A6 B) Y$ i7 h! j% j+ ~
  16.    }
    # J9 s8 N, o) s
  17.    else if(FilterMode==CANRX16IDMASK)# @, }% g5 b, p4 }
  18.    {
    8 y( t; B0 [# L) n! s! ?3 v2 T) o
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式/ e. e: h5 P" Z% @: q4 }$ [
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽 % h, N4 L) ^1 A9 c/ q: ?
  21.    }
    3 x5 h! ]) o' }+ _9 a
  22.    else if(FilterMode==CANRX16IDLIST)
    2 [! ~5 e& u  n. E) M# T+ x
  23.    {& m; n" ^' W+ T# ]/ y. c
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式1 O7 M* E5 B- j$ `& g5 d
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    # |: ?5 ?, K5 C- W. T5 n
  26.    }1 j" `- m  ?+ W9 I. y
  27.     //标识符寄存器FxR1
    1 }% u( F: q  V1 m% k
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5;                  //32位ID,高16位1 Q* {/ x' a% z0 c( Q6 e# i- G
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5;                   //低16位& q2 U; [, F$ {
  30.    //屏蔽寄存器FxR2: H; [5 _% a# w1 M5 z
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5;              //32位MASK,高16位
    5 D+ r- L; m2 |- N0 M" j6 Y' Y
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5;               //低16位
    5 C% F" z% f2 R1 @) T( i1 z* c
  33.         * z4 [9 D& |! R( V. B: v& l- f
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0
    4 d  t$ z5 a! |+ X' C6 V! _
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器05 q; i: b4 `% Z: l/ ~9 N0 }& L9 \

  36. : m" E$ T4 Q# b  ~' X+ N* D
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化
    # _6 G. D! F+ z* x+ b
  38. }
    ) ^, P. t7 O3 r- E4 {8 W+ M
复制代码

; [3 @- O8 f' F7 S6 [5 {- Y- ~* V% R; K$ ?4 e7 d/ z, o3 d7 {
1100486-20170303180750376-74083783.png
收藏 评论0 发布时间:2022-1-20 20:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版