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,不一样的直接丢弃掉.

相关推荐
chushiyunen16 分钟前
dom操作笔记、xml和document等
xml·java·笔记
chushiyunen19 分钟前
tomcat使用笔记、启动失败但是未打印日志
java·笔记·tomcat
汇能感知23 分钟前
光谱相机的光谱数据采集原理
经验分享·笔记·科技
人人题1 小时前
汽车加气站操作工考试答题模板
笔记·职场和发展·微信小程序·汽车·创业创新·学习方法·业界资讯
小脑斧爱吃鱼鱼1 小时前
鸿蒙项目笔记(1)
笔记·学习·harmonyos
阿linlin1 小时前
OpenCV--图像预处理学习01
opencv·学习·计算机视觉
可待电子单片机设计定制(论文)2 小时前
【STM32设计】数控直流稳压电源的设计与实现(实物+资料+论文)
stm32·嵌入式硬件·mongodb
张张张3122 小时前
4.2学习总结 Java:list系列集合
java·学习
SuperW2 小时前
linux课程学习二——缓存
学习
march_birds2 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构