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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-21 21:41
一、CAN控制器简介9 g9 j! u8 u. A) z
0 ^/ {) J# |4 }
STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:
' H3 [1 d' F7 _( w( p1、支持CAN协议2.0A和2.0B主动模式
+ M8 t+ K* j1 M% b7 p9 H! Y2、波特率最高达1Mbps8 `. P0 V6 H2 U' i, x- W
3、支持时间触发通信
' ]7 Z6 n7 Z: p4、具有3个发送邮箱
/ A' T8 Q0 N8 G8 s. p9 T5、具有3级深度的2个接收FIFO
0 \9 c: r- C8 T6、可变的筛选器组(也称过滤器组,最多28个)
2 V4 D& E* n$ L' M4 W" l) J/ q& Y+ t$ h# z# r$ m  M1 W* X! c  D* \6 o1 p
CAN控制器简介-模式) D, _0 s$ l$ X& S/ F; |
工作模式
6 x; s1 L5 ~; U! U6 X0 k2 J, P1)初始化模式(INRQ=1,SLEEP=0)
7 @/ Q, r0 e" n" B2)正常模式(INRQ=0,SLEEP=0)
) A$ v/ Z- t7 n! l5 p3)睡眠模式(SLEEP=1)* L+ G( E* z( ~/ P' R% `" a, m6 P
通过CAN_MCR寄存器控制INRQ和SLEEP& L) {: U% n% K/ l* u7 r
测试模式% x8 |. e  d) ~/ U' D- O
1)静默模式(LBKM=0,SILM=1)9 N5 }6 q$ |/ h& C
(静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)
+ t3 f4 m& T* W5 j2 A+ `2)环回模式(LBKM=1,SILM=0)1 y/ R! T4 E' _% n# \4 p
(环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去)
) j  `: V8 `) V3)环回静默模式(LBKM=1,SILM=1)
( j- f2 O: V! r' z4 l(不管总线上如何都不影响,自发自收,“闭关锁国”)" N' t* o, B+ y$ z
通过CAN_BTR寄存器控制LBKM和SILM( W8 \! p9 Z7 A7 m) E% \4 D. l
: Z& m' K, A7 z: h3 e
标识符筛选器$ V- y0 M$ B& K4 R- C, R, k
1、CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值来决定是否接收对应消息。  f0 W! ~5 g& b0 U/ Y, R
2、STM32 CAN控制器提供了28个可配置的筛选器组,可以降低CPU处理CAN通信的开销。& [- c: d# f- g# v1 L# K
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]位
; C7 l9 a8 m: I0 S4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。7 s+ x! X2 W/ }8 o6 {

  n0 s" u  H: ]' U9 Z* {通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式
/ c! H9 H/ j. }' `

& N6 {  l* `" p
ef78eb2b71bf4a48a7fd4b2fecb3409e.jpg
/ u5 z3 l' X: G8 j& L* Z9 O$ B" n) ?, Y6 M6 X, `$ t
8 B5 j2 e9 [7 y  O; b# n5 A" ^
1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。- N' _, I1 C0 O$ f3 E
2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式
4 |1 T3 S3 r2 Y+ E1 T. t3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。
$ v1 b, S0 S/ z. |! o. N, J' d/ k筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。. n) o( _% Z3 p7 B6 z
4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1$ B, j( ?& z. b, p: {" A" O4 j
! H! l4 Y( E) _" \6 c8 _
CAN发送流程:2 G6 l0 ?' C& F* }- W. h
4 @( L" v: Q* w: V/ n1 R! v# @- z
f7af5fe7fce04aff9dbef09a79d8c88a.jpg
6 S3 {& o& k( i" z# ]9 d' c5 o7 E, W) V8 d
程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置
8 B' a% K. d; a4 k7 R7 \
9 F  P. O4 M& K7 h. @
挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。
. Q- M0 x7 w5 X1 b! Z/ J6 W* A! y' k$ i: W9 K3 |3 ?6 o
# b0 R. j, \' q1 H- u+ Q( q
CAN发送流程:( ^0 m- a  ?; [6 l$ i5 A

) d. U, C. q1 y& P- n; v
c5f1832615ca4bd0ba117b8f3fc47543.jpg . d2 _' E6 e. T' F; }5 }/ [

5 \% S# x$ m0 t( e( v; iFIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)7 q( Q! n& D& |- R

4 [) J( s2 g- |2 G—>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。0 q8 P, z* O3 k' n/ W
" c* T' h4 y; R5 |7 ?$ i
CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
7 R1 {6 J; _" L6 R  m0 m) g. l
' f# U9 \9 ?, C
报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。) d. V* Y0 s; ~0 F
% I, E; w* p# R# n  T
~~STM32的CAN位时序,如下图所示:~~& l! n$ o" K! N7 Q" O- T. _- j! K

5 m8 J9 m. B$ T/ ^8 Q3 A' b2 V
398d7cadc08542a58266e60d7b1a9026.jpg * w, m$ |5 k- u' S) a1 m

) [2 R) C( I4 @7 C+ m  z(STM32的CAN将传播时间段和相位缓冲时间段1合并为时间段1)
" n6 c4 Y1 v" @: U/ n1 H, B( H  }- p! S- P) R& p
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kps。
6 @/ s; F2 v. L6 E& e5 k1 [3 o2 {. N
& \+ n$ ~3 l9 ]9 b  N* d0 Z5 f9 g  I
二、CAN控制器--寄存器简介
9 [+ J' Y+ W/ c% ]/ Z" @  ~

( I7 d$ U  w# x, R
a0f05929b11e49458f73736cd4e507b8.jpg 8 k  Y( b; k9 Q" u, L' e
) ?2 a2 a' l# S; P
CAN主控制寄存器(CAN_MCR)
8 x5 n& t5 h) G3 D* z- N
7 J  e' \' ^# q4 _  X! P# q
48142c9ad27740378eabcd794e21b1e0.jpg
6 n" b' [: {* \' G' p- M% @8 V% W8 |

4 Y9 B/ W/ t" `$ S* ]INRQ位:设置INRQ=0,可使CAN从初始化模式进入正常工作模式。设置INRQ=1,可使CAN从正常工作模式进入初始化模式。! f, m5 H3 S$ o$ D

2 d- O7 L$ ^1 z; o0 ?7 I' |CAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作之前设置),之后再设置INRQ=0进入正常工作模式。
' T0 e6 n' Y: y( ^* x- O% p

0 u  [/ X0 u3 c/ l- Z& M# l4 w. eCAN位时序寄存器(CAN_BTR)" N0 b: U  v1 M

. M+ v% a! _& b
c5c35be6358c413e9b58e27ee1fbd616.jpg , k* c3 e6 v" y1 Z; l5 m
) U2 Y  a' B+ \1 E: v$ V/ U
0 O# R# R( M- ~$ B, {
CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R)$ A- F0 B% k0 v) T* c8 F  ?* {
6 z" G$ u. d- J8 a8 |* q) q0 a
4da30d99b5cd4719bba6422723ca7d76.jpg
" o  l. _5 I* G. r7 k7 q
- J; j, j0 {  f) P% ~! |CAN_RF0R用于控制FIFO0;CAN_RF1R用于FIFO1控制。
4 j& g( O" C. V
$ y% s4 |6 E) [1 V
CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)
% A3 [" Z7 f. p' d! x2 K: r5 z( q. {
8db56047549949be922d0bb75ab20afc.jpg , x, R  w5 I. B$ \4 C8 \
7 w7 A. E; X0 U0 Z5 k  Y
CAN发送邮箱数据长度和时间戳寄存器(CAN_TDTxR)(x=0~2)
# V" @) U  i2 q9 m# I% I2 W9 H$ {
: ^9 h( x6 e) y3 Y/ z" K
fb33380a7d444ac78aa53c87582acb19.jpg
1 V+ Y- [/ x5 o9 K( n
# ], \- n* L6 X7 SCAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2)
! T6 F- ?* z, {$ X7 X
7 [3 Y1 w! ^) O3 ~" [
b71d9dd1da35446f951c60a656f3dcc0.jpg
) f( e$ a9 i. c4 W; i( u% O5 _# f+ \* A7 v& H* ^- m
图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。: _  U3 l( h. @+ [2 O7 g

8 Y* l# b, o) j+ n& X% [

/ ?5 [- f9 l; N! V5 D. OCAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)1 I8 U' g5 e8 i5 S6 b

/ Q3 K; n& B- X. h( D' F
c8d44acce479495a83dc7b26b315c760.jpg . P6 ?9 M! W, L
1 k% Z5 L3 q# W! ]8 z4 ?
CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1)! }2 w1 Z2 T6 x: M- N9 l

6 \( e7 @: X' o) y, Q
48d3529655a64ed4ba03f4192e100d8d.jpg 2 H1 F& Y, |8 y- a( N. U
CAN筛选器模式寄存器(CAN_FM1R)
* d8 V; j/ k$ d7 G. H' Y8 o
! l) j/ c! M% n% T
77cc47b02c6f455fb3cfeb0e426fe5f1.jpg
4 Y9 s& n3 k4 m2 z, z9 a
9 H. W6 c5 f" O" v0 v4 a  H: K5 |8 r9 [该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。. d0 R& i5 ]1 ]% I8 ]

& ^1 T/ P6 C+ _+ JCAN筛选器尺度寄存器(CAN_FS1R)! f- q( Y$ X  B# [

- v/ o# Q4 Y. R3 T* d6 u
12cceb49089b44e6bc7dcad194605d5c.jpg
4 H( R5 M7 Y5 `8 K& C" t
2 C7 y+ |/ i" b/ x# a. D" M* R; l

  q3 V: G" o7 v' ~3 l/ V7 W该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。3 d! e" k+ y* `) x

1 W- v* W9 H* H0 V- ?( xCAN筛选器FIFO关联寄存器(CAN_FFA1R). ]$ w  _0 m1 ^" L3 ]

" n% y8 C! X% d' m
caaa8198119e4182bdfcdd33d898cbc1.jpg
) I1 Z6 ~: \$ \
; o1 r7 m* R( A2 B6 u2 C该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。- [$ o6 X( h1 }; V; {

* X" q8 {1 M& \* @" ]
7 @5 h$ t+ J" S
CAN筛选器激活寄存器(CAN_FA1R)
( @2 w' m7 Y4 g$ m% l
9 D# I" k$ G/ E0 {# n; g6 W# H6 I
8b95c073f5364f32b222afafcaa40319.jpg 2 }) E! T% b  C  v, m! i

; @6 k7 b7 w) R, k! K: @- \该寄存器用于设置筛选器组的开启和关闭。对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。, }8 v! X! N, f6 m. `

# i6 g3 {( {, c. E( {$ u$ _CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)

/ \$ _9 J- ]6 @/ R' v- q2 }
( i, m0 P3 K; `0 C% q
11ac5d2269c34ea994d95424a46dbe4f.jpg ; }: ?$ R# V/ i6 {

, Y' K  w4 G. o* u+ Q( Q. L+ x每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。) w  M5 `. L0 V( v( F; Q
  ]# \7 E  x6 _( X7 W- K2 h

) V" m! V+ _8 y) |) b/ g, b6 T% @* `三、初始化流程7 I" z% d( |3 t3 [$ ^) O( m  i
1、配置相关引脚的复用功能,使能CAN时钟。
( L( E4 B# W" n% L7 V" z6 O+ P要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。0 K# k$ s, @9 D, V

# t: ^2 U# x3 t2、设置CAN工作模式及波特率等。8 r1 Y. R  Z: s; O' L% \
通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其它相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。6 P+ G2 j* t/ c3 u) E( V- w
- g- [: ]5 C! L0 b4 Y0 o
3、设置滤波器。$ c& }) U0 I  j, H- D- |0 W
例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。+ e# `; o3 C  C& Y. u4 w
————————————————7 |4 g; b3 V! o! R) k
版权声明:三只树懒
; v/ B) n+ L4 b0 z7 }

) T. n: R. O# _  b. k. |如有侵权请联系删除* |& @4 J6 i/ A$ l# a

1 o7 R# |$ _+ Y/ q( z) B5 ]! a* A) V/ o- x: D1 }
0 [& Z: j: |. ^: o& y
收藏 评论0 发布时间:2023-3-21 21:41

举报

0个回答

所属标签

相似分享

官网相关资源

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