|
一、CAN控制器简介 STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下: ?+ m, O( o( j1 j6 ^& [% i 1、支持CAN协议2.0A和2.0B主动模式) y1 b2 c6 n, x/ [ 2、波特率最高达1Mbps 3、支持时间触发通信7 u) v* m6 n7 D( k 4、具有3个发送邮箱 5、具有3级深度的2个接收FIFO 6、可变的筛选器组(也称过滤器组,最多28个) CAN控制器简介-模式 工作模式 1)初始化模式(INRQ=1,SLEEP=0)$ D! X4 |# E- d+ _. p+ o# y 2)正常模式(INRQ=0,SLEEP=0)! E3 X& y$ h+ @ 3)睡眠模式(SLEEP=1) 通过CAN_MCR寄存器控制INRQ和SLEEP( e* N$ ~4 c7 N, t% H* K' Y ~ 测试模式 1)静默模式(LBKM=0,SILM=1) (静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)% g/ C0 O. {3 V! g+ M 2)环回模式(LBKM=1,SILM=0); A8 \' w/ T, p" A (环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去) 3)环回静默模式(LBKM=1,SILM=1) (不管总线上如何都不影响,自发自收,“闭关锁国”) 通过CAN_BTR寄存器控制LBKM和SILM" F$ \6 U- B6 V/ p / h% a/ B0 q: K0 J6 x- N* S. D 标识符筛选器 1、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]位 4、筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。 通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式
) O2 ]4 y7 e+ t% i/ K5 C 0 w M$ {/ T* r 1、为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。 2、为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式: d8 b, b( s" @: N& O; Y 3、应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。 筛选器组中的每个筛选器,都被编号为(筛选器编号)从0开始,到某个最大数值,取决于筛选器组的模式和位宽的设置。 4、通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1 z6 h$ }8 k s8 I6 _. ` CAN发送流程:& J) H W" N# l6 r, b4 ^* b. f
& \0 y, l9 z8 S# }1 F0 ~2 B 程序选择1个空置的邮箱(TME=1)—>设置标识符(ID),数据长度和发送数据—>设置CAN_TIxR的TXRQ位为1,请求发送—>邮箱挂号(等待成为最高优先级)—>预定发送(等待总线空闲)—>发送—>邮箱空置 挂号期间和预定期间如果不想发送了可以ABRQ=1强制停止发送,发送的时候如果发送失败会进行再次发送尝试,当尝试次数达到最大时就会停止发送。) q2 w7 }$ }0 s: r+ u) u $ ]7 _" P0 I" i4 |; s CAN发送流程: ; q4 } e, t; q6 K' R9 ~
FIFO空—>收到有效报文—>挂号_1(存入FIFO的一个邮箱。这个由硬件控制我们不需要理会)! y1 f/ O2 G$ r3 g8 h% T: Y —>收到有效报文—>挂号_2—>收到有效报文—>挂号_3—>收到有效报文—>溢出。 CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。 报文FIFO具有锁定功能(由CAN_MCR,RFLM位控制),锁定后,新数据将丢弃,不锁定则新数据将代替老数据。# G$ `3 c# z# p* O7 h9 S ~~STM32的CAN位时序,如下图所示:~~# ~4 K. ?0 U7 R$ C$ @
4 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。 ( \$ @* r8 q3 A$ a- W- _0 d# J 二、CAN控制器--寄存器简介+ j0 U5 I6 J2 Q4 U9 S
9 O9 s2 j2 x% \# Q0 I% Q8 i CAN主控制寄存器(CAN_MCR) ( u4 ?# M3 e& B% [2 U
INRQ位:设置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 CAN位时序寄存器(CAN_BTR)4 K) L5 p/ B# O2 ^/ K
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
CAN_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
! 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
& ^$ 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
图为CAN_TDLxR寄存器的描述,用于存储低4个字节的数据。CAN_TDHxR寄存器与之类似,用于存储高4个字节的数据。要发送的数据就是存储在这两个寄存器。 & B R8 C5 M. Y' u 8 o5 a Z) A+ R" H9 ?" T CAN接收FIFO邮箱标识符寄存器(CAN_RIxR)(x=0/1)
CAN接收FIFO邮箱数据长度和时间戳寄存器(CAN_RDTxR)(x=0/1)% t# h2 L7 [ T ! v* ^9 V" t( S. O
CAN筛选器模式寄存器(CAN_FM1R)& b/ @. _" |- {. W, ~' G : |4 j8 V' U" D
- }7 S4 g2 ` R' Y 该寄存器设置筛选器的工作模式,必须再CAN_FMR寄存器FINIT=1时配置。 8 U D2 E* `, D% L CAN筛选器尺度寄存器(CAN_FS1R)( [, D& U) O' @9 i! ~7 v6 `& u! m
该寄存器用于设置筛选器的位宽,必须在CAN_FMR寄存器FINIT=1时配置。 : o/ G- J. h3 s( c. c CAN筛选器FIFO关联寄存器(CAN_FFA1R)
该寄存器设置报文通过筛选器组之后,被存入的FIFO,如果对应位为0,则存储到FIFO0;如果为1,则存放到FIFO1。该寄存器只能在过滤器处于初始化模式(CAN_FMR寄存器的FINIT=1)下配置。 8 C$ R# \) z: l* E( N; i CAN筛选器激活寄存器(CAN_FA1R)
# 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) ) ]. D( U6 S- P" P' V4 P1 z I
每个筛选器组的CAN_FiRx都由2个32位寄存器构成,即:CAN_FiR1和CAN_FiR2。根据过滤器位宽和模式的不同设置,这两个寄存器的功能也不尽相同。 2 l8 D! n# C/ V* ^8 w4 \8 _: H- | 三、初始化流程4 ]9 _1 P9 J. z m. t! v: d9 j 1、配置相关引脚的复用功能,使能CAN时钟。 要用CAN,先要使能CAN的时钟,CAN的时钟通过APB1ENR的第25位来设置。其次要设置CAN的相关引脚为复用输出,这里我们需要设置PA1为上拉输入(CAN_RX引脚)PA12为复用输出(CAN_TX1引脚),并使能PA口的时钟。 2、设置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、设置滤波器。 例:使用筛选器组0,并工作在32位标识符屏蔽位模式下。先设置CAN_FMR的FINIT位,进入初始化模式,然后设置筛选器组0的工作模式以及标识符ID和屏蔽位。最后激活筛选器,并退出初始化模式。 ———————————————— 版权声明:三只树懒 ' q0 l0 A$ f& u* T1 Y$ X1 e$ X 如有侵权请联系删除/ {# @5 }& j3 ? X 6 r2 F1 n4 f* P' x- K! o. s |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版