STM32-CAN控制器介绍

STM32-CAN控制器介绍

对CAN接口部分重要知识点进行记录,更详细的需要查看参考手册

CAN协议介绍:https://blog.csdn.net/weixin_46251230/article/details/129147612

bxCAN简介

STM32的CAN接口叫做bxCAN,bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。

对于安全紧要的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能

时间触发模式:正常CAN通信是通过ID号来进行仲裁的,时间触发模式就不是通过ID号,而是通过一定的时间间隔来发送数据,需要自行规划好发送的间隔,避免造成冲突,而且数据也不会重发

发送具有3个发送邮箱,接收有3级深度的两个接收FIFO,这些都是用于数据的缓存作用

接收FIFO

共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理

CAN1比CAN2多了过滤器寄存器部分,所以CAN2接收到的数据ID需要通过CAN1来进行过滤,CAN1和CAN2都有自己的主发送邮箱和接收FIFO

接收滤波器的作用是过滤ID号的

在这里插入图片描述

bxCAN工作模式

bxCAN有3个主要的工作模式:初始化模式正常模式睡眠模式

初始化模式:该模式下是禁止发送和接收的,只能做些初始化的动作,比如配置寄存器,因为配置时不能影响到总线,所以是禁止发送接收的

正常模式:在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文

睡眠模式(低功耗):总线上没有数据通信时,就处于睡眠模式了

bxCAN测试模式

静默模式

发送数据内部就进行接收,自发自收,不会对外发送,但能接收外部的数据,可以用来测试内部的数据接收以及外部的数据接收

在这里插入图片描述

环回模式

环回模式是用来测试发送的,发送的数据可以被内部接收,同时还会发送到总线上,但不能接收外部i数据,在测试CAN功能是否正常时,可以使用该模式,只需一个主控板就行

在这里插入图片描述

环回静默模式

完全内部发送和接收,与总线上没有通信数据

在这里插入图片描述

发送处理

一开始发送邮箱处于空置状态,当往邮箱放入数据时,会变为挂号状态,因为邮箱是有3个优先级的,放入数据时可能高优先级的邮箱数据还没有发送出去,所以需要进行等待,进入挂号状态,当写入数据的邮箱变为最高优先级了,则进入预定状态,一旦CAN总线空闲时,数据就会被发送出去,处于发送状态,如果发送成功后会进入空置,发送失败也进入空置,失败时TXOK标志位置0,可以随时终止发送

在这里插入图片描述

接收处理

接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取 FIFO中最先收到的报文。

FIFO从空状态开始,在接收到第一个有效的报文后,FIFO状态变为挂号_ 1,软件可以读取FIFO输出邮箱来读出邮箱中的报文,然后通过对CAN_RFR寄存器的RFOM位设置’1’来释放邮箱,这样FIFO又变为空状态了。如果在释放邮箱的同时,又收到了一个有效的报文,那么FIFO仍然保留在挂号 _1状态,软件可以读取FIFO输出邮箱来读出新收到的报文。

如果应用程序不释放邮箱,在接收到下一个有效的报文后,FIFO状态变为挂号_ 2,重复上面的过程,第三个有效的报文把FIFO变为挂号_3状态

在这里插入图片描述

溢出

当FIFO处于挂号_3状态(即FIFO的3个邮箱都是满的),下一个有效的报文就会导致溢出,并且 一个报文会丢失。至于哪个报文会被丢弃,取决于对FIFO的设置:

1、如果禁用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被清’0’),那么FIFO中最后收到的报文就被新报文所覆盖。这样,最新收到的报文不会被丢弃掉。

2、如果启用了FIFO锁定功能(CAN_MCR寄存器的RFLM位被置’1’),那么新收到的报文就被丢弃,软件可以读到FIFO中最早收到的3个报文。

接收中断

一旦往FIFO存入一个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE位 为’1’,那么就会产生一个中断请求。 当FIFO变满时(即第3个报文被存入),CAN_RFR寄存器的FULL位就被置’1’,并且如果 CAN_IER寄存器的FFIE位为’1’,那么就会产生一个满中断请求。 在溢出的情况下,FOVR位被置’1’,并且如果CAN_IER寄存器的FOVIE位为’1’,那么就会产生 一个溢出中断请求

标识符过滤

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。

为满足这一需求,在互联型产品中,bxCAN控制器为应用程序提供了28个位宽可变的、可配置的过滤器组(27~0);在其它产品中,bxCAN控制器为应用程序提供了14个位宽可变的、可配置 的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和 CAN_FxR1组成。

STM32F1系列一个CAN的只有14个过滤器,如果是其他系列或者有两个CAN的就有28个过滤器

可变位宽

每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽的不同,每个过滤器组可提供:

1个32位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE和RTR位

2个16位过滤器,包括:STDID[10:0]、IDE、RTR和EXTID[17:15]位

为什么有16位和32位:因为CAN协议标准格式的数据帧ID是11位的,拓展格式的是29位的,当是11位ID就要用16位的过滤器,是29位ID的就用32位过滤器

屏蔽位模式(就相当于通配符,通配符位置的ID就不用关心,不是的就要匹配)

在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照 “必须匹配”或“不用关心”处理。

标识符列表模式(给出ID列表,需完全匹配)

在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一 个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同。

通过CAN_FMR的FBMx位,可以配置对应的屏蔽/ 标识符寄存器的标识符列表模式或屏蔽位模式。

为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式(通配符)

为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式(ID列表)

应用程序不用的过滤器组,应该保持在禁用状态。

在这里插入图片描述

2个16位标识符屏蔽模式的过滤器可以过滤两个ID,4个16位标识符列表的过滤器可以过滤4个ID

过滤器优先级

根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:

● 位宽为32位的过滤器,优先级高于位宽为16位的过滤器

● 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式

● 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高

在这里插入图片描述

上面的例子说明了bxCAN的过滤器规则:

在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤器的序号被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。

如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。 如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。

位时间特性

CAN总线的位时序分为了同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)和相位缓冲段 2(PBS2),STM32的CAN只分为了同步段(SYNC_SEG)时间段1(BS1)时间段2(BS2)时间段1包含了传播时间段和相位缓冲段1,时间段2对应相位缓冲段2

波特率计算公式如下

在这里插入图片描述

bxCAN中断

bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。

下面是发送中断和接收中断,还有一些错误中断可看参考手册

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46251230/article/details/129150872