STM32的CAN外设

我们的CAN控制器支持最高的通讯速率为1Mb/s,可以自动地接收和发送CAN报文,支持使用标准ID和扩展ID地报文,外设中具有3个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间,具有两个3级深度的接收FIFO,可使用过滤功能只接受或不接收某些ID号,可配置成自动重发,不支持使用DMA进行数据收发。

在上图中,我们可以发现STM32是有两组CAN,其中这个CAN1是主设备,我们这个CAN2是从设备,其中这个"存储器访问控制器"是由CAN1控制的,要是我们的CAN2想使用的话,我们就要打开CAN1的外设时钟才可以使用,

第一个是控制内核,第二个是发送邮箱,第三个是接收FIFO,第四个是验收筛选器。

下面我们就对这个几个部分分别介绍一下了

1.CAN控制内核

在CAN的控制内核中,包含着各种控制寄存器和状态寄存器,这次我们主要学习一下其中的主控制寄存器CAN_MCR以及位时序寄存器CAN_BTR。

主控制寄存器CAN_MCR

主控制器寄存器CAN_MCR负责管理CAN的工作模式,它使用以下寄存器位实现控制。

(1)DBF调试冻结功能

使用这个可设置我们CAN处于工作状态或禁止收发的状态,处于程序调试的时候才使用的。

置0的话就表示我们CAN处于工作状态

置1的话就表示我们CAN处于接收/发送冻结状态。接收FIFO仍可正常访问/控制

(2)TTCM时间触发模式

这个是用于配置CAN的时间触发通信模式,在此模式下,CAN使用它内部定时器产生时间戳,并把它保存在CAN_RDTxR , CAN_TDTxR寄存器中。内部定时器在每个CAN位时间累加,在接收和发送的帧起始位被采样,并生成时间戳。利用这个可以实现ISO 11898-4CAN标准的分时同步通信功能。

(3)ABOM自动离线管理

它用于设置是否使用自动离线管理功能,当节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态,在离线状态中,CAN不能接收或发送报文。处于离线状态的时候,可以软件控制恢复或者直接使用这个自动离线管理功能,它会在适当的时候自动恢复。

(4)AWUM自动唤醒

CAN外设可以使用软件进入低功耗的睡眠模式,如果使能这个自动唤醒功能,当CAN检测到总线活动的时候会自动唤醒。

(5)NART自动重传

设置了这个动能后,当报文发送失败时会自动重传至成功为止。若不使用这个功能,消息只发送一次。

(6)RFLM锁定模式

该功能用于锁定接收FIFO,锁定后,当接收FIFO溢出时,会丢弃下一个接收的报文。

如果不锁定,我们下一个接收的报文会覆盖原来报文。

(7)TXFP报文发送优先级的判定方法

当CAN外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。

位时序寄存器(CAN_BTR)及波特率

CAN_BTR寄存器可用于配置测试模式,波特率以及各种位内的段参数

(1)测试模式

为方便调试,STM32的CAN提供了测试模式,我们配置位时序寄存器CAN_BTR的SILM和LBKM寄存器位可以控制使用正常模式,静默模式,回环模式,及静默回环模式。

如上图,各种模式介绍如下:

1.正常模式

正常模式下就是一个正常的CAN节点,可以向总线发送数据和接收数据。

2.静默模式

在静默模式下,它自己的输出端的逻辑0会直接传输到它自己的输入端,逻辑1可以被发送到总线,所以它是不能向总线发送显性位(逻辑0),只能发送隐性位(逻辑1).输入端可以从总线接收内容.;由于它只发送隐性位不会强制影响总线的状态,所以我们称它为静默模式.

这种模式一般用于监测,它可以分析总线上的流量,但又不会因为发送显性位而影响总线.

3.回环模式

回环模式下,它自己的输出端的所有内容都直接传输到自己的输入端,输出端的内容同时也会被传输到总线上,即也可使用总线监测它的发送内容.输入端只接受自己发送端的内容,不接收来自总线上的内容.可以使用回环模式可以进行自检.

4.回环静默模式

这是回环模式和静默模式的结合,自己输出的端的所有内容都直接传输到自己的输入端,并且不会向总线发送显性位影响总线,不能通过总线监测它的发送内容,输入端只接受自己发送端的内容,不接收来自总线上的东西.这种方式一般在"热自检"时使用,即自我检查的时候,不会干扰总线

以上的四种模式都是不用修改硬件接线的.

(2)位时序及波特率

STM32外设定义的位时序和我们前面解释的CAN标准时序有一点区别,

STM32的CAN外设位时序中只包含3段,分别是同步段SYNC_SEG,位段BS1及位段BS2,这个BS1段可以理解成前面介绍的PTS段与PBS1段合在一起的.

采样点位于BS1和BS2段的交界处,其中同步段SYNC_SEG固定为1Tq,而这个BS1和BS2段可以在位时序寄存器CAN_BTR设置它们的时间长度,它们可以在重新同步期间增长或缩短,该长度SJW也可在位时序寄存器中配置.

了解了位时序以后,我们就可以配置波特率了.通过配置位时序寄存器CAN_BTR的的TS1[3:0]以及TS2[2:0]寄存器位设定BS1及BS2段的长度后,我们就可以确定每个CAN数据位的时间:

BS1段时间:

Ts1 = Tq ✖ (TS1[3:0]+1),

BS2段时间:

Ts2 = Tq ✖ (TS2[3:0]+1),

一个数据位的时间:

T1bit = 1Tq+Ts1+Ts2 = 1+(TS1[3:0]+1)+(TS2[2:0]+1) = NTq

其中这个Tq时间片的长度与CAN外设的所挂载的时钟总线及分频器配置有关,CAN1和CAN2外设都是挂载在APB1总线上,而我们CAN_BTR中的BRP[9:0]寄存器位可以设置CAN外设时钟的分频值,所以:

Tq = (BRP[9:0]+1)✖Tpclk

其中的PCLK指APB1时钟,默认值为45Mhz.

最终可以计算出CAN通讯的波特率:

BaudRate = 1/N Tq;

如下表有一种波特率为1Mbps的方式,说明了一种把波特率配置为1Mbps的方式

理解一下就是 总的 9Tq, 45Mhz 拿来5分频就是9Mhz,波特率就是9Tq除以9Mhz等于1Mbps.

(3)CAN发送邮箱

我们STM32一共有3个发送邮箱,即最多可以缓存3个待发送的报文,

在每个发送邮箱中包含标识符寄存器CAN_TIxR,数据长度控制寄存器CAN_TDTxR及2个数据寄存器CAN_TDLxR,CAN_TDHxR,它们的功能见表发送邮箱的寄存器

当我们要使用CAN外设发送报文时,把报文的各个段分解,按位置写入到这些寄存器中,并对标识符寄存器CAN_TIxR中的发送请求寄存器位TMIDxR_TXRQ置1,即可把数据发送出去.

其中标识寄存器CAN_TIxR 将它的TXRQ置1 就可以发送出去数据,有一个地方比较特殊,就是当IDE置0的时候就是标准标识符,置1的时候就是扩展标识符,我们在标准标识符的时候因为总位数是11位数据,所以我们这个CAN_TIxR的寄存器只用在前11位,当我们是扩展标识符的时候,我们总位数是29位,所以就前29位完整的用起来了.

(4)CAN接收FIFO

看在我们STM32的CAN外设有两个接收FIFO,每个FIFO中有3个邮箱,即最多可以缓存6个接收到的报文,当接收到报文时,FIFO的报文计数器会自增,而我们STM32内部读取FIFO数据之后,报文计数器会自减,我们通过状态寄存器可获知报文计数器的值,

和发送邮箱类似,每个接收FIFO中包含有标识寄存器CAN_RIxR,数据长度控制寄存器CAN_RDTxR及2个数据寄存器CAN_RDLxR,CAN_RDHxR,它们的功能如下图

我们读取这些寄存器的值即可把接收到的报文加载到STM32的内存中

(5)验收筛选器

我们一共28个筛选器组,每个筛选器组有2个寄存器,CAN1和CAN2公用的筛选器.

在CAN协议中,消息的标识符与节点地址无关,但是和消息内容有关.因此,发送节点将报文广播给所有接收器时,接收节点会根据报文标识符的值来确定软件是否需要该消息,

为了简化软件的工作.STM32的CAN外设接收报文前会先使用验收筛选器检查,只接收需要的报文到FIFO中.

筛选器工作的时候,可以调整筛选ID的长度以及过滤模式.根据筛选ID长度来分类有以下两种:

(1)检查STDID[10:0],EXTID[17:0],IDE和RTR位,一共31位

(2)检查STDID[10:0],RTR,IDE和EXTID[17:15],一共16位

通过配置筛选尺度寄存器CAN_FSIR的FSCx位可以设置筛选器工作在哪个尺度

而根据过滤的方法分为以下两种模式:

(1)标识符列表模式,它要把接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,白名单管理

(2)掩码模式,它把可接受收报文ID的某几位作为列表,这几位被称为掩码,可以理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到FIFO

通过配置筛选尺度寄存器CAN_FSIR的FBMx位可以设置筛选器工作在哪个模式

具体全部总结如下图

每组筛选器包含2个32位的寄存器,分别位CAN_FxR1和CAN_FxR2,他们用来存储要筛选的ID或掩码,各个寄存器位代表的意义与下图所示一致

我们举个例子,大概理解一下

就像这个表格,

在掩码模式下的时候,第一个寄存器存储的就是要筛选的ID,第二个寄存器存储的掩码,

这个掩码为1的地方,表示该位必须与ID中的内容一样,而0的话就是表示该位可以是0也可以是1

最后筛选的ID 就是第三行所示

如果是标识符模式,2个寄存器存储的都是要筛选的ID,不一样的直接丢弃掉.

相关推荐
嵌入式科普10 分钟前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
嵌入式大圣13 分钟前
单片机UDP数据透传
单片机·嵌入式硬件·udp
A懿轩A13 分钟前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒22 分钟前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
云山工作室41 分钟前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费44 分钟前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
kkflash31 小时前
提升专业素养的实用指南
学习·职场和发展
Hejjon1 小时前
SpringBoot 整合 SQLite 数据库
笔记
1 9 J1 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
qq_397562313 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机