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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-21 21:41
一、CAN控制器简介
$ d4 Z0 C; O3 e0 x
9 t3 u* N8 b) q2 u9 bSTM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:  ?+ m, O( o( j1 j6 ^& [% i
1、支持CAN协议2.0A和2.0B主动模式) y1 b2 c6 n, x/ [
2、波特率最高达1Mbps
9 w( }2 M, t: o5 s& d3 N! X3、支持时间触发通信7 u) v* m6 n7 D( k
4、具有3个发送邮箱
3 @) w3 W; D7 b' d$ V5、具有3级深度的2个接收FIFO
! C% O2 W$ o1 ~6、可变的筛选器组(也称过滤器组,最多28个)
: e0 V) T% o' I- c8 @6 a) @
) F( W! ~, s5 H! g! ]+ O CAN控制器简介-模式
  _9 Y" D( s  Y工作模式
# p8 w, h5 T" A) _  O# x1)初始化模式(INRQ=1,SLEEP=0)$ D! X4 |# E- d+ _. p+ o# y
2)正常模式(INRQ=0,SLEEP=0)! E3 X& y$ h+ @
3)睡眠模式(SLEEP=1)
2 H6 K: W0 j+ G* c! w& G
通过CAN_MCR寄存器控制INRQ和SLEEP( e* N$ ~4 c7 N, t% H* K' Y  ~
测试模式
" s1 e7 Y4 e- h! m1)静默模式(LBKM=0,SILM=1)
  j- ?' I$ ^; `9 A(静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)% g/ C0 O. {3 V! g+ M
2)环回模式(LBKM=1,SILM=0); A8 \' w/ T, p" A
(环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去)
+ g" P, W8 U& z5 \  M* N. V3)环回静默模式(LBKM=1,SILM=1)
4 a5 y5 v" C. L/ \8 b2 r% a(不管总线上如何都不影响,自发自收,“闭关锁国”)
# k( y( [" N- w, e! |% m通过CAN_BTR寄存器控制LBKM和SILM" F$ \6 U- B6 V/ p
/ h% a/ B0 q: K0 J6 x- N* S. D
标识符筛选器
4 j+ c$ I: [7 w1、CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值来决定是否接收对应消息。& k) X( O! T! o' ]2 a% Z# y
2、STM32 CAN控制器提供了28个可配置的筛选器组,可以降低CPU处理CAN通信的开销。0 c" X" F% o: l. ~
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]位
0 l: ?3 k( t+ X! _, Y4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。
/ L: u! y% g' V

& R9 ^) M! @8 q通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式

8 [. H& _" X6 c( M8 |% L
8 m* M0 ]) F' r; S
ef78eb2b71bf4a48a7fd4b2fecb3409e.jpg & u' X* f' S, z0 k/ ^$ i4 w
) O2 ]4 y7 e+ t% i/ K5 C
0 w  M$ {/ T* r
1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。
( B) n; O5 d% |% Y2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式: d8 b, b( s" @: N& O; Y
3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。
! t. w; I! S& Q  `/ J3 d! w0 c筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。
  f% |6 Q  Z/ Q4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1  z6 h$ }8 k  s8 I6 _. `

  N+ R; h0 E1 e3 U& xCAN发送流程:& J) H  W" N# l6 r, b4 ^* b. f

8 [7 [) X. z% a: f# h
f7af5fe7fce04aff9dbef09a79d8c88a.jpg
0 H5 w, Z& m/ L/ z# ^& \0 y, l9 z8 S# }1 F0 ~2 B
程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置
, F4 ~2 t2 {5 s# a. d/ G& k

+ p. W5 Q- _5 r# B3 c! L; g挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。) q2 w7 }$ }0 s: r+ u) u

0 Z2 z) f3 P3 G! p# s/ L
$ ]7 _" P0 I" i4 |; s
CAN发送流程:
9 x8 z# W7 N7 q" e+ c7 t; q4 }  e, t; q6 K' R9 ~
c5f1832615ca4bd0ba117b8f3fc47543.jpg $ G, F7 ~( W% [; W1 _

) ]* ?' B4 ^: z; i- CFIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)! y1 f/ O2 G$ r3 g8 h% T: Y

& R  ~! F9 m* L& S% ~—>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。
) S! Z" g9 d- ^/ ~6 s6 K
" S5 t" D) c. K; x5 ECAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
; s" [0 f" S6 c  b2 Q0 w6 b

( z% D" f, I' M' v8 C1 Q报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。# G$ `3 c# z# p* O7 h9 S

. [$ X8 y: V: |% e~~STM32的CAN位时序,如下图所示:~~# ~4 K. ?0 U7 R$ C$ @

9 P; R+ Z# F9 M  _# u6 c5 ?- ~
398d7cadc08542a58266e60d7b1a9026.jpg
0 C# y" ~) V  Q, v4 X/ I' O3 b$ Y( c" `
(STM32的CAN将传播时间段和相位缓冲时间段1合并为时间段1)" l3 s& Z9 o3 C: }) {' |% n8 [5 G3 y% h
7 A( R# R* p7 n
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kps。
4 [8 P! b/ v3 w  d6 M
- Z" v! X( {+ y& ]% L5 k
( \$ @* r8 q3 A$ a- W- _0 d# J
二、CAN控制器--寄存器简介
+ j0 U5 I6 J2 Q4 U9 S

, N/ A9 M& a' d
a0f05929b11e49458f73736cd4e507b8.jpg
* q; b) S4 n% K) G4 l9 O9 s2 j2 x% \# Q0 I% Q8 i
CAN主控制寄存器(CAN_MCR)
# ^5 F# N8 k. k( m( u4 ?# M3 e& B% [2 U
48142c9ad27740378eabcd794e21b1e0.jpg
# _9 O/ K2 P$ \+ N

) u, Z. P8 r( BINRQ位:设置INRQ=0,可使CAN从初始化模式进入正常工作模式。设置INRQ=1,可使CAN从正常工作模式进入初始化模式。  F; r5 F% R" E2 L
) C5 w) W- }/ i4 x
CAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作之前设置),之后再设置INRQ=0进入正常工作模式。. Q6 E: j2 V" h. H3 O8 m

4 b7 ^  Q7 L1 a8 p6 r+ JCAN位时序寄存器(CAN_BTR)4 K) L5 p/ B# O2 ^/ K

# S& K9 ?! i. ?: i- l( T" q) t& ~6 }
c5c35be6358c413e9b58e27ee1fbd616.jpg   J5 z' J  k* W' U; Y8 B0 v
0 A" X4 C+ S4 W& d; u
* U# b0 N- b" z( d, e2 G9 I3 Y
CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)$ y: c; s' u& g3 ?2 n% ~6 R

6 W( ]* h- \+ e
4da30d99b5cd4719bba6422723ca7d76.jpg
, Y) }7 M* T8 `' K; N# Q
9 V9 Z$ o0 L# H# D$ c5 ZCAN_RF0R用于控制FIFO0;CAN_RF1R用于FIFO1控制。  W+ r" M. n$ [
8 Y. Z; P% i* q( m/ E' o
CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)" d* \9 [/ ^4 u& g4 g7 Q
+ p% y1 R4 U) b" b; f& m
8db56047549949be922d0bb75ab20afc.jpg
, p8 k. {! f4 H. [8 m. a- I8 y
! B+ b$ G, c- J+ h- S* v
CAN发送邮箱数据长度和时间戳寄存器(CAN_TDTxR)(x=0~2), h, S2 m/ T- {3 H3 K  Q! T# d
  u' N7 N# Q; q* M
fb33380a7d444ac78aa53c87582acb19.jpg 8 Y1 {: N$ p8 Z
& ^$ F; O4 B; \' \2 P4 t
CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)
6 p( c7 i' _* A/ _, S
: U6 Q3 k) _) o) K& a/ Q6 o/ B
b71d9dd1da35446f951c60a656f3dcc0.jpg
3 R" ^9 [, \  M) ~
0 y# u4 s7 e$ b图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。
6 g! O( z( S8 B& B  R8 C5 M. Y' u
8 o5 a  Z) A+ R" H9 ?" T
CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
/ \/ R  X5 P. c9 v8 N/ j
/ @/ h) R% c! r
c8d44acce479495a83dc7b26b315c760.jpg
! p3 e/ T& U# h3 x2 n9 N" Y. n
$ j& ]% x3 C+ ?. e& FCAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1)% t# h2 L7 [  T
! v* ^9 V" t( S. O
48d3529655a64ed4ba03f4192e100d8d.jpg
/ z5 v2 r. ~! |CAN筛选器模式寄存器(CAN_FM1R)& b/ @. _" |- {. W, ~' G
: |4 j8 V' U" D
77cc47b02c6f455fb3cfeb0e426fe5f1.jpg
0 M/ ]* F, u1 u$ K# ^. r) D- {- }7 S4 g2 `  R' Y
该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。
) f8 g; J9 n; C. |' h# c  R: @
8 U  D2 E* `, D% L
CAN筛选器尺度寄存器(CAN_FS1R)( [, D& U) O' @9 i! ~7 v6 `& u! m

: t3 X0 B6 }* \7 }: ~6 h
12cceb49089b44e6bc7dcad194605d5c.jpg
2 }; g% f; D5 `* p6 D% h8 H) v# F4 D  A
9 Z9 j6 ]  g% N% a; F

" G! S* N( O2 c, Z8 O- k该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。
6 g% F* B! ^4 ]6 o/ ]2 w* ~: o/ G- J. h3 s( c. c
CAN筛选器FIFO关联寄存器(CAN_FFA1R)
  u* @2 ]* Z+ X6 J7 C
4 k' R8 z6 f& h1 \7 |3 ^5 Q2 p
caaa8198119e4182bdfcdd33d898cbc1.jpg 6 Y1 P0 |; K; g4 `* T3 Y

7 B. r* Y$ W- g: g) C% x1 ]7 T该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。
" P( b! @2 ?7 E: L9 j
9 t9 i6 D+ c6 V
8 C$ R# \) z: l* E( N; i
CAN筛选器激活寄存器(CAN_FA1R)
0 {) _; W' X5 N8 q5 B
# H% j+ d) |. ]  ~' @: Q) [! T5 Z
8b95c073f5364f32b222afafcaa40319.jpg ( f! ~  `* @" |' S+ J6 ?
# A$ m/ N. |+ T9 F5 V+ b
该寄存器用于设置筛选器组的开启和关闭。对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。0 i" h, \& ]* Q. r* e* k: E" X. L
- ^, [% h& R5 G: j* _
CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)

% e5 G8 c4 G& L" r( m) ]. D( U6 S- P" P' V4 P1 z  I
11ac5d2269c34ea994d95424a46dbe4f.jpg 4 x( V* i2 J+ o

2 Z) z+ g7 g3 x, R4 I: O' @. \每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。
$ K3 Q& l, y! {
* p5 I+ ~1 S: w% E1 [
2 l8 D! n# C/ V* ^8 w4 \8 _: H- |
三、初始化流程4 ]9 _1 P9 J. z  m. t! v: d9 j
1、配置相关引脚的复用功能,使能CAN时钟。
% e3 F2 v7 V( Q8 s$ T8 Z要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。
8 S$ ^2 x- n, \0 u9 f: P

3 v. C- ^( x% @1 J! \; f1 {) S2、设置CAN工作模式及波特率等。! z6 N: V, m2 A& J7 `' |  s
通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其它相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。* o8 g4 n+ g' |9 W; J
# M* e& c" A: l& _
3、设置滤波器。
: G/ L& C9 M9 q4 |1 B* I例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。
4 H) Y+ Q* ~% R2 [————————————————
4 w. v2 _& w0 n+ ?+ c& E7 U& {, I版权声明:三只树懒
; u3 ], _! Y( }( [7 S+ ~
' q0 l0 A$ f& u* T1 Y$ X1 e$ X
如有侵权请联系删除/ {# @5 }& j3 ?  X

2 m$ B* {' ~0 e/ d
& t- G" U! g6 _- v5 `6 r2 F1 n4 f* P' x- K! o. s
赞 收藏 评论0 发布时间:2023-3-21 21:41

举报

0个回答

所属标签

相似技术帖

官网相关资源

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