请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-21 21:41
一、CAN控制器简介
4 B1 E6 _4 z, ~- b9 Y8 N5 q$ M' J' s8 `' P! C7 f$ l
STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:
0 u  c3 |( d8 u( d$ L* r9 i9 h1、支持CAN协议2.0A和2.0B主动模式
3 ?8 {+ S9 V" B+ _8 ]2 ^5 V2、波特率最高达1Mbps
$ A$ u& B6 P+ p9 W* ?& p4 T" I3、支持时间触发通信! `8 A- G5 n; X
4、具有3个发送邮箱
$ k) s$ x* A; ~1 e. E4 }+ w5、具有3级深度的2个接收FIFO$ B  V- T1 T0 D  Q
6、可变的筛选器组(也称过滤器组,最多28个)
# b$ q8 |1 u2 e& f6 ?
$ O0 L; y& @5 u' P: X2 L4 e: A7 Q CAN控制器简介-模式
$ a  z3 N& ~! C* @工作模式
( Y( q4 n6 A  @1)初始化模式(INRQ=1,SLEEP=0)+ ]/ l  P! t8 E7 ?: b. M" D
2)正常模式(INRQ=0,SLEEP=0)9 c, W3 ?% L( V7 \
3)睡眠模式(SLEEP=1)# @3 o0 @" N! x4 n
通过CAN_MCR寄存器控制INRQ和SLEEP9 i* S. s! D& r6 T0 o! P  I
测试模式
4 Y% ]+ y9 x: }0 a5 a1)静默模式(LBKM=0,SILM=1)4 l6 x% @" k% J6 Q2 K
(静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)
% x2 ^# }  K) D3 l2)环回模式(LBKM=1,SILM=0)
' {: P$ v/ a: p9 \0 {3 q7 K(环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去)9 D% A- H1 s; @/ v1 ?
3)环回静默模式(LBKM=1,SILM=1)2 x3 u: U% I; C( I
(不管总线上如何都不影响,自发自收,“闭关锁国”)9 P: R% A7 |: w) z9 v7 T& |
通过CAN_BTR寄存器控制LBKM和SILM/ e6 h& t4 m2 D! \: `
  q9 v! K1 o/ `! ]6 X
标识符筛选器
4 ?# @1 L4 l( i1、CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值来决定是否接收对应消息。
- x/ z* I! @2 `! N/ O8 ~2、STM32 CAN控制器提供了28个可配置的筛选器组,可以降低CPU处理CAN通信的开销。! _0 c' [* J" c- ?9 r$ j
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]位) k7 _& G$ Z/ g
4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。
1 f0 }% Y: i) b; D4 Y$ c% W
( s1 ~/ u5 q9 k1 q( s
通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式
; @  Y; z- \2 d: k# b3 x, j5 {' X

  J- o+ y' ]7 O# R2 u
ef78eb2b71bf4a48a7fd4b2fecb3409e.jpg
# _+ P7 E+ F8 {% r. b4 a  `( G3 u, C8 H5 L
* N$ m7 u% J# v  b
1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。
0 H! J. ]5 q3 H# A) q4 }2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式5 T( u3 O& t  \- ], ]: l4 X) \4 g
3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。1 r# C& }- a3 N6 x/ m
筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。' w: Q2 C7 b( W& d% W: E. a9 [
4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1
2 n. o9 K' f6 Q
  E4 t3 H% w1 XCAN发送流程:# k' x: [$ f- l, r8 C, s

, T% R2 b: W" B6 F- k# n8 O. Y
f7af5fe7fce04aff9dbef09a79d8c88a.jpg 1 b3 N" \& @1 O2 `  h4 W4 k
5 V. T+ G/ [' z6 Y6 @; z! Z
程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置
1 d8 x6 q% d0 {
" ~$ A( A) l4 ?
挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。+ @& Q3 `4 i$ V# n0 x0 {0 b: ~1 V

* C/ S; C2 B' v; f

- o0 [6 Q# @: lCAN发送流程:
- J6 |1 {; p8 V2 G6 G: m5 O. U$ B$ W* Y" n3 {% v
c5f1832615ca4bd0ba117b8f3fc47543.jpg " {: G2 |; L  a1 H
) T/ Y! D9 _/ c9 I
FIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)
6 h& W* L* q' P; e+ o2 i- r& X+ g; n% w+ L- ^5 z8 [$ h7 U
—>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。
( \) e1 {4 }5 T3 f  G/ z6 V# j* h5 d( S4 k8 q- D2 `
CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
% N2 p3 U0 y/ M/ j+ m6 j

" T/ O* E$ z& y1 c% [* _. l报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。
% e' L  c  u! m+ s
% b# I% {# g7 }/ l5 W/ o3 z~~STM32的CAN位时序,如下图所示:~~3 ~: C& C2 ]) ?: }1 V
  W4 L, j  {( O+ p  E
398d7cadc08542a58266e60d7b1a9026.jpg 9 R9 U: j5 n8 F; I! g  d/ r

: h+ ]' S5 f5 t/ B(STM32的CAN将传播时间段和相位缓冲时间段1合并为时间段1)* z6 `5 m+ `- c0 M

6 G" j4 A& [& ?9 V) d  ]; oSTM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kps。
/ O8 ~2 H0 [" v( M3 S/ }) _- ^* [+ C

$ ~) M8 }1 b: o6 S9 d6 x) d0 L二、CAN控制器--寄存器简介

$ {! h! ~" y! y( ^
/ J4 o/ t$ U, b7 V" t
a0f05929b11e49458f73736cd4e507b8.jpg / y( A9 d' o& F& s
- R/ j4 ^5 K4 ~$ w( M/ f
CAN主控制寄存器(CAN_MCR)
$ [6 D4 l- M3 A. `0 r1 G) e
, c) E: R6 ]9 c. w% c, w( G
48142c9ad27740378eabcd794e21b1e0.jpg
  \- r+ \5 S( \9 H/ ]
2 c5 u# g0 r7 A* Y% C8 n
INRQ位:设置INRQ=0,可使CAN从初始化模式进入正常工作模式。设置INRQ=1,可使CAN从正常工作模式进入初始化模式。9 Q  x# k9 ~3 o/ D/ F

/ P1 S/ o( f# uCAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作之前设置),之后再设置INRQ=0进入正常工作模式。; D: S. V, c( a  y, _' w

1 R8 H/ h; t5 `7 m* j' O" [CAN位时序寄存器(CAN_BTR)  v; F! b; F' Y: G, W* Q& ~: _

0 r: B  d( n. m+ O( \3 T7 F" N
c5c35be6358c413e9b58e27ee1fbd616.jpg
  F+ y" S$ r9 p2 I3 u8 g
8 A* h1 q' {) ~+ ]3 \  a4 f+ ^: b( y9 q
CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)
7 R; j6 q# N9 M0 T+ ~. P* ]' ^' I) C& K& \8 A1 m: V
4da30d99b5cd4719bba6422723ca7d76.jpg 0 A+ M' B& [6 f6 I/ a5 `/ s

: X: _+ v8 w* M9 m% W3 s! e) DCAN_RF0R用于控制FIFO0;CAN_RF1R用于FIFO1控制。! `1 R0 h, M, j1 q% g% p0 p
4 M# d" V2 X. _& c7 }
CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)
4 P  R3 e$ Z8 `/ H2 s$ R3 i# f; {4 e1 q
8db56047549949be922d0bb75ab20afc.jpg 4 D! T, ~2 e* U' J4 {  E3 z

: }& P. u( h+ \# |* YCAN发送邮箱数据长度和时间戳寄存器(CAN_TDTxR)(x=0~2)
* H& ~/ C0 q! r+ X: h5 C
4 `$ T* R2 P' n7 A/ k
fb33380a7d444ac78aa53c87582acb19.jpg 8 |# U' b* m1 F) |
$ k( Y) o( }  }% Z$ ^& k
CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)
* m5 Z6 s( p: W3 ]0 s$ v& e
: L8 A! N1 G6 I! G- i
b71d9dd1da35446f951c60a656f3dcc0.jpg
* i% Y( E9 r! i* C- |
+ u2 q% m6 }9 m( y: E) c- P图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。, W7 N" Q' v2 u$ d# y$ Q

" X0 x# T/ w8 H' u
& L- v) e; @3 Z+ a' p: y0 x
CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
  `/ j0 U/ s1 }1 O9 k; Q% T" n9 N- y1 }5 K* ?
c8d44acce479495a83dc7b26b315c760.jpg % {9 s3 R% o9 c$ S; h3 p" }7 S
: V+ B% n0 A! U  [$ r
CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1)' u9 C6 K% Y( P  i( {. ]2 H
+ S" K. M& C5 x4 c' `: W
48d3529655a64ed4ba03f4192e100d8d.jpg - S, x0 Z7 t" @7 x3 \1 t" k! L
CAN筛选器模式寄存器(CAN_FM1R)( _( t( O7 N: C+ O2 ~0 X+ O1 O- T) d

& P8 C& X- m3 C0 u! K: O: m& w; h
77cc47b02c6f455fb3cfeb0e426fe5f1.jpg
3 N) H, O# o( n) m1 x2 A* Y# Y6 T3 g+ f
2 D$ I1 {: y6 p' I8 w, S: [' b1 ^该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。. T5 ], N5 S. H
: t- {5 b) I4 M1 F* k" p. [+ U
CAN筛选器尺度寄存器(CAN_FS1R)* h5 E# V1 ^9 K# j  D7 P" i4 G# }

2 ]+ W( G& X6 I: U3 I' ~: n
12cceb49089b44e6bc7dcad194605d5c.jpg , a8 V$ Y! `2 e0 t4 z
0 G( i; k& k9 |

: |# b( g; ~/ D" ?3 ]$ ^& t1 R( O; d该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。0 G/ |7 B, S% m

! Y9 d. F6 _# h- QCAN筛选器FIFO关联寄存器(CAN_FFA1R)
  ~, o0 V. k( a
9 M. e& s7 K- M5 [
caaa8198119e4182bdfcdd33d898cbc1.jpg , R3 _0 `0 }: X2 l9 Y% u+ ^

) f% \5 \- H/ c  I3 C( Y该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。
. U% w6 |  K8 ^6 f3 z% i" D- q8 H# N/ E" x

6 f, z) n# Q; w/ C7 Q: ]CAN筛选器激活寄存器(CAN_FA1R)& g# c5 o  _2 H! F4 X
; r( r: S' z* }, y" y
8b95c073f5364f32b222afafcaa40319.jpg
8 V; b8 d+ ~0 x# n5 O9 ^
5 r, `# k2 e3 m$ s1 d9 U& O
该寄存器用于设置筛选器组的开启和关闭。对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。# l( y' C$ {% y& i8 H
0 [) E6 o1 O/ a& i  N
CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)
& l$ V. B! ?" Y
5 y. J& P* d$ _  t
11ac5d2269c34ea994d95424a46dbe4f.jpg 6 d4 r1 i( G' d; _9 ]; z& f; }- X

8 S% _* s) P. N9 l  e1 e' l每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。
( Z, M* O2 K4 x' P7 i6 L
" N, {) H, c4 ~. y

' r$ L% b$ D! X/ B0 `; J5 f三、初始化流程& H8 V+ n& _! c: Y8 Q
1、配置相关引脚的复用功能,使能CAN时钟。
7 W6 `) }+ x' J; ?5 i* d要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。: U  d, K& `. Y$ w- K  ~1 x

! G3 v/ k$ V. X0 L7 r4 b9 `# C% |2、设置CAN工作模式及波特率等。' K* e5 ?! i  x" d, v0 o- S
通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其它相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。
' s6 m* x) Z% I4 D& |/ q  y
4 [5 m' A: R3 ?( r' c5 n3、设置滤波器。
* i0 i+ f5 f( J; r例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。# f6 y# s7 U' {4 p5 }/ u
————————————————
- [6 L! A. T9 c( ]* V版权声明:三只树懒% B! Y! ^' m  W

$ I1 z; c) y1 X( |. Z! N如有侵权请联系删除
9 J2 D" T% A! }- d5 @& e" b. X7 P" f

9 B. V" l6 m3 I
8 y+ }4 _1 H1 m3 S1 b- ]
收藏 评论0 发布时间:2023-3-21 21:41

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版