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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-21 21:41
一、CAN控制器简介- M+ f' X! T- Q$ k( J  F9 q3 j

5 g1 x7 T/ D% @STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:& ^5 H3 ^9 ?- x3 U# v* M
1、支持CAN协议2.0A和2.0B主动模式
, q! y- x2 ]" ^0 Q2、波特率最高达1Mbps& b& O+ \) V5 `, a
3、支持时间触发通信: j% m+ @; B% z3 n6 H# U( g
4、具有3个发送邮箱
+ g1 V: l- B. b0 ?: t5、具有3级深度的2个接收FIFO
6 ?% c" t1 @3 i) S6、可变的筛选器组(也称过滤器组,最多28个)
  T9 Y( [8 R+ {7 f8 c* w1 ~
8 L9 X. o- v0 g CAN控制器简介-模式$ r$ y9 p1 k9 ^4 `% p$ [  T5 l, ^
工作模式
; W8 }2 ^+ ?5 U5 z' c$ a1)初始化模式(INRQ=1,SLEEP=0); L- R0 h2 \2 T$ @! S  j  C
2)正常模式(INRQ=0,SLEEP=0)
$ }9 [4 R  l. Q  i; o+ i3)睡眠模式(SLEEP=1)3 V. Q) S( A5 \) l- v
通过CAN_MCR寄存器控制INRQ和SLEEP
' G, p% w; x: g9 v4 o测试模式
& ]5 \, x: {; g; |3 U1)静默模式(LBKM=0,SILM=1)
' \7 s  c! _/ u1 L' b(静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)0 u: n8 A6 v% S8 X+ w) c
2)环回模式(LBKM=1,SILM=0)+ U! h9 G4 \7 p% O0 N
(环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去)" c# h% x" d. q' f; s
3)环回静默模式(LBKM=1,SILM=1)  Y' W1 H* z& d3 x' r8 I, Y* i
(不管总线上如何都不影响,自发自收,“闭关锁国”)9 D. x2 `; ]  Y$ N# h
通过CAN_BTR寄存器控制LBKM和SILM
6 {7 n  ^  v% j' F9 l5 Q6 x8 H" E( E! ^: e/ K  D, Z
标识符筛选器% Y) [+ ]- O9 d5 ~
1、CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值来决定是否接收对应消息。
1 _& F5 s" C+ {4 g2、STM32 CAN控制器提供了28个可配置的筛选器组,可以降低CPU处理CAN通信的开销。
$ j7 r( ]- \! @- `& w. ^3、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]位
! Z+ ]) }; T$ Y4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。
* h1 L& R  m9 x9 T9 R# u

. M! s1 T1 V5 u2 `# b3 d通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式

! B& X& s- L7 D6 G6 K# Y& i! e3 D7 J# O
ef78eb2b71bf4a48a7fd4b2fecb3409e.jpg
$ M' J& `! G7 [
- [  g0 u6 m" ]; d# u5 t

, H; i& f- {& W9 @: ?8 z1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。. z3 J  q" G% c6 [
2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式
7 k  S, C. ?3 a- R0 l, [3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。' s0 f) |' u0 N6 M+ Y
筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。0 T2 Q: Z( h, q
4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1' l% v5 P! ~% u% ?# v

: _, @! P2 u/ I8 |0 [: }) u4 S0 ICAN发送流程:4 Z1 w/ t# Y4 r6 V! ]
! Z) A4 G# x/ C. g
f7af5fe7fce04aff9dbef09a79d8c88a.jpg
; E/ r  [' P9 s2 z0 a1 Q5 z4 \& R. n' o9 o6 V! J, J
程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置. C7 V3 {0 `7 ~* `- Y  [

* G6 f+ E* G: x) _& d: V( b挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。+ b( E1 M* r3 L* [

5 @6 E% J5 Q* _) r' D+ z- k7 P7 U
6 K- s! a& c" U/ {" w
CAN发送流程:$ F3 _. u" H, j2 g8 Y9 V  v
0 Z. i. [( D: X5 |) j4 d
c5f1832615ca4bd0ba117b8f3fc47543.jpg
% N* a- `4 H: n3 S1 [6 |. S
* U/ b! |* Y% o8 t( @% |4 s$ c
FIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)
7 B- |0 ~) Y' e7 U4 P( [1 b0 n' h; m2 t( F! x; w
—>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。
+ Y. w: t2 f& N% o. D) ^, Q) x1 B9 H* t  `3 j
CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
3 n5 F5 b9 i+ e: @* v

& F: r, S1 q! s3 K& ?, [: Y报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。
+ Q9 C) ^- ~) p
4 n4 U) Y  O+ G5 A~~STM32的CAN位时序,如下图所示:~~
$ f( W+ S- W+ P9 q6 p% j; c, h. |/ x0 r
6 R  L8 I) |- w* X
398d7cadc08542a58266e60d7b1a9026.jpg
$ g" e$ b0 Z+ |, Z9 y5 w, u: x0 }9 X& Q7 z; i' O6 U) i& {# T
(STM32的CAN将传播时间段和相位缓冲时间段1合并为时间段1)
( j3 [! ^5 }" p$ P$ s+ M& z5 s0 r( W' H5 M6 s* z  l
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kps。+ C9 Y9 ?2 P  @5 \$ G: P

& I$ k1 ^! e. n* H9 M

: Q$ @0 H1 Q5 t二、CAN控制器--寄存器简介
% y9 l( M5 w- d3 C/ F

( B& k" Y% F8 {+ x0 [
a0f05929b11e49458f73736cd4e507b8.jpg
- S/ z8 ^- H" D$ O' \) V9 h0 J: s0 h: J9 p$ f
CAN主控制寄存器(CAN_MCR)
6 G3 i2 o# k/ {3 m& i
! }4 F( p" E! x+ X. `1 g- G
48142c9ad27740378eabcd794e21b1e0.jpg
0 d) p& Z( p% W

  Z9 P7 h3 k2 ]% ~INRQ位:设置INRQ=0,可使CAN从初始化模式进入正常工作模式。设置INRQ=1,可使CAN从正常工作模式进入初始化模式。
: q# J8 w0 T0 }# S4 n
- Y9 m. U6 y* ^# HCAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作之前设置),之后再设置INRQ=0进入正常工作模式。
/ C/ t5 x- D! d- ?/ P$ J$ E1 F

  ?2 Q) C3 p& {1 N2 y0 r% KCAN位时序寄存器(CAN_BTR)4 o- h7 X2 R+ Z; s' Q# v
+ {5 S! [, o& t
c5c35be6358c413e9b58e27ee1fbd616.jpg
3 P, p) J2 I/ q3 u3 S! G% j  T1 B0 T. L( ~; {

/ q: r3 F' ]$ X2 r8 t( u' NCAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)- \3 x$ X. P* X$ d- r
4 M, [4 a- z4 q5 s* R- A
4da30d99b5cd4719bba6422723ca7d76.jpg
" l. J3 D% S5 E& s4 p* K% {8 q7 U! t( X" r
CAN_RF0R用于控制FIFO0;CAN_RF1R用于FIFO1控制。
- _1 G% w9 J" b( ?

: o) L0 H+ H6 y! x4 C* k5 }CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)# }5 j; H  p( a9 }# ~# H. N

  X  V% B- _" _- S  H
8db56047549949be922d0bb75ab20afc.jpg
* }% S4 A. w6 T9 K& P: f8 [

! d$ A- a+ Y) w, B+ ~CAN发送邮箱数据长度和时间戳寄存器(CAN_TDTxR)(x=0~2)2 U3 y' ^1 N7 K* Y3 G
/ f% l- L) M6 @! X9 M' |$ r
fb33380a7d444ac78aa53c87582acb19.jpg
& c  q) w5 u) R! \; ?6 b7 K: n! f$ Y1 W: S7 e: `
CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)

0 I( \) y8 \7 e
4 T4 R1 V2 Z- L( T+ b
b71d9dd1da35446f951c60a656f3dcc0.jpg
$ i8 t, }8 L+ z. p0 C1 f8 N1 G  q5 q7 u" @' Y
图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。
9 Q7 S2 ]: i8 H0 F# r- I$ u
9 s# q% t5 G* ?) E( F1 b) Y! I

8 ?" L- K' O( w( ?' Q2 F. }CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1), P* K8 M5 w0 S, D

0 e' t; f  _* o* {' C5 n8 q
c8d44acce479495a83dc7b26b315c760.jpg ( ]1 d# N2 a8 V' p$ o

  n' c" K* Z: `. }' d. SCAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1)
4 ]& W2 @3 F+ S: J/ t- o1 L
  c3 \& a3 e- h, b- J* J: n
48d3529655a64ed4ba03f4192e100d8d.jpg
9 @8 r! ~% o+ g  V8 S; zCAN筛选器模式寄存器(CAN_FM1R)( S- E2 h" U0 y% \7 x
8 o3 f8 |' i- ^9 ~. I; v% o
77cc47b02c6f455fb3cfeb0e426fe5f1.jpg 2 {( e1 n9 K) D7 ^5 d

! B' S) `; Q$ Y/ ?$ v3 ]该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。
2 Y3 _, J0 A! m) f9 y! [* g

3 i6 R7 R9 p- c. }* YCAN筛选器尺度寄存器(CAN_FS1R)4 d. b% y" L  ?' W6 ^, B0 @

8 E9 |8 y2 M4 f2 P/ s: h
12cceb49089b44e6bc7dcad194605d5c.jpg , R! A' R0 n( h

, W9 k, l. M% f

  B; h2 u. t% P7 s9 C, k该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。
! v' j9 J% l# q/ c; M, r8 {  ?% B' n
  ^. B& y6 F, B+ ?: O. c8 lCAN筛选器FIFO关联寄存器(CAN_FFA1R)  L' L- v; _9 s  Z
" L0 ?! ^- i) w. Y9 Y$ P  `0 n
caaa8198119e4182bdfcdd33d898cbc1.jpg 5 d+ S1 l  s8 g- e
; {- u- v5 f  D# U9 O- s+ G  @
该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。
9 ?- m  {) q' M, K/ n2 f4 ?- ?. z4 x$ v$ N) N8 ~* j  Z
5 r) Y! i4 ?: S+ ^. b
CAN筛选器激活寄存器(CAN_FA1R)
9 @/ a. ?! ~% S! d' }5 B$ i' b% I3 G. d
8b95c073f5364f32b222afafcaa40319.jpg 4 f& o' C- B6 f% L7 S5 h
* P: R7 K2 B5 ]6 s
该寄存器用于设置筛选器组的开启和关闭。对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。
7 }; w* \0 i  i
" s5 B: |, _7 o! W9 K, B
CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)
, ~3 W! H! s& A( c
1 N. h# j) ^3 N# Q3 x1 o1 J
11ac5d2269c34ea994d95424a46dbe4f.jpg
6 q2 ]5 C5 o; T, z6 X! V, X5 w. B
: O3 k$ d  n  l" I8 A, U' H1 u* J' U每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。
) u; i1 `! O! `6 h6 H$ J/ V# ~- v$ Q" B2 ]; w& |4 t

  e1 m& o/ X1 L0 q( d; h' G三、初始化流程7 j+ f: q6 D0 x1 ]5 x+ P2 p
1、配置相关引脚的复用功能,使能CAN时钟。
+ c1 W4 z% {4 Y- v* Z要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。7 B1 F/ m! ^$ C* ~. q3 x: Q$ i6 D
/ }, A: a0 `. L, U
2、设置CAN工作模式及波特率等。
- k5 b) S7 o5 g9 L通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其它相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。
; Y0 a+ [" z( B+ d
3 f1 v5 r- @  s% Q0 }( q3、设置滤波器。( q" Q& i+ }: M9 p, a
例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。
7 g2 X, Z3 G; W+ _————————————————
- {* @& ]  @6 h/ I0 O版权声明:三只树懒9 f5 L# W& g; i2 S& D/ {! w

8 n, C: y$ A. Y. S0 v6 J# z如有侵权请联系删除
: O1 _8 Q3 q5 w& D# Z# W& h
! W2 t, V" x: O3 ^! Q" X/ Y
1 }3 K- J9 F, S! o. ]; v
- l+ Y- F0 i2 j& D" o
收藏 评论0 发布时间:2023-3-21 21:41

举报

0个回答

所属标签

相似分享

官网相关资源

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