一、前言学习了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
- typedef struct' Q$ j6 @2 s3 v. h' k) i3 ]0 d
- {$ N7 z* f9 B8 G" j" y6 x. k
- uint32_t StdId; //11位 标准帧ID即Arbitration Field
9 A6 M7 }3 s/ @/ q( Z - uint32_t ExtId; //29位 扩展帧ID; d! _3 Q5 V( d# G
- uint8_t IDE; //1位 O:标准帧,1:扩展帧* K( Z6 H; A. R: [1 z) S
- uint8_t RTR; //1位 0:数据帧,1:远程帧, s. r# i; r. ?
- uint8_t DLC; //4位 发送的数据的长度
' W) x+ P5 L* I5 K# I* |" U7 U$ M% R - uint8_t Data[8]; //8位 发送的数据即Data Field" P: o7 q4 y/ k. i
- } 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
. 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,如下所示: - <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% Lx代表0或者1都是可以通过,0000到1111的任意组合,这样就可以过滤出0x000~0x00f的数据的,所以屏蔽的意思就是让某个范围的标识符ID可以通过,目的是过滤出一组标志符。那么如果想过滤出一个数据0x003,用标识符屏蔽模式实现方式如下, - <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,如下所示, - <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
5 v7 \; j6 r; @. p; W' U
; h" L w e1 s$ S0 C. r
假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f- ID : 0000 001x xxx0 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位# h. e: U- f' r- F
- 屏蔽 : 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程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDMASK); //32位标识符屏蔽模式
+ l, z6 s- U8 {0 q9 h- Y# m - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
- E& Z$ ~% _' S' f9 M+ A& ]- M3 o* H - {) `" o+ c6 V' k$ T
- CAN_FilterInitTypeDef CAN_FilterInitStructure;* T+ `( s- l6 Q4 D% a! p0 S
-
6 l8 \: x* s1 R - CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
$ H6 K8 Q: b) P$ y: ^+ O$ @5 X& q - if(FilterMode==CANRX32IDMASK)' J1 Y' _& @$ B+ I# V0 e3 Q
- {
5 L4 x* f2 M; X! X5 V - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
- R+ t* x, ^6 o0 \ - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 * l! S. x, r* n5 j5 K3 n* I
- }0 d0 C* i4 ~7 m7 X5 ?) @1 _: K% B, u
- else if(FilterMode==CANRX32IDLIST)
3 t$ q7 g4 ~: [, L - {7 E7 o2 P0 [6 r5 a$ \: f
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式) G9 P/ k2 K. V6 \! B
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
8 o6 t3 {6 C$ L0 E9 p& [; K - }
^" V [8 b* z/ l' `5 T - else if(FilterMode==CANRX16IDMASK)
( Q( {8 X; D, `" r. L - {; b4 e+ G2 p6 W' j* G ^
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
; M X% |, i) ? - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
. L! O3 B; H- ^9 \ - } z. W( |0 }* u2 b. V+ ^5 A0 [
- else if(FilterMode==CANRX16IDLIST)
e/ Q# n2 k# T' u - {
- X U* S1 s" S - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
- C1 t9 h( @# I6 q+ Z9 g - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽5 ]4 o; v. P* O8 ~6 \+ n
- }
' h9 o l' M( w1 V/ r8 a - //标识符寄存器FxR1
/ Y' i' |8 Y/ k& F - CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5; //32位ID,高16位
# \* v$ p: f: U& o - CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位
: t7 ]1 P: o6 `6 v/ d - //屏蔽寄存器FxR2
3 V( ?2 e, T. e$ R5 ?- m* ]: a - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位) x% R6 q& a9 m# k0 w3 f. j3 t
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位! n2 y6 u% ]: p' B! T
- , l6 m, T+ {6 i/ h' W
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0& y- p- {) M: P8 ~! T
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
2 R/ F ]. } p0 b) n
. @ H; F5 y' I: u$ t- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
! M( I% Q# j6 l4 k5 @7 h - }
" 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( ^
L1 j4 o1 w* Z/ V. F# ^ # Z, @* y* B! P$ B9 r
假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。- ID : 0000 0010 0010 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位 //0x011; N9 A* U! q+ n D5 |
- 屏蔽 : 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
程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDLIST); //32位标识符列表模式
`; g2 F9 J* D+ \& R, D Y9 \ - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)2 i1 ^# u+ }( o. V* R
- {
. Y& y1 Z, Y1 C- ` - CAN_FilterInitTypeDef CAN_FilterInitStructure;
; f& K/ I( H8 W" V) ` - # c: c8 v! I' s4 q$ \* A4 m( H F
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
8 I( l P# |+ K9 Z. G) ~6 O - if(FilterMode==CANRX32IDMASK)' D: W9 P( }- Z+ p! m
- {. i6 P Q% c/ a; }' Y
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式; d4 c4 W4 J0 W, Z" `
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
, r0 A+ F0 g, Q8 ] - }, \/ E7 @7 v5 w( ~5 f4 P- p
- else if(FilterMode==CANRX32IDLIST)
. Z0 n8 ]0 P6 \ - {. Q, {8 I# {, G, x- y$ ^# L
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式6 V3 A) W# {" \/ D9 a+ O, s, e
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 . H, `$ S" }' y* |1 N
- }
3 a1 @2 C" J6 U- m - else if(FilterMode==CANRX16IDMASK), c- v, R/ ~' f
- {) K8 m6 h2 z& S& q% V- e
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式- G: @6 y/ k( P4 G
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
$ a+ e; \. l" l2 B5 |) G; Q, i - }
, U8 W1 ~7 w2 Q: T, X# Q& h - else if(FilterMode==CANRX16IDLIST)8 e5 N+ v% j# E) R+ I
- {
- R* u" o$ ~" o- A - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
$ G+ r8 t" K6 ~0 t/ P - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
% ~4 Z% B# |2 H8 L9 h - }9 G. R. ]/ _- V' o9 W: x5 Z" J
- //标识符寄存器FxR1
$ [7 A+ R/ D) J0 | - CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5; //32位ID,高16位2 O$ ^& C) K3 J% `) I" s9 ?
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位8 k- P: l: i$ W/ ^: z
- //屏蔽寄存器FxR2
3 d6 u! j5 s$ ~7 p - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5; //32位MASK,高16位
' N Y+ v" y, \& T# j; g - CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位
* D/ S3 N2 R) q m -
( v5 v% w X& A$ N - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0: U! a3 ~, K; y7 A5 y- O5 ^- r
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
) f& i9 v7 s! ^& u% D# o - 8 Y: Q* u6 m' E- r' G
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化" w K7 \: O# u" M4 l
- }
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
6 k4 M" c. G& Q/ s. X
) k* z7 k0 c& q0 B. y假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。- ID : 0000 001x xxx0 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow
* L$ v @8 [4 e& |' q. o' z, j - 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh
7 S) D. z; O+ ]0 v7 a* N% I8 C - V8 J. f& o/ C% @% l, X. Q
- ID : 0000 000x xxx0 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow
0 j: G$ p9 g% s* _; q - 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh
5 K9 C: U2 W* l* o* r
复制代码 0 h1 y+ F9 K0 S6 \3 `
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDMASK); //16位标识符屏蔽模式
" n# p% F/ | M! N - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)
' H* B, O, r* G, z: s3 q - {
8 W! Y5 J9 `0 t - CAN_FilterInitTypeDef CAN_FilterInitStructure;/ K& S6 t7 Y8 \# e. |, Q
- % J* m% X$ M8 r& S
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选 U# c5 J1 D% b" H1 B8 f" T
- if(FilterMode==CANRX32IDMASK): |6 h: k1 _7 }( h6 a
- {% b% G1 f$ R$ k" X: H4 H$ ?
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
3 E; m/ f3 U+ N# s! K& M, [ - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
) E- p9 j5 D; W1 |: v) H - }! X$ I! w7 B \( P9 S
- else if(FilterMode==CANRX32IDLIST)
5 L. l( @2 [: g - {, A9 m: H- L" q! K. ^
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
8 B4 Z0 k! O# p - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
) H/ N7 Y, {4 Y+ B: R - }
6 ~/ F& w( [1 z' R, A( t! X - else if(FilterMode==CANRX16IDMASK)
8 O8 w9 f, f9 E1 M3 r8 C - {
1 Z: w. t. Y5 j% E. L7 c) J - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
1 t0 q2 N2 Q/ J - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
b5 a' `- W. v. e( w+ g - }
4 d( H; ~# W' ~8 t9 z5 A. g. D - else if(FilterMode==CANRX16IDLIST)6 X4 ?$ s7 S( h- w
- {. t6 ?( A% |) ~" a
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式6 O# U1 A$ ?+ z) L& Z3 ?1 n
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽: q! _4 A4 p8 G( N# Z
- }8 K: V! k6 H# e9 |
- //标识符寄存器FxR1
/ h5 @' L" V- @6 K/ X! W# j4 f7 q: _ - CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f; //32位ID,高16位 G; s1 a2 [- o9 e
- CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位" r# X" Q9 \: X# x- A* t
- //屏蔽寄存器FxR2% B. T" r; i! u: C/ p- w. F
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位' C' A" Q Q0 I- U/ j; _
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5; //低16位
6 Y' N) Z, C$ Q* m -
" ^6 o* N% B1 I; b6 R - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0) r, j$ ]" ^( w* X
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器08 z; S: S% c& m$ [: }
. n2 |1 J4 c) _+ x- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
+ t$ Q: Y: h) F. Q" B; g* n' g - }
复制代码 , 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* `
% f* V" ]# |1 Z x2 g" h
; t+ O0 f, i9 C+ T
假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。- ID : 0000 0010 0000 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow //0x010
5 b' I- i3 r! y- W ? - ID : 0000 0011 1110 0000 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh //0x01f6 V. C" X# r) S* G1 M
. g+ b9 q8 o2 ]' X! C- ID : 0000 0000 0010 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow //0x001
0 |# n8 c9 s: M. G; j) J2 j) D* k - 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/ {
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDLIST); //16位标识符列表模式
" U( e5 Y- k0 ?/ Z4 G( Q - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)# P* Z' l9 v& j
- {
o2 r) o/ {% ]! `5 D - CAN_FilterInitTypeDef CAN_FilterInitStructure; L1 u9 f5 a$ ~5 I& E+ P
- ' W# n) {2 l" Q a
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选1 y- t' b1 h$ ]2 u
- if(FilterMode==CANRX32IDMASK)0 p3 `3 Z( y# x0 W
- {8 |6 ?/ }9 [ n0 _
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式* i8 F8 h- \8 A: X6 }5 o1 ]
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 $ z. k2 k& x" U) Q. E
- }
& }: o8 p5 z0 J: {& ~ - else if(FilterMode==CANRX32IDLIST)
) _& R1 Q& Z/ K: O: i; a - {
9 `/ \" ^& x- @0 u; o g - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式0 D( Q9 \1 C6 J/ ~
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 1 e1 ~) f7 b2 }( E/ [0 a6 q
- }5 V- A; h! i4 E: N
- else if(FilterMode==CANRX16IDMASK)+ J* Z3 Q& [, h/ U a4 O
- {
. H D/ u2 t; ` Y- o) X - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
9 Z5 l: g) p2 P - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
+ E+ v% y$ j7 ?) y$ J; N( {1 ]0 r - }* _# _$ Z1 Z# S9 x; d+ V
- else if(FilterMode==CANRX16IDLIST)
% j* ]! I( V- N% Y - {/ B0 [7 \, q) ~% B; W$ K) D
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式+ b2 r8 @' O2 x* U# ~
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽" a8 N$ J5 J& O7 Q
- }
2 h: b( G0 w- Q - //标识符寄存器FxR15 A+ b* ~1 q) G/ V0 I% D
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5; //32位ID,高16位
8 L( g$ ~+ o9 F# B d3 U - CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位0 q& l4 k7 j5 M
- //屏蔽寄存器FxR2& ]0 o3 _$ W& {
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5; //32位MASK,高16位' v, q( i/ Q1 X
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5; //低16位
* z' E8 k" V9 h q" W -
( U$ V9 n, D- |% w - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO05 V; Q# J; a- [1 y7 H3 U6 p
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
% L5 V* L! L! \; L - , ^/ s# i+ L" F7 M
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化7 U K9 K- A( D6 [1 s
- }
# a- D/ j4 v1 L( z+ G
复制代码
- A3 R y- R4 ]# q$ A# w9 {7 {+ \$ l M$ J, B
|