一、前言学习了CAN通讯,底层的东东CAN控制器已经帮你处理完成,也就是CAN通讯协议已经做好,你按协议格式往对应的位扔数据发送就好,所以使用CAN通讯,我们只需要去关心制定发送的数据间的协议,也就是给每个数据加上有标识符的协议。如下图所示的CAN通讯发送数据的数据帧,Arbitration Field即是具有优先级的标识ID,Data Field即是要发送的数据,Arbitration Field、Data Field就是我们关注的重点,因为CAN通讯协议里边这些发送出来的标识ID并不代表节点的地址,数据是以广播形式发送出来,每个节点都是可以接收,至于接收到的数据是不是想要的?就需要对这些标识的ID进行筛选和过滤,再去提取数据。, [4 B( d: s j( ^7 I
 二、CAN 通讯接收过滤器的分析首先我们看下要配置发送数据的结构,如下所示。我们发送的Arbitration Field标识即是CanTxMsg.StdId,接收则会先过滤标识ID过滤处理后,再去提取发送的的CanTxMsg.Data。如果不是设定的标识ID,接收则不会去读取数据,到底接收方是怎样去过滤处理的。
4 M. [$ l8 [! L" U1 {
- typedef struct( Z: H, Q# o g6 e3 O2 b0 |1 a% \3 _
- {7 _; L' F5 H/ c9 C! f+ \5 y' C) `
- uint32_t StdId; //11位 标准帧ID即Arbitration Field
" g8 J( O4 C+ E* n7 l( Y* X - uint32_t ExtId; //29位 扩展帧ID
8 ~" ~% ~' `6 ^4 x2 a Y/ H$ X - uint8_t IDE; //1位 O:标准帧,1:扩展帧
2 ^ d8 c- U, t% V; `1 `" k - uint8_t RTR; //1位 0:数据帧,1:远程帧
3 B' x) Q! r! C5 Z. B: B' k- j$ Y$ f - uint8_t DLC; //4位 发送的数据的长度
) |$ n& H. p; x/ o9 I$ x6 S% y e - uint8_t Data[8]; //8位 发送的数据即Data Field7 r0 S" K. j5 \4 e
- } CanTxMsg;# M" t: H$ S& K( x5 V
复制代码
2 @- x/ {: A3 V: W: H因为STM32在非互联网型产品中CAN控制器提供了14个位宽可变、可配置的过滤器组(13~0),每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成,而1个过滤器组的位宽设置可以分成四种工作模式,工作模式取决于两个寄存器FBMx,FSCx的设置,如下图所示:
; t( W4 s" Q k3 c: y5 ~
+ p0 W: P/ P* |+ S : B8 l ]6 q! t4 {
看到过滤器的四种工作模式,工作模式中标识符屏蔽和列表模式,如何去理解,举个例子,假如我们发送的标识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>
复制代码 3 m3 x5 g( a: u8 p2 d0 I1 s- A6 V
x代表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>
复制代码
( }( l! K2 d& [ W6 O; B: ~4 ]6 Z
% Z* T) r" t7 k6 Z% ~3 t如果接收过滤使用标识符列表模式来过滤标识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>
复制代码
4 f3 {5 c2 E* H2 T: P* R& L6 ]. Z
这种模式只能过滤出两个ID,即0x001,0x002,所以列表的意思就是要去罗列想要的标识ID后跟发送过来的CanTxMsg.StdId进行校对,如果是则去接收数据,不是则过滤掉数据,标识符列表模式目的是过滤出一个标志符ID。 三、CAN 接收过滤器的四种工作模式的程序配置
8 s* Y1 X$ N1 w1 ?; ~! U6 `. _& y1、32位标识符屏蔽模式9 L, g- C& E0 I& E/ B
! H8 X T' I" E9 s
8 i6 s$ A6 r) n9 y

. \7 d+ Q# T! K, ~0 _' E假如要发送的标示符IDCanTxMsg.StdId范围为0x010~0x01f- ID : 0000 001x xxx0 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位
, U8 ], N3 Y4 k" G6 m; i - 屏蔽 : 1111 1110 0001 1111 1111 1111 1111 1111 //分别对应CAN_FxR2高16位、CAN_FxR2低16位
复制代码 2 `7 f. t1 ^9 l7 d
. Q. K+ y2 B# a1 `) T
程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDMASK); //32位标识符屏蔽模式: N6 E1 J" g4 M2 z% o( Y, z$ j' R
- void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)& F! H0 `. O7 O" n# |$ `( a7 z. C
- { h4 h2 |, O- T' ?
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
: j- R6 v+ M o2 t" A+ l3 e - 7 D, j) Q- J0 k' a6 `) W2 X! @
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
1 M! f# r+ C2 {" S - if(FilterMode==CANRX32IDMASK)
6 D# F9 u' N1 i$ Y, X4 k5 J" q - {
$ _+ d) ~9 T1 p$ a* F - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
1 t( }! B1 Q4 V - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 * \) Q0 ^& @" [1 Z: o; v
- }9 }/ A% b) c, u+ @7 P
- else if(FilterMode==CANRX32IDLIST)5 }( w8 b0 k8 v
- {) \: I$ {1 S2 v( M: r3 v0 X
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式# v# O1 Q2 ~0 q$ H# H8 S
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
( q* f) s, ^# Q7 M: G - }: }# R. q! j( T2 P9 Q1 r
- else if(FilterMode==CANRX16IDMASK)
8 o' M; o# e* M4 i" {8 g) d4 J; V, K - {
- @4 t* T) i+ C2 {, y D( g, {9 R) A2 [ - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
. C: T* C0 C. R# N - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
) c5 S* M* Y; K; O6 D4 K+ b - }4 W. d, K' b6 D `5 M$ j
- else if(FilterMode==CANRX16IDLIST)2 O( o* G p/ R7 K- p( D3 X8 v8 K
- {
' S& E; g6 J! @# s t+ j' H - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
" @0 T% b( X* F: l" b& d o - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽9 C% B s. h W/ ] c) x
- }
: E1 a7 I$ L Z+ y( M - //标识符寄存器FxR1
& P8 Y E; I1 f* X3 a o. M0 y. V - CAN_FilterInitStructure.CAN_FilterIdHigh=0x010<<5; //32位ID,高16位9 g- X" P: J) y f0 x
- CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位* f) k+ B) R J. L3 o5 @+ b
- //屏蔽寄存器FxR2) W) K) K6 D. {# [2 B
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位0 |, }+ p8 y: w
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位
/ t `$ i4 {) X, k [ -
, h2 c' r! M9 l) F. r7 b - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0* G) _6 {: z( O F8 C. J) A
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
% j# L* X8 w2 S0 M% V - - Q; J) \6 ]: `6 a Q# M% `6 M
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
. \" v5 d* D) G( J; [" S8 o6 @ - }
4 @: A( s6 M7 M3 j* F: c
复制代码
0 O& C- y. r' i' U7 S: ?0 h
9 v' A& u# Y! ?/ _/ t3 K4 H: S1 a- X3 ?/ ]8 _
2、32位标识符列表模式
8 |! ?" O! h2 J1 w2 M' x4 [# p3 V4 y6 U) [3 b1 ?* ?# g
8 Q5 I4 S" P7 ^. ?' |: r6 N) | ( w* S9 W ?6 I0 s: {4 v4 a
假如要发送的标示符IDCanTxMsg.StdId为0x011和0x012两个。- ID : 0000 0010 0010 0000 0000 0000 0000 0000 //分别对应CAN_FxR1高16位、CAN_FxR1低16位 //0x011* a5 N2 {2 d+ y1 A0 \( `' U/ Y
- 屏蔽 : 0000 0010 0100 1111 1111 1111 1111 1111 //分别对应CAN_FxR2高16位、CAN_FxR2低16位 //0x012
; w; D2 F. s0 r ]8 j( T- r
复制代码
2 r- s+ e1 v. G, m6 T# @程序配置如下: - CAN_RxFilerconfig(0,CANRX32IDLIST); //32位标识符列表模式
4 I/ C& d# f: e* C# [4 y# [ - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)( q& P: c. S. p/ @% w5 A D$ o
- {+ g& r4 M7 [* r) L
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
; a8 J# S* w, V- m -
7 v2 M# s" v) G2 @ - CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选
* ?0 \( q$ B' _ - if(FilterMode==CANRX32IDMASK)
3 S, Z @; [6 S5 k2 N - {
" _8 l, C$ d9 S1 F# z# R+ J - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式% W3 E j0 ~$ o8 d+ t
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 4 O) Z3 W9 j. P
- }7 Y' f9 n1 z7 i( j+ m+ E7 N: L
- else if(FilterMode==CANRX32IDLIST)
1 N& A% [+ L0 B; [; j# } - {
, y f8 ^7 u. K: v6 M2 x - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
1 u7 `4 R$ v+ c0 P4 }- N0 T - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
* T- b& r/ ^0 ?% X. a - }
5 ~ W1 A) m6 X" j" M - else if(FilterMode==CANRX16IDMASK)
- m6 H! ?* O( z* Z# a& Q* q - {+ d: X. b! O+ G! O) a" U1 J# d$ a" V
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
5 i- N! N6 n6 ?) v - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
! `: t D1 O; U4 B4 r! ]! B S - }2 ^1 X8 u2 r/ e( ?
- else if(FilterMode==CANRX16IDLIST)" D" F8 a# ~3 h: \; c' D
- {9 g0 B# r2 J# M: C8 z
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
' A# C% ^0 Y+ D K6 g$ q - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
) Q2 Y( Y; U( @5 z& D1 _ - }$ U7 {# R2 e3 @ P7 e$ j
- //标识符寄存器FxR13 }! v$ ^0 h9 h( s# ]) _5 c
- CAN_FilterInitStructure.CAN_FilterIdHigh=0x011<<5; //32位ID,高16位
: C5 a S5 {8 Y, T& c. a - CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; //低16位
9 K* k! ~/ R1 s - //屏蔽寄存器FxR2
: u% f5 w# |- L1 E/ M* E. }- s - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x012<<5; //32位MASK,高16位! B4 W7 |: _3 f% e
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff; //低16位
9 o3 G' D; | q: U% q - 0 a2 C& {& {: F2 U# R$ g* e
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0) N" ^. D$ u1 _! H+ _9 C3 k; M
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器05 @( p0 q, G* Y6 G* E7 R; p- N+ I$ c
" _3 k3 a0 I9 ?- d. f; p5 T- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化# ^% \7 x# x4 ^. o% D* } y2 ^# o
- } 6 ^$ S N% N* U8 a# s
复制代码 `2 ?7 K9 |) Q! p+ b
) l/ G! u( P4 R6 u7 U) W3、16位标识符屏蔽模式
# N3 V2 g2 P9 N1 @7 B
H9 p; I, d2 ?9 n a% ?
) \$ W8 E$ M8 ~) R# b) ?

- X$ E- z0 n4 ^3 t4 V2 ^假如要发送的标示符IDCanTxMsg.StdId范围为0x0100x01f,0x0000x00f。- ID : 0000 001x xxx0 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow
2 W$ m; ?+ J. o# Q; G - 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh
$ e V$ X" g" L5 w0 b# X - 6 a: Y( a, A) }8 d, ]
- ID : 0000 000x xxx0 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow* W8 \- m3 L: p$ N4 t+ P: \
- 屏蔽 : 1111 1110 0001 1111 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh4 [4 h) _5 F' v" u K( s
复制代码 # o2 s4 y/ f6 C1 o6 Q! O( k6 o& R
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDMASK); //16位标识符屏蔽模式
: }8 {4 B; U$ t7 D) c( @ O; q - void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)& a0 ~' Z# c& u
- {$ {. q& \# s1 ^5 y
- CAN_FilterInitTypeDef CAN_FilterInitStructure;( N' f' |+ B0 G: V1 ?$ K% D3 Y6 q
- 1 @/ N! F9 I1 U. e) R# ]
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选$ S' m( B0 L8 y r$ R' Z+ d
- if(FilterMode==CANRX32IDMASK)
' e) P7 q4 U, _% I; m - {
4 i3 i+ [- M+ T7 W& m: _9 I5 p - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
' t# y6 _- h1 s' R* ~( | - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
( K4 y$ h! L+ | - }# T0 u H0 {6 @- G, ^9 _9 b
- else if(FilterMode==CANRX32IDLIST)
& ~2 Z1 t/ |9 r- Q - {3 ]4 k" b# n; M6 _
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式) p: _: n7 D3 w1 j
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽
8 M; z6 C5 H# u% i - }
9 I5 [7 F# X+ [% D8 G; ]' U6 @- | - else if(FilterMode==CANRX16IDMASK)
! `; h! ~ H+ ~* G - {
, T) \& U7 u% S - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
# \& S9 X. l+ ~ - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
2 e! A K/ ^' `; v - }
4 F9 T- a: Q1 v- f' N - else if(FilterMode==CANRX16IDLIST)
# t9 _/ I& p1 I* W) w - {
! _' U8 k2 c8 a( M - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式
6 B3 J1 c) l( V - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
# P, n' B5 A8 e6 T0 I9 s - }
8 g/ L2 C1 `8 x; F7 v - //标识符寄存器FxR1
3 J( u- U* [5 K' r4 T. m - CAN_FilterInitStructure.CAN_FilterIdHigh=0xfe1f; //32位ID,高16位+ F' E( l) a; \+ J+ O: O \+ P2 T
- CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位* Q" }9 U+ T( \
- //屏蔽寄存器FxR2
- ^6 Q8 v& b2 T% l - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xfe1f; //32位MASK,高16位! a- @: X, o+ E# I
- CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x000<<5; //低16位5 V2 `* l5 T& O7 q
-
0 s0 d7 _9 Q" Z7 }: C - CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO00 x9 ^4 L" f6 Q! m5 P
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
0 m9 F/ p! }+ q) ^ - + b( v( l Q$ }% S, n# _: \) L
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化3 U/ c; z3 }2 u, O: W" h
- }
复制代码
5 K5 W! K" w" l. g
3 H. ^" |+ ?' [. W6 x- w" k, N' Y4、16位标识符列表模式. [7 R0 \$ U; w3 Z' U4 R4 F5 H; W
0 I5 H- b1 K/ r& ]
1 y- U a8 k8 I6 A3 N
- y r, D5 e# T: J3 }0 b+ Z假如要发送的标示符IDCanTxMsg.StdId 有0x010,0x01f,0x001,0x00f四个。- ID : 0000 0010 0000 0000 //分别对应CAN_FxR1低16位 CAN_FilterIdLow //0x010
8 g8 C' P! L8 o! C4 V/ d9 r - ID : 0000 0011 1110 0000 //分别对应CAN_FxR1高16位 CAN_FilterIdHigh //0x01f
" n3 p7 N/ K4 m9 ^2 {/ a
M! A( V# e& g5 G; K- ID : 0000 0000 0010 0000 //分别对应CAN_FxR2低16位 CAN_FilterMaskIdLow //0x001
* R" o! t3 c7 B$ G" } - ID : 0000 0001 1110 0000 //分别对应CAN_FxR2高16位 CAN_FilterMaskIdHigh //0x00f
( R' C0 O5 S9 ]( O/ ^
复制代码 T+ ^8 s! w4 f% n
程序配置如下: - CAN_RxFilerconfig(0,CANRX16IDLIST); //16位标识符列表模式+ B) y$ p# J4 [3 _# _4 Z+ @4 G8 b4 w
- void CAN_RxFilerconfig(u8 FilterNum,u8 FilterMode)6 U0 }4 u( I4 o Z6 f( n- J
- {+ K! V1 Z4 {4 E( f7 P+ o7 A
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
4 \5 l e2 g R: s - 2 `" v8 Z& {$ j' v. E
- CAN_FilterInitStructure.CAN_FilterNumber=FilterNum; //过滤器号0~13可选: |6 Z# h2 j4 P3 D
- if(FilterMode==CANRX32IDMASK)' J! L* z5 F+ }( K( U* f5 L' Y
- { K4 m$ }/ S9 N! x/ G
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式( |: c/ b% O0 Z, ?; v% n8 {: n
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 0 N. \* j' j* o/ x2 M
- }
5 ? b [1 X2 C$ M% i - else if(FilterMode==CANRX32IDLIST)
( w1 e1 E! y# B4 y3 ^9 h, p1 q - {* y: l7 I* o8 t& x; M
- CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式+ q9 |! y% J4 f% _8 k
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 ; Q4 `8 z0 `" y7 ^- G
- }
0 h: ?; n3 t, I9 V - else if(FilterMode==CANRX16IDMASK)2 q+ e0 o0 B- A9 ~; o3 ] \
- {
3 a7 K* k/ D9 j3 I( S- q - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //标识符屏蔽模式
# V4 {1 K7 z+ ~! G9 T; \2 L - CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽 ) q. Q/ b8 w0 s& r1 P
- }
/ d; C8 `' u6 x0 W& f' n3 Z - else if(FilterMode==CANRX16IDLIST)
5 y! l: e- K$ |$ p - {
! O o& e c" ^2 u) i) h7 Z* { - CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //标识符列表模式9 |4 U7 }& c, l$ Y* O* B
- CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; //16位宽
$ e- Q& e! L7 {& ^3 x8 e" V, f - }5 S1 e- {9 b7 F9 a& s! ^- [3 V
- //标识符寄存器FxR1
5 F! f: \0 F5 z+ H+ b - CAN_FilterInitStructure.CAN_FilterIdHigh=0x01f<<5; //32位ID,高16位
- S2 N: @/ D) k - CAN_FilterInitStructure.CAN_FilterIdLow=0x010<<5; //低16位( R+ ]; x- r( B: V
- //屏蔽寄存器FxR2
0 W; |. y* z0 I - CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00f<<5; //32位MASK,高16位
+ O/ S9 \ v o1 U - CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x001<<5; //低16位
" s- [ ]/ d! _; ?4 t - 0 N) }3 |! K2 @$ r5 |. o- J' n
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0; //过滤器0关联到FIFO0, n$ Y, j$ X% B; z+ m! v
- CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器03 n# `+ Y1 ~) z: a j
- 8 D( h. @) N9 s
- CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
4 R( `$ T) q5 R5 E - } " \2 S8 _. _* \
复制代码
! E8 A1 {6 s R- a9 G& O8 _, [' b/ ]" b' K) H
|