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

【经验分享】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进行筛选和过滤,再去提取数据。
& j5 A4 m$ Y' u1 ]' o2 m% T. ?
二、CAN 通讯接收过滤器的分析
首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。
8 d6 X+ j* y, B; ?6 }2 a
  1. typedef struct' Q$ j6 @2 s3 v. h' k) i3 ]0 d
  2. {$ N7 z* f9 B8 G" j" y6 x. k
  3.   uint32_t StdId;    //11位 标准帧ID即Arbitration Field
    9 A6 M7 }3 s/ @/ q( Z
  4.   uint32_t ExtId;    //29位 扩展帧ID; d! _3 Q5 V( d# G
  5.   uint8_t IDE;       //1位  O:标准帧,1:扩展帧* K( Z6 H; A. R: [1 z) S
  6.   uint8_t RTR;       //1位  0:数据帧,1:远程帧, s. r# i; r. ?
  7.   uint8_t DLC;       //4位  发送的数据的长度
    ' W) x+ P5 L* I5 K# I* |" U7 U$ M% R
  8.   uint8_t Data[8];   //8位  发送的数据即Data Field" P: o7 q4 y/ k. i
  9. } CanTxMsg;" g: e- u+ T5 V3 `2 c  Q
复制代码
% f4 F0 y# z6 o. j0 B
因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMx,FSCx的设置,如下图所示:
( H' V4 x1 ^# ~7 d* M
1100486-20170306184647656-1740544022.png
. g7 b+ I* H8 h, W- K. L4 R

8 V5 G! E# c' P6 J6 W, F! Z6 {. W看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识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>
复制代码

* D1 Z6 E$ C2 |* R* B9 B+ v% L
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>
复制代码

2 d, n8 W' b& n' J3 j: }) U  Z8 L' Q, @4 w
如果接收过滤使用标识符列表模式来过滤标识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>
复制代码
8 h/ j; ~9 @3 W0 {

) m: g( z! X% n$ o3 U
这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID后跟发送过来的CanTxMsg.StdId进行校对,如果是则去接收数据,不是则过滤掉数据,标识符列表模式目的是过滤出一个标志符ID。
三、CAN 接收过滤器的四种工作模式的程序配置
$ |9 P$ Q8 n; O' b$ @1、32位标识符屏蔽模式" ?; S0 H' d7 J: j0 O  c

) a0 ]' B4 Z/ b7 E/ J% E3 D7 U$ z 1100486-20170306174607938-1478027373.png 5 v7 \; j6 r; @. p; W' U
; h" L  w  e1 s$ S0 C. r
假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f
  1. ID      : 0000 001x xxx0 0000 0000 0000 0000 0000  //分别对应CAN_FxR1高16位、CAN_FxR1低16位# h. e: U- f' r- F
  2. 屏蔽    : 1111 1110 0001 1111 1111 1111 1111 1111  //分别对应CAN_FxR2高16位、CAN_FxR2低16位
复制代码

  Z2 e; C  s2 W- K
! R$ O: o! C5 v7 G7 t: X
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX32IDMASK);                                      //32位标识符屏蔽模式
    + l, z6 s- U8 {0 q9 h- Y# m
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
    - E& Z$ ~% _' S' f9 M+ A& ]- M3 o* H
  3. {) `" o+ c6 V' k$ T
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;* T+ `( s- l6 Q4 D% a! p0 S
  5.    
    6 l8 \: x* s1 R
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选
    $ H6 K8 Q: b) P$ y: ^+ O$ @5 X& q
  7.    if(FilterMode==CANRX32IDMASK)' J1 Y' _& @$ B+ I# V0 e3 Q
  8.    {
    5 L4 x* f2 M; X! X5 V
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    - R+ t* x, ^6 o0 \
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 * l! S. x, r* n5 j5 K3 n* I
  11.    }0 d0 C* i4 ~7 m7 X5 ?) @1 _: K% B, u
  12.    else if(FilterMode==CANRX32IDLIST)
    3 t$ q7 g4 ~: [, L
  13.    {7 E7 o2 P0 [6 r5 a$ \: f
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式) G9 P/ k2 K. V6 \! B
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    8 o6 t3 {6 C$ L0 E9 p& [; K
  16.    }
      ^" V  [8 b* z/ l' `5 T
  17.    else if(FilterMode==CANRX16IDMASK)
    ( Q( {8 X; D, `" r. L
  18.    {; b4 e+ G2 p6 W' j* G  ^
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    ; M  X% |, i) ?
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    . L! O3 B; H- ^9 \
  21.    }  z. W( |0 }* u2 b. V+ ^5 A0 [
  22.    else if(FilterMode==CANRX16IDLIST)
      e/ Q# n2 k# T' u
  23.    {
    - X  U* S1 s" S
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    - C1 t9 h( @# I6 q+ Z9 g
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽5 ]4 o; v. P* O8 ~6 \+ n
  26.    }
    ' h9 o  l' M( w1 V/ r8 a
  27.     //标识符寄存器FxR1
    / Y' i' |8 Y/ k& F
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5;                  //32位ID,高16位
    # \* v$ p: f: U& o
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                     //低16位
    : t7 ]1 P: o6 `6 v/ d
  30.    //屏蔽寄存器FxR2
    3 V( ?2 e, T. e$ R5 ?- m* ]: a
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f;                //32位MASK,高16位) x% R6 q& a9 m# k0 w3 f. j3 t
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;                 //低16位! n2 y6 u% ]: p' B! T
  33.         , l6 m, T+ {6 i/ h' W
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0& y- p- {) M: P8 ~! T
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0
    2 R/ F  ]. }  p0 b) n

  36. . @  H; F5 y' I: u$ t
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化
    ! M( I% Q# j6 l4 k5 @7 h
  38. }
    " V% \7 U$ k* P6 z3 Q7 q3 z9 F5 ~
复制代码

8 `8 ?# A- H" B7 R8 X/ s
7 ~7 J" {2 }# \" B- v
" H& o- O! ]2 K! ^5 l: c2、32位标识符列表模式
" a* Y1 V" R+ [2 v' K/ |% d+ ]% K2 [) j; N3 d( ^
1100486-20170308163452531-1730489200.png
  L1 j4 o1 w* Z/ V. F# ^
# Z, @* y* B! P$ B9 r
假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。
  1. ID      : 0000 0010 0010 0000 0000 0000 0000 0000  //分别对应CAN_FxR1高16位、CAN_FxR1低16位  //0x011; N9 A* U! q+ n  D5 |
  2. 屏蔽    : 0000 0010 0100 1111 1111 1111 1111 1111  //分别对应CAN_FxR2高16位、CAN_FxR2低16位  //0x012
    6 F9 r* A; I7 M! j
复制代码
1 M- b- a/ @  h
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX32IDLIST);                                      //32位标识符列表模式
      `; g2 F9 J* D+ \& R, D  Y9 \
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)2 i1 ^# u+ }( o. V* R
  3. {
    . Y& y1 Z, Y1 C- `
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;
    ; f& K/ I( H8 W" V) `
  5.    # c: c8 v! I' s4 q$ \* A4 m( H  F
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选
    8 I( l  P# |+ K9 Z. G) ~6 O
  7.    if(FilterMode==CANRX32IDMASK)' D: W9 P( }- Z+ p! m
  8.    {. i6 P  Q% c/ a; }' Y
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式; d4 c4 W4 J0 W, Z" `
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    , r0 A+ F0 g, Q8 ]
  11.    }, \/ E7 @7 v5 w( ~5 f4 P- p
  12.    else if(FilterMode==CANRX32IDLIST)
    . Z0 n8 ]0 P6 \
  13.    {. Q, {8 I# {, G, x- y$ ^# L
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式6 V3 A) W# {" \/ D9 a+ O, s, e
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 . H, `$ S" }' y* |1 N
  16.    }
    3 a1 @2 C" J6 U- m
  17.    else if(FilterMode==CANRX16IDMASK), c- v, R/ ~' f
  18.    {) K8 m6 h2 z& S& q% V- e
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式- G: @6 y/ k( P4 G
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    $ a+ e; \. l" l2 B5 |) G; Q, i
  21.    }
    , U8 W1 ~7 w2 Q: T, X# Q& h
  22.    else if(FilterMode==CANRX16IDLIST)8 e5 N+ v% j# E) R+ I
  23.    {
    - R* u" o$ ~" o- A
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    $ G+ r8 t" K6 ~0 t/ P
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    % ~4 Z% B# |2 H8 L9 h
  26.    }9 G. R. ]/ _- V' o9 W: x5 Z" J
  27.     //标识符寄存器FxR1
    $ [7 A+ R/ D) J0 |
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5;                  //32位ID,高16位2 O$ ^& C) K3 J% `) I" s9 ?
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                     //低16位8 k- P: l: i$ W/ ^: z
  30.    //屏蔽寄存器FxR2
    3 d6 u! j5 s$ ~7 p
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5;              //32位MASK,高16位
    ' N  Y+ v" y, \& T# j; g
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;                 //低16位
    * D/ S3 N2 R) q  m
  33.        
    ( v5 v% w  X& A$ N
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0: U! a3 ~, K; y7 A5 y- O5 ^- r
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0
    ) f& i9 v7 s! ^& u% D# o
  36. 8 Y: Q* u6 m' E- r' G
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化" w  K7 \: O# u" M4 l
  38. }
    4 ~0 u6 _; g/ d- ]' A& l
复制代码

& \; F; ^$ c3 x2 p4 |, r4 J# q6 ^. Q& D0 d, T
3、16位标识符屏蔽模式
4 }; p$ L- v" m+ R) O/ t) b' A$ `! U: S. A" O  s$ e
1100486-20170308164239641-1269194157.png
6 k4 M" c. G& Q/ s. X

) k* z7 k0 c& q0 B. y假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。
  1. ID      : 0000 001x xxx0 0000  //分别对应CAN_FxR1低16位  CAN_FilterIdLow
    * L$ v  @8 [4 e& |' q. o' z, j
  2. 屏蔽    : 1111 1110 0001 1111  //分别对应CAN_FxR1高16位  CAN_FilterIdHigh
    7 S) D. z; O+ ]0 v7 a* N% I8 C
  3.   V8 J. f& o/ C% @% l, X. Q
  4. ID      : 0000 000x xxx0 0000  //分别对应CAN_FxR2低16位  CAN_FilterMaskIdLow
    0 j: G$ p9 g% s* _; q
  5. 屏蔽    : 1111 1110 0001 1111  //分别对应CAN_FxR2高16位  CAN_FilterMaskIdHigh
    5 K9 C: U2 W* l* o* r
复制代码
0 h1 y+ F9 K0 S6 \3 `
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX16IDMASK);                                      //16位标识符屏蔽模式
    " n# p% F/ |  M! N
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
    ' H* B, O, r* G, z: s3 q
  3. {
    8 W! Y5 J9 `0 t
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;/ K& S6 t7 Y8 \# e. |, Q
  5.    % J* m% X$ M8 r& S
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选  U# c5 J1 D% b" H1 B8 f" T
  7.    if(FilterMode==CANRX32IDMASK): |6 h: k1 _7 }( h6 a
  8.    {% b% G1 f$ R$ k" X: H4 H$ ?
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    3 E; m/ f3 U+ N# s! K& M, [
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    ) E- p9 j5 D; W1 |: v) H
  11.    }! X$ I! w7 B  \( P9 S
  12.    else if(FilterMode==CANRX32IDLIST)
    5 L. l( @2 [: g
  13.    {, A9 m: H- L" q! K. ^
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式
    8 B4 Z0 k! O# p
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽
    ) H/ N7 Y, {4 Y+ B: R
  16.    }
    6 ~/ F& w( [1 z' R, A( t! X
  17.    else if(FilterMode==CANRX16IDMASK)
    8 O8 w9 f, f9 E1 M3 r8 C
  18.    {
    1 Z: w. t. Y5 j% E. L7 c) J
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    1 t0 q2 N2 Q/ J
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
      b5 a' `- W. v. e( w+ g
  21.    }
    4 d( H; ~# W' ~8 t9 z5 A. g. D
  22.    else if(FilterMode==CANRX16IDLIST)6 X4 ?$ s7 S( h- w
  23.    {. t6 ?( A% |) ~" a
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式6 O# U1 A$ ?+ z) L& Z3 ?1 n
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽: q! _4 A4 p8 G( N# Z
  26.    }8 K: V! k6 H# e9 |
  27.     //标识符寄存器FxR1
    / h5 @' L" V- @6 K/ X! W# j4 f7 q: _
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f;                    //32位ID,高16位  G; s1 a2 [- o9 e
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5;                   //低16位" r# X" Q9 \: X# x- A* t
  30.    //屏蔽寄存器FxR2% B. T" r; i! u: C/ p- w. F
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f;                //32位MASK,高16位' C' A" Q  Q0 I- U/ j; _
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5;               //低16位
    6 Y' N) Z, C$ Q* m
  33.        
    " ^6 o* N% B1 I; b6 R
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO0) r, j$ ]" ^( w* X
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器08 z; S: S% c& m$ [: }

  36. . n2 |1 J4 c) _+ x
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化
    + t$ Q: Y: h) F. Q" B; g* n' g
  38. }
复制代码
, d5 _, |6 g9 n$ t5 F7 H2 q! [4 a4 u
0 n5 ?+ ?3 Z) U! z. r8 A" ^
4、16位标识符列表模式5 {  f) h" e! [# t& I

# M+ `( W2 |8 C- A" n* ` 1100486-20170308171618219-1716149981.png % f* V" ]# |1 Z  x2 g" h
; t+ O0 f, i9 C+ T
假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。
  1. ID      : 0000 0010 0000 0000  //分别对应CAN_FxR1低16位  CAN_FilterIdLow  //0x010
    5 b' I- i3 r! y- W  ?
  2. ID      : 0000 0011 1110 0000  //分别对应CAN_FxR1高16位  CAN_FilterIdHigh //0x01f6 V. C" X# r) S* G1 M

  3. . g+ b9 q8 o2 ]' X! C
  4. ID      : 0000 0000 0010 0000  //分别对应CAN_FxR2低16位  CAN_FilterMaskIdLow //0x001
    0 |# n8 c9 s: M. G; j) J2 j) D* k
  5. ID      : 0000 0001 1110 0000  //分别对应CAN_FxR2高16位  CAN_FilterMaskIdHigh //0x00f
    + w3 G$ I: ]7 D9 F7 X/ u
复制代码
$ W: H/ e4 J  ^8 J5 h/ {
程序配置如下:
  1. CAN_RxFilerconfig(0,CANRX16IDLIST);                                      //16位标识符列表模式
    " U( e5 Y- k0 ?/ Z4 G( Q
  2. void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)# P* Z' l9 v& j
  3. {
      o2 r) o/ {% ]! `5 D
  4.   CAN_FilterInitTypeDef          CAN_FilterInitStructure;  L1 u9 f5 a$ ~5 I& E+ P
  5.    ' W# n) {2 l" Q  a
  6.    CAN_FilterInitStructure.CAN_FilterNumber=FilterNum;                       //过滤器号0~13可选1 y- t' b1 h$ ]2 u
  7.    if(FilterMode==CANRX32IDMASK)0 p3 `3 Z( y# x0 W
  8.    {8 |6 ?/ }9 [  n0 _
  9.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式* i8 F8 h- \8 A: X6 }5 o1 ]
  10.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 $ z. k2 k& x" U) Q. E
  11.    }
    & }: o8 p5 z0 J: {& ~
  12.    else if(FilterMode==CANRX32IDLIST)
    ) _& R1 Q& Z/ K: O: i; a
  13.    {
    9 `/ \" ^& x- @0 u; o  g
  14.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式0 D( Q9 \1 C6 J/ ~
  15.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;    //32位宽 1 e1 ~) f7 b2 }( E/ [0 a6 q
  16.    }5 V- A; h! i4 E: N
  17.    else if(FilterMode==CANRX16IDMASK)+ J* Z3 Q& [, h/ U  a4 O
  18.    {
    . H  D/ u2 t; `  Y- o) X
  19.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;            //标识符屏蔽模式
    9 Z5 l: g) p2 P
  20.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽
    + E+ v% y$ j7 ?) y$ J; N( {1 ]0 r
  21.    }* _# _$ Z1 Z# S9 x; d+ V
  22.    else if(FilterMode==CANRX16IDLIST)
    % j* ]! I( V- N% Y
  23.    {/ B0 [7 \, q) ~% B; W$ K) D
  24.      CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;            //标识符列表模式+ b2 r8 @' O2 x* U# ~
  25.      CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;    //16位宽" a8 N$ J5 J& O7 Q
  26.    }
    2 h: b( G0 w- Q
  27.     //标识符寄存器FxR15 A+ b* ~1 q) G/ V0 I% D
  28.    CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5;                  //32位ID,高16位
    8 L( g$ ~+ o9 F# B  d3 U
  29.    CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5;                   //低16位0 q& l4 k7 j5 M
  30.    //屏蔽寄存器FxR2& ]0 o3 _$ W& {
  31.    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5;              //32位MASK,高16位' v, q( i/ Q1 X
  32.    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5;               //低16位
    * z' E8 k" V9 h  q" W
  33.        
    ( U$ V9 n, D- |% w
  34.    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;  //过滤器0关联到FIFO05 V; Q# J; a- [1 y7 H3 U6 p
  35.    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                //激活过滤器0
    % L5 V* L! L! \; L
  36. , ^/ s# i+ L" F7 M
  37.    CAN_FilterInit(&CAN_FilterInitStructure);                                       //滤波器初始化7 U  K9 K- A( D6 [1 s
  38. }
    # a- D/ j4 v1 L( z+ G
复制代码

- A3 R  y- R4 ]# q$ A# w9 {7 {+ \$ l  M$ J, B
1100486-20170303180750376-74083783.png
收藏 评论0 发布时间:2022-1-20 20:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版