一、CAN控制器简介7 N- F) |) P# b6 e& F1 k " v m; M- g% O r! c: ? STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:0 Z9 w/ t$ @9 L; R% Z 1、支持CAN协议2.0A和2.0B主动模式" d% i" n5 U6 b3 x0 G# E 2、波特率最高达1Mbps; L. u, @" _& _: k8 ^; ? 3、支持时间触发通信 4、具有3个发送邮箱, W- A* M: s" N; w0 ]- ~% l* t T 5、具有3级深度的2个接收FIFO. A. ~+ `" M$ {9 ~. Q- {9 d 6、可变的筛选器组(也称过滤器组,最多28个)/ _. S' n3 F3 A' i CAN控制器简介-模式1 ^" f9 E+ y" R' @6 t 工作模式) I( X. ~- J! i 1)初始化模式(INRQ=1,SLEEP=0) 2)正常模式(INRQ=0,SLEEP=0)! @6 U. H/ L5 E 3)睡眠模式(SLEEP=1) 通过CAN_MCR寄存器控制INRQ和SLEEP* i" d0 x1 @4 C% M; a! L# N7 u 测试模式& w+ P1 R5 M D4 d+ V1 W 1)静默模式(LBKM=0,SILM=1)7 n8 g1 x% g: E/ j3 T (静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)# u* z$ Q% Z6 d' V 2)环回模式(LBKM=1,SILM=0) (环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去)% p! q `/ j# F7 b: a 3)环回静默模式(LBKM=1,SILM=1) (不管总线上如何都不影响,自发自收,“闭关锁国”): \! p1 Q& g6 x8 D0 x 通过CAN_BTR寄存器控制LBKM和SILM 标识符筛选器 o8 E$ H! P, g+ a+ K 1、CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值来决定是否接收对应消息。' Y* Y0 L) N7 X; k 2、STM32 CAN控制器提供了28个可配置的筛选器组,可以降低CPU处理CAN通信的开销。 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]位/ }+ ]6 V. m( u+ Z/ ]; w 4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。 通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式4 Y$ S* L% K5 w+ L 1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。, j6 j9 P& a! f 2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式 3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。 筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。 4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1$ ?" h& K, j$ U) r CAN发送流程:/ P( {+ n3 T' ]; Y* L 程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置 4 L" o' u+ Q3 l 挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。4 ]/ A2 H& n/ z. u. [2 J. g 0 ~" b2 M! G7 N2 e6 s5 s: d/ ^/ p CAN发送流程:* w- m( s$ i' M8 \8 e$ f6 R# v& T0 s FIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)3 U" K _7 v5 p } —>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。 9 q% f/ y" i4 M- p' J* M CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。, H% J; @% B; G4 A% p! r5 { 报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。 v5 u" [* p, v; v ! h. j4 O5 y$ E4 M/ } ~~STM32的CAN位时序,如下图所示:~~5 Y2 y0 d: ~2 U2 O # P, F; n* d8 s/ y; G E0 F, h1 N (STM32的CAN将传播时间段和相位缓冲时间段1合并为时间段1) STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kps。% [3 k3 e1 t7 h2 r2 w: d* j4 g & U* O: {6 J3 ~" u. W% j3 T 二、CAN控制器--寄存器简介+ ~& o U* U- ]# ^" i+ O- t- _/ Y CAN主控制寄存器(CAN_MCR)0 H1 ^+ E8 E' ~ [, d( G : k+ a, Z+ m& Y5 |$ i* o' t INRQ位:设置INRQ=0,可使CAN从初始化模式进入正常工作模式。设置INRQ=1,可使CAN从正常工作模式进入初始化模式。 & H5 v2 C/ M* e$ h% c: Y8 ^' u+ W( \; s CAN初始化时,先设置INRQ=1,进入初始化模式,进行初始化(尤其是CAN_BTR的设置,该寄存器必须在CAN正常工作之前设置),之后再设置INRQ=0进入正常工作模式。 a2 ]5 r5 W( J( y- T CAN位时序寄存器(CAN_BTR)6 J/ E" ^' p s* K* N: |' M 8 t4 u% Y! W6 w$ t) Q: Y CAN接收FIFO寄存器(CAN_RF0R/CAN_RF1R) p4 `) F& ?+ P5 A% c8 H9 B CAN_RF0R用于控制FIFO0;CAN_RF1R用于FIFO1控制。+ r6 q5 L1 v3 N( U* t CAN发送邮箱标识符寄存器(CAN_TIxR)(x=0~2)/ E# u% X# s! J - y0 W q; K5 a8 M6 c3 y+ B CAN发送邮箱数据长度和时间戳寄存器(CAN_TDTxR)(x=0~2) 7 h& w7 q f* J# y CAN发送邮箱数据寄存器(CAN_TDLxR/CAN_TDHxR)(x=0~2): @; n. i8 ]/ p- l/ n, C8 N & l2 G# N: e" V8 z; `1 @& @ 图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。 ; e$ H% I" K& c7 j! D: p + i2 V' u$ ^" P1 e1 U9 k9 K) n6 z/ Y( N CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1), M6 r2 `# `- ~5 l 4 L& J/ d3 F" Q& O& j6 | CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1) 4 `( \/ p8 L1 c7 ~9 M, ~) j7 q9 e. j& O CAN筛选器模式寄存器(CAN_FM1R)5 c- y$ g- F7 i! B! N : c) E, f: y/ {- D2 P( A0 L ' c- n' O4 ]; ~- M4 D4 f 该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。 CAN筛选器尺度寄存器(CAN_FS1R) 1 H. ^" i- h8 X, K- I& E$ E7 s' Z ; b0 }8 I* }2 r0 _ 2 S* [9 ]* |6 S# l9 m* z* i: }5 @ 该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。 CAN筛选器FIFO关联寄存器(CAN_FFA1R)( h/ `: v) A# S! J5 m, l- r) A9 t+ { ) X4 s; E" @' ^) Z' P y, Y, R- G/ l) `3 n 该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。 8 B! V0 u5 c ?0 L& y$ P- V . ]* [/ C8 Y8 b% Z5 X+ l; N CAN筛选器激活寄存器(CAN_FA1R) : L6 z( M+ s' K L1 w* e+ D # `4 q3 m3 U! ^4 l 该寄存器用于设置筛选器组的开启和关闭。对应位置1,即开启对应的筛选器组;置0则关闭该筛选器组。 ) o3 d+ `, W4 p# o$ q" Y CAN筛选器组i寄存器x(CAN_FiRx)(i=0~27,x=1/2)3 X8 [* s% P0 [3 M/ X* _ t: k / n, G' N- @; _% B* V8 o- Q4 M* C6 w 每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。% T! ]4 S3 J7 ]5 y% X+ A2 J 三、初始化流程 1、配置相关引脚的复用功能,使能CAN时钟。$ e+ h1 }7 m4 @9 A 要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。9 v& R$ F- l8 m- Y+ A( L& ~9 W6 u 2 ]( c( w. Z7 @0 f0 ? 2、设置CAN工作模式及波特率等。( J ~' {; K; F: S' X 通过先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化模式,然后设置CAN_MCR的其它相关控制位。再通过CAN_BTR设置波特率和工作模式(正常模式/环回模式)等信息。最后设置INRQ为0,退出初始化模式。: V: D8 @3 w: { " {8 Q0 V+ p0 N7 d+ ~ 3、设置滤波器。 例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。9 [1 \1 ^7 D" C8 J0 {2 A1 O ———————————————— 版权声明:三只树懒: n. ?: y' f& U* G2 N6 y 如有侵权请联系删除 + A# e% @8 W v" c" I: Y/ k5 b B 2 t& p& R& G% S5 s# Q |
基于STM32的BootLoader经验分享
基于STM32如何选择 S2-LP 的外部晶体经验分享
基于是STM32的BLE 设备地址经验分享
基于ToF传感器的3D手势识别
NUCLEO-U545RE-Q评测(2)运行环境建立
基于使用 STM32 TT 类型 IO 的注意事项经验分享
基于STM32使用Framebuffer_Analyzer工具调试图像显示
ST安全连接,护航工业物联网一路前行
基于STM32的TouchGFX 4.22解锁新功能经验分享
基于STM32的MPU子区经验分享