1、STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:
- 支持CAN协议2.0A和2.0B主动模式
- 波特率最高达1Mbps
- 【STM32学习之CAN控制器简介】支持时间触发通信
- 具有3个发送邮箱
- 具有3级深度的2个接收FIFO
- 可变的筛选器组(也称过滤器组,最多28个)
①初始化模式(INRQ=1,SLEEP=0)
②正常模式(INRQ=0,SLEEP=0)
③睡眠模式(SLEEP=1)
文章图片
测试模式
①静默模式( LBKM=0,SILM=1 )
②环回模式( LBKM=1,SILM=0 )
③环回静默模式(LBKM=1,SILM=1)
文章图片
调试模式
文章图片
3、STM32 CAN控制器简介-bxCAN框图
CAN控制器框图如下:
文章图片
CAN的标识符不表示目的地址而是表示发送优先级。接收节点根据标识符的值,来决定是否接收对应消息。
STM32 CAN控制器,提供了28个可配置的筛选器组(F1仅互联型才有28个,其他的只有14个),可降低CPU处理CAN通信的开销。
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]位
筛选器可配置为:屏蔽位模式和标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。而在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟筛选器标识符相同。
通过CAN_FM1R和CAN_FS1R可配置筛选器的位宽和模式:
文章图片
- 为了过滤出一组标识符,应该设置筛选器组工作在屏蔽位模式。
- 为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。
- 应用程序不用的筛选器组,应该保持在禁用状态(通过CAN_FA1R设置)。
- 筛选器组中的每个筛选器,都被编号为(即:筛选器编号)从0开始,到某个最大数值-取决于筛选器组的模式和位宽的设置。
- 通过CAN_FFA1R的设置,可以将筛选器组关联到FIFO0/FIFO1
3、STM32 CAN控制器简介-发送流程
CAN发送流程:
CAN发送流程为:
程序选择1个空置的邮箱(TME=1)->设置标识符(ID),数据长度和发送数据->设置CAN_TIxR的TXRQ位为1,请求发送->邮箱挂号(等待成为最高优先级)->预定发送(等待总线空闲)->发送->邮箱空置。
文章图片
CAN接收流程 :
CAN接收流程为:
FIFO空->收到有效报文->挂号_1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会)->收到有效报文->挂号_2->收到有效报文->挂号_3->收到有效报文->溢出。
CAN收到的有效报文,存储在3级邮箱深度的FIFO中。FIFO接收到的报文数,我们可以通过查询CAN_RFxR的FMP寄存器来得到,只要FMP不为0,我们就可以从FIFO读出收到的报文。
文章图片
4、STM32 CAN控制器简介-位时序:
STM32的CAN位时序,如下图所示:
文章图片
STM32F103,设TS1=8、TS2=7、BRP=3,波特率=36000/[(9+8+1)*4]=500Kbps。
STM32F407,设TS1=6、TS2=5、BRP=5,波特率=42000/[(7+6+1)*6]=500Kbps。