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

基于STM32的经验分享之CAN控制器原理与配置

[复制链接]
攻城狮Melo 发布时间:2023-3-21 21:41
一、CAN控制器简介' r4 J  f& ^9 }* J

3 _8 u# q& b& ^/ T) G. B1 _5 \8 BSTM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:, ^: o" W; E( \+ o* V' n9 _
1、支持CAN协议2.0A和2.0B主动模式. q0 z) T0 a$ G# g, s
2、波特率最高达1Mbps
6 Z, B* B# \9 [$ \8 {3、支持时间触发通信
* S3 H* H: f# M' i4、具有3个发送邮箱$ E1 p. O% f: Q# P
5、具有3级深度的2个接收FIFO, p3 U1 N) w$ A2 Q; D
6、可变的筛选器组(也称过滤器组,最多28个)1 H8 [4 b( F" m: `  v$ L/ [8 }

7 T. l  x- }" M- j0 g0 v CAN控制器简介-模式
+ E! U% C& X9 p' `+ K2 w5 X( V工作模式
, g0 n6 `5 W$ l# Z1)初始化模式(INRQ=1,SLEEP=0)# \- H" F" b9 A
2)正常模式(INRQ=0,SLEEP=0)
/ F+ T  T. B4 }: G) N* a2 ]3)睡眠模式(SLEEP=1)
6 K$ g- }! q9 m; J
通过CAN_MCR寄存器控制INRQ和SLEEP
; @+ ]! f# j, x, C4 n; W测试模式
' O( r7 x! k  w2 S: ?1)静默模式(LBKM=0,SILM=1)
, D, \3 h( F+ k5 K) u/ S(静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)4 Z. g! J- s5 S+ G- X4 k
2)环回模式(LBKM=1,SILM=0)/ j( o: A% l# P. ]1 a& o
(环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去): |8 h+ o4 L$ G
3)环回静默模式(LBKM=1,SILM=1)% P5 B  J4 U3 ]! u8 V$ t
(不管总线上如何都不影响,自发自收,“闭关锁国”)
9 |3 Z$ A1 T* p8 _) t! s$ w1 j通过CAN_BTR寄存器控制LBKM和SILM  e0 _7 I0 D& P$ @) y

+ U# N3 G" a6 L' p. P9 v  C 标识符筛选器
- d5 n6 \6 |# P& j  N7 d1、CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值来决定是否接收对应消息。# Z5 k5 X9 G* a6 L  S) b7 r9 O
2、STM32 CAN控制器提供了28个可配置的筛选器组,可以降低CPU处理CAN通信的开销。
% L5 f! V6 d' L, m$ M3、STM32 CAN控制器每个筛选器组由2个32位寄存器组成(CAN_FxR1和CAN_FxR2,x=0~27)。根据位宽不同,每个筛选器组可提供:1个32位筛选器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位;2个16位筛选器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位
" b  D) \+ P4 [& ~" ~, X/ Q! R4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。5 @9 T2 t- s9 Z5 Z5 w& Z) b' h
8 U" @: m7 a( U+ n5 q
通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式
/ T3 {8 j  J% o/ ?
5 Q$ Q! ]. D! M$ T% Q6 y; H" M
ef78eb2b71bf4a48a7fd4b2fecb3409e.jpg ( A! j" A  K1 D( j! U9 v" n/ E
3 u  D1 a& t0 O9 K

* l6 z6 w$ p! C" a1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。
6 T( B6 Q: M7 t1 c) H9 J) F# y6 r2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式
* Y/ G( p" J4 a0 k% z3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。7 Q9 f$ @" [- D
筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。
4 R* ?! b/ d% x* l, b7 J4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1, x6 y! b* e/ j3 F1 @. n

! B, X. b3 ]2 i# d# }* R% JCAN发送流程:* b% q* t" |1 y& {
% F$ Q* R5 s$ q& q
f7af5fe7fce04aff9dbef09a79d8c88a.jpg
; r6 G7 J) t4 A
4 n7 X8 p7 [. [) ^. g% g程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置+ C, \8 u" B* Q; h4 P4 g

5 v2 }8 v% p! q& i) u8 @2 `; Q1 ]挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。' R3 q; t7 x5 u- n: L0 v3 E; ]4 i
1 e/ `8 ?- x: h6 i

; s0 }9 N  \+ `, d( q! fCAN发送流程:+ S) A* K* }; v6 g( _

% w2 D% Z! r, \5 U' X2 K7 y
c5f1832615ca4bd0ba117b8f3fc47543.jpg + J+ e0 S, T. l6 M

! f3 @! `: _1 E0 j. b! Y( ?  eFIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)
& k2 Q4 }. x, {- e
% r$ k. ]1 [% w( C4 H—>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。3 P$ c- C$ L( o/ l2 z& A- a. S5 D
, k- @: A5 o" N$ I& G' B
CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。! S& r! p. {3 `* @% \6 d

2 P8 N( m7 t% y9 K! R+ u( A报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。
+ }4 m) ~' A% X! m2 R8 w* n6 Z2 M; v- v
~~STM32的CAN位时序,如下图所示:~~
( _$ g% p* n! p1 b$ K& d0 z" E( B4 C& |$ T+ m
398d7cadc08542a58266e60d7b1a9026.jpg
* G: Z/ b, ^; p1 G; j9 U; E& d1 s  S& }0 A$ u$ n4 s
(STM32的CAN将传播时间段和相位缓冲时间段1合并为时间段1)
( [/ H6 k5 ~: b( [  ~& t# `- }1 P! Z5 U7 O# v$ W, g; }+ u' B" {' V
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kps。
  [# d7 b( Q: m7 e6 t0 H9 Q% b* D7 X0 p/ L  ~- G" [$ S

8 s: r3 v' y& L! j二、CAN控制器--寄存器简介

4 E; o: a2 S' f. k3 `1 j0 @, `7 y) ?0 M- G
a0f05929b11e49458f73736cd4e507b8.jpg
7 l7 I3 a5 T, c0 c1 C$ f* a( I6 _
# x$ m2 t, g* w CAN主控制寄存器(CAN_MCR): i+ ]' y' p  ~+ d6 z5 T' P3 ]- X

8 d5 d' P  [' t" p, |0 T( f5 @
48142c9ad27740378eabcd794e21b1e0.jpg ! U% m- j" _9 W  T3 F

% X/ w4 V* Z4 d# mINRQ位:设置INRQ=0,可使CAN从初始化模式进入正常工作模式。设置INRQ=1,可使CAN从正常工作模式进入初始化模式。! M6 ?0 ]4 j! F0 F$ L7 e" p8 D
& ^( w: {2 {& q% z
CAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作之前设置),之后再设置INRQ=0进入正常工作模式。" r7 Y/ l5 k1 F

! U' U7 i0 }$ sCAN位时序寄存器(CAN_BTR)
& V  h2 y2 }2 a. d. N
% @( b3 ~% j+ s  X3 J
c5c35be6358c413e9b58e27ee1fbd616.jpg ! P* G4 X: A, i: D9 M

+ u$ g+ q9 j% ~$ g2 ?
+ ^- I( U& u3 a6 VCAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)
$ s; Z4 J- C( q. e' g/ s7 l( {7 Y. g" n1 j
4da30d99b5cd4719bba6422723ca7d76.jpg 3 O. g+ N6 ^* |' w+ W
; F1 b) B) g6 o/ C4 f1 J
CAN_RF0R用于控制FIFO0;CAN_RF1R用于FIFO1控制。
8 h' h" h. G* N/ {
0 \8 p" \0 a+ y6 V! z) p' F
CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)8 i; n( D5 R4 C( D6 J, r+ F

' [& i8 p  p  s
8db56047549949be922d0bb75ab20afc.jpg ! N  d( m4 h& u1 g# _
; _9 ?8 ~" n* i2 x. \4 k
CAN发送邮箱数据长度和时间戳寄存器(CAN_TDTxR)(x=0~2)
+ A* B6 m" T0 H
8 R0 D8 x$ N; d( S8 W
fb33380a7d444ac78aa53c87582acb19.jpg
4 ~9 K5 u; [$ p- s0 ?0 d" l) C/ K: b1 F7 p8 S! p' Z' C* C
CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)
9 q4 {' W. P$ S
9 J2 O2 X4 ^" F# P4 m
b71d9dd1da35446f951c60a656f3dcc0.jpg & E/ p7 ]& m& \  m7 Q
) t0 B( h3 v  x, c2 X
图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。( n" a" j9 K# m% |
  [9 ~. P) A- V; H4 N% y

2 ]; ~' @' Z7 N/ z- E! LCAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
4 j$ a9 d7 D! s2 Y
# o  f; P8 }  e. R
c8d44acce479495a83dc7b26b315c760.jpg
' D7 A* X  l/ O# k5 F7 ^4 \" D
7 n7 {) r. W* H  F, mCAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1)% \# m' e2 @& R: S% W! M1 r

% d- P+ Y7 `" m& W7 m
48d3529655a64ed4ba03f4192e100d8d.jpg , l1 m6 _9 U. d" Q! V. d6 K) Q
CAN筛选器模式寄存器(CAN_FM1R): v9 x8 b  E8 d7 c

& S1 V* n( u* I- s; ~1 L
77cc47b02c6f455fb3cfeb0e426fe5f1.jpg - X3 ]+ W/ }: f* H- t5 A7 B0 S

' p* G6 V: M1 _9 B9 ?1 `9 J该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。
4 D( w  o7 \$ E* h, h. Y5 r+ h& B* Y

  I/ B% {! K+ TCAN筛选器尺度寄存器(CAN_FS1R); C/ i1 H# k2 I  {9 L. D
: B* D! ^9 A% \- U# o, I
12cceb49089b44e6bc7dcad194605d5c.jpg
& N9 U  C8 Y% p5 Q8 [. a+ J2 E/ L9 Q4 Q
$ Q& M6 q9 X( W/ S8 @1 a2 X
该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。
% c, {, o1 B' t6 p' P8 F5 d& p9 v1 ]
CAN筛选器FIFO关联寄存器(CAN_FFA1R)
, h5 t. a1 L8 b* y2 y
( ?! \) c/ b' p6 m" z) j
caaa8198119e4182bdfcdd33d898cbc1.jpg ; i% e8 U5 V* |
7 K, m, K5 {5 [* o! w
该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。" x) N) A5 ^6 J7 t9 N
% S9 P# u! l& B2 `9 f
6 I' D, o8 |, n
CAN筛选器激活寄存器(CAN_FA1R)
+ _7 W2 f1 T9 a+ |6 m2 G+ ^: ]- K4 e
8b95c073f5364f32b222afafcaa40319.jpg
" O" o( T  f) K9 t; E

5 ?1 z2 ]9 E) ~. m/ o( t# r该寄存器用于设置筛选器组的开启和关闭。对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。
& g0 ~( X, `* S

8 r+ v9 g$ Q8 M& ACAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)
/ `; r$ n, k, b% X: W6 T
* G% ^' L2 a! F6 j: L' |. V
11ac5d2269c34ea994d95424a46dbe4f.jpg 2 |6 ]( k" J% |( N4 X$ d
; J8 H/ k: L" O! j
每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。
7 o4 D& m9 \! S; x
" t  Z. R/ q1 X7 i6 B6 s* J
, ^8 p* _$ a; ^; F# ^
三、初始化流程* Q& X, t7 |. g
1、配置相关引脚的复用功能,使能CAN时钟。
' P: }$ Z1 L9 Q6 B* f: Q7 O要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。2 F7 A3 t- ]  f9 w$ w# Z; K
( h) D. B) j% _3 I7 j3 I
2、设置CAN工作模式及波特率等。" ~4 y- R3 b! _+ ~- U
通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其它相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。* ?; p9 a* }( K9 ~; E
9 |# I# A* j5 h& J) _2 b
3、设置滤波器。
- K- m& ^4 Z; g例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。' f4 R4 M$ M4 y' P6 l' |( S: Y  ^, C, }
————————————————" M+ g' h" c. [4 i$ \
版权声明:三只树懒& ]( m0 q; |/ ^/ d: \

% ~* s2 u2 \8 t& [; _如有侵权请联系删除8 H: l- R2 i3 i- o* j9 z
$ J# o0 Q( U. d% r8 X* I2 b

6 r0 o+ V; n% o; o1 F' m0 R) j1 f: e
赞 收藏 评论0 发布时间:2023-3-21 21:41

举报

0个回答

所属标签

相似技术帖

官网相关资源

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