首页 » 通讯 » 干货|从头到脚剖析STM32上的CAN通讯_报文_过滤器

干货|从头到脚剖析STM32上的CAN通讯_报文_过滤器

少女玫瑰心 2024-11-16 10:38:46 0

扫一扫用手机浏览

文章目录 [+]

一.事情模式 通过CAN_MCR寄存器掌握INRQ和SLEEP

1.初始化INRQ=1 SLEEP=0

干货|从头到脚剖析STM32上的CAN通讯_报文_过滤器 干货|从头到脚剖析STM32上的CAN通讯_报文_过滤器 通讯

软件初始化该当在硬件

干货|从头到脚剖析STM32上的CAN通讯_报文_过滤器 干货|从头到脚剖析STM32上的CAN通讯_报文_过滤器 通讯
(图片来自网络侵删)

2.正常INRQ=0 SLEEP=0

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

3.就寝SLEEP=1 bxCAN可事情在低功耗的就寝模式

二.测试模式 通过CAN_BTR寄存器掌握LBKM和SILM

1. 静默 可以接管不能发送

2. 循回 可以发送不能接管

3.环回静默 只能自发自收

三.调试模式

STM32标识符筛选器

在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的优先级干系的。
因此,节点在吸收报文时-根据标识符的值-决定软件是否须要该报文;如果须要,就拷贝到SRAM里;如果不须要,报文就被丢弃且无需软件的干预。
为知足这一需求,bxCAN为运用程序供应了14个位宽可变的、可配置的过滤器组(13~0),以便只吸收那些软件须要的报文。
硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。

STM32普通型芯片的 CAN 有14组过滤器组(互联型有28组过滤器组) ,用以对吸收到的帧进行过滤。
每组过滤器包括了2个可配置的32位寄存器:CAN_FxR1和 CAN_FxR2。
对付过滤器组,通过设置CAN_FM0R的FBMx位,

1.屏蔽位模式

这样 CAN_FxR0中保存的便是标识符匹配值,CAN_FxR2中保存的是屏蔽码,即 CAN_FxR2中如果某一位为1,则 CAN_FxR1中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器。
CAN_FxR2中为0的位表示 CAN_FxR1中的相应位可不必与收到的帧进行匹配。

2.标识符列表模式

此时 CAN_FxR1和CAN_FxR2中的都是要匹配的标识符,收到的帧的标识符必须与个中的一个吻合才能通过过滤。

理解:标识符列表模式是为了过滤出一个标识符,而屏蔽位模式由于屏蔽了某些位以是可以过滤出一组标识符,对付不须要用筛选器组的应处以禁用状态

一样平常我们用的都是普通型的,以是在本文中可以说 STM32有14组过滤器组。
根据配置,每1组过滤器组可以有1个,2个或4个过滤器。
这些过滤器相称于关卡,每当收到一条报文时,CAN 要先将收到的报文从这些过滤器上”过”一下,能通过的报文是有效报文,收进 FIFO,不能通过的是无效报文(不是发给”我”的报文),直接丢弃。
通过对两个可配置寄存器值得改变可以选择过滤器的数量。
在一组过滤器中,整组的过滤器都利用同一种事情模式。

其余,每组过滤器中的过滤器宽度是可变的,可以是32位或16位。
按事情模式和宽度,一个过滤器组可以变成以下几中形式之一:

(1) 1个32位的屏蔽位模式的过滤器。

(2) 2个32位的列表模式的过滤器。

(3) 2个16位的屏蔽位模式的过滤器。

(4) 4个16位的列表模式的过滤器。

所有的过滤器是并联的,即一个报文只要通过了一个过滤器,便是算是有效的。
每组过滤器组有两个32位的寄存器用于存储过滤用的”标准值”,分别是 FxR1,FxR2。

解读:

1.在32位的屏蔽位模式下:

有1个过滤器。

FxR2用于指定须要关心哪些位,FxR1用于指定这些位的标准值。

2.在32位的列表模式下:

有两个过滤器。

FxR1指定过滤器0的标准值,收到报文的标识符只有跟 FxR1完备相同时,才算通过。

FxR2指定过滤器1的标准值。

3.在16位的屏蔽位模式下:

有2个过滤器。

FxR1配置过滤器0,个中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值。

FxR2配置过滤器1,个中,[31-16]位指定要关心的位,[15-0]位指定这些位的标准值。

4.在16位的列表模式下:

有4个过滤器。

FxR1的[15-0]位配置过滤器0,FxR1的[31-16]位配置过滤器1。

FxR2的[15-0]位配置过滤器2,FxR2的[31-16]位配置过滤器3。

FIFO

STM32的 CAN 有两个 FIFO,分别是 FIFO0和 FIFO1。
为了便于区分,下面 FIFO0写作FIFO_0,FIFO1写作 FIFO_1。

每组过滤器组必须关联且只能关联一个 FIFO。
复位默认都关联到 FIFO_0。
所谓“关联”是指如果收到的报文从某个过滤器通过了,那么该报文会被存到该过滤器相连的 FIFO。
从另一方面来说,每个 FIFO 都关联了一串的过滤器组,两个 FIFO 刚好瓜分了所有的过滤器组。
每当收到一个报文,CAN 就将这个报文先与 FIFO_0关联的过滤器比较,如果被匹配,就将此报文放入 FIFO_0中。
如果不匹配, 再将报文与 FIFO_1关联的过滤器比较, 如果被匹配, 该报文就放入 FIFO_1中。
如果还是不匹配,此报文就被丢弃。

每个 FIFO 的所有过滤器都是并联的,只要通过了个中任何一个过滤器,该报文就有效。
如果一个报文既符合 FIFO_0的规定,又符合 FIFO_1的规定,显然,根据操作顺序,它只会放到 FIFO_0中。

每个 FIFO 中只有激活了的过滤器才起浸染,换句话说,如果一个 FIFO 有20个过滤器,但是只激话了5个,那么比较报文时,只拿这5个过滤器作比较。
一样平常要用到某个过滤器时,在初始化阶段就直接将它激活。
须要把稳的是,每个 FIFO 必须至少激活一个过滤器,它才有可能收到报文。
如果一个过滤器都没有激活,那么是所有报文都报废的。
一样平常的,如果不想用繁芜的过滤功能, FIFO 可以只激活一组过滤器组,且将它设置成 32位的屏蔽位模式,两个标准值寄存器(FxR1,FxR2)都设置成0。
这样所有报文均能通过。
(STM32供应的例程里便是这么做的!

过滤器匹配序号

过滤器编号用于加速 CPU 对收到报文的处理。
收到一个有效报文时, CAN 会将收到的报文 以及它所通过的过滤器编号, 一起存入吸收邮箱中。
CPU 在处理时,可以根据过滤器编号,快速的知道该报文的用场,从而作出相应处理。

不用过滤器编号实在也是可以的, 这时候 CPU 就要剖析所收报文的标识符, 从而知道报文的用场。
由于标识符所含的信息较多,处理起来就慢一点了。

STM32利用以下规则对过滤器编号:

(1) FIFO_0和 FIFO_1的过滤器分别独立编号,均从0开始按顺序编号。

(2) 所有关联同一个 FIFO 的过滤器,不管有没有被激活,均统一进行编号。

(3) 编号从0开始,按过滤器组的编号从小到大,按顺序排列。

(4) 在同一过滤器组内,按寄存器从小到大编号。
FxR1配置的过滤器编号小,FxR2配置

的过滤器编号大。

(5) 同一个寄存器内,按位序从小到大编号。
[15-0]位配置的过滤器编号小,[31-16]位

配置的过滤器编号大。

(6) 过滤器编号是弹性的。
当变动了设置时,每个过滤器的编号都会改变。

但是在设置不变的情形下,各个过滤器的编号是相对稳定的。

这样,每个过滤器在自己在 FIFO 中都有编号。

在 FIFO_0中,编号从0 – (M-1), 个中 M 为它的过滤器总数。

在 FIFO_1中,编号从0 – (N-1),,个中 N 为它的过滤器总数。

一个 FIFO 如果有很多的过滤器,,可能会有一条报文, 在几个过滤器上均能通过,这时 候,,这条报文算是从哪儿过来的呢?

STM32在利用过滤器时,按以下顺序进行过滤:

(1) 位宽为32位的过滤器,优先级高于位宽为16位的过滤器。

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

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

按这样的顺序,报文能通过的第一个过滤器,便是该报文的过滤器编号,被存入吸收邮箱中。

上面的例子解释了bxCAN的过滤器规则:在吸收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器比较较;如果匹配上,报文就被存放到干系联的FIFO中,并且所匹配的过滤器的序号被存入过滤器匹配序号中。
犹如例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。
如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。
如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。

发送

发送报文的流程

运用程序选择1个空置的发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来要求发送。
TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空置,软件对邮箱寄存器就不再有写的权限。
TXRQ位置1后,邮箱立时进入登记状态,并等待成为最高优先级的邮箱,拜会发送优先级。
一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。
一旦CAN总线进入空闲状态,预定发送邮箱中的报文就立时被发送(进入发送状态)。
一旦邮箱中的报文被成功发送后,它立时变为空置邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
如果发送失落败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送缺点引起的就对TERR位置’1’。

发送优先级

一.标识符决定

当有超过1个发送邮箱在登记时,发送顺序由邮箱中报文的标识符决定。
根据CAN协议,标识符数值最低的报文具有最高的优先级。
如果标识符的值相等,那么邮箱号小的报文先被发送。
由发送要求次序决定。

二.由发送要求次序决定

通过对CAN_MCR寄存器的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。
在该模式下,发送的优先级由发送要求次序决定。
该模式对分段发送很有用。

中止

通过对CAN_TSR寄存器的ABRQ位置’1’,可以中止发送要求。
邮箱如果处于登记或预定状态,发送要求立时就被中止了。
如果邮箱处于发送状态,那么中止要求可能导致2种结果。
如果邮箱中的报文被成功发送,那么邮箱变为空置邮箱,并且CAN_TSR寄存器的TXOK位被硬件置’1’。
如果邮箱中的报文发送失落败了,那么邮箱变为预定状态,然后发送要求被中止,邮箱变为空置邮箱且TXOK位被硬件清’0’。
因此如果邮箱处于发送状态,那么在发送操作结束后,邮箱都会变为空置邮箱。

接管

接管流程

FIFO从空状态开始,在吸收到第一个有效的报文后, FIFO状态变为登记_1(pending_1),硬件相应地把CAN_RFR寄存器的FMP[1:0]设置为’01’(二进制01b)。
软件可以读取FIFO输出邮箱来读出邮箱中的报文,然后通过对CAN_RFR寄存器的RFOM位设置’1’来开释邮箱,这样FIFO又变为空状态了。
如果在开释邮箱的同时,又收到了一个有效的报文,那么FIFO仍旧保留在登记_1状态,软件可以读取FIFO输出邮箱来读出新收到的报文。
如果运用程序不开释邮箱,在吸收到下一个有效的报文后, FIFO状态变为登记_2(pending_2),硬件相应地把FMP[1:0]设置为’10’(二进制10b)。
重复上面的过程,第三个有效的报文把FIFO变为登记_3状态(FMP[1:0]=11b)。
此时,软件必须对RFOM位设置1来开释邮箱,以便FIFO可以有空间来存放下一个有效的报文;否则,下一个有效的报文到来时就会导致一个报文的丢失。

溢出

当FIFO处于登记_3状态(即FIFO的3个邮箱都是满的),下一个有效的报文就会导致溢出,并且一个报文会丢失。
此时,硬件对CAN_RFR寄存器的FOVR位进行置’1’来表明溢出情形。
至于哪个报文会被丢弃,取决于对FIFO的设置:

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

● 如果启用了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总线,并且通过与帧起始位的边沿进行同步,及通过与后面的边沿进行重新同步,来调度其采样点。

它的操作可以大略阐明为,如下所述把名义上的每位韶光分为3段:

● 同步段(SYNC_SEG):常日期望位的变革发生在该韶光段内。
其值固定为1个韶光单元(1 xtCAN)。

● 韶光段1(BS1):定义采样点的位置。
它包含CAN标准里的PROP_SEG和PHASE_SEG1。

其值可以编程为1到16个韶光单元,但也可以被自动延长,以补偿由于网络中不同节点的频率差异所造成的相位的正向漂移。

● 韶光段2(BS2):定义发送点的位置。
它代表CAN标准里的PHASE_SEG2。
其值可以编程为1到8个韶光单元,但也可以被自动缩短以补偿相位的负向漂移。

重新同步跳跃宽度(SJW)定义了,在每位中可以延长或缩短多少个韶光单元的上限。
其值可以编程为1到4个韶光单元。

有效跳变被定义为,当bxCAN自己没有发送隐性位时,从显性位到隐性位的第1次转变。
如果在韶光段1(BS1)而不是在同步段(SYNC_SEG)检测到有效跳变,那么BS1的韶光就被延长最多SJW那么长,从而采样点被延迟了。
相反如果在韶光段2(BS2)而不是在SYNC_SEG检测到有效跳变,那么BS2的韶光就被缩短最多SJW那么长,从而采样点被提前了。
为了避免软件的编程缺点,对位韶光特性寄存器(CAN_BTR)的设置,只能bxCAN处于初始化状态下进行。

中断

● 发送中断可由下列事宜产生:

─ 发送邮箱0变为空, CAN_TSR寄存器的RQCP0位被置’1’。

─ 发送邮箱1变为空, CAN_TSR寄存器的RQCP1位被置’1’。

─ 发送邮箱2变为空, CAN_TSR寄存器的RQCP2位被置’1’。

● FIFO0中断可由下列事宜产生:

─ FIFO0吸收到一个新报文, CAN_RF0R寄存器的FMP0位不再是’00’。

─ FIFO0变为满的情形, CAN_RF0R寄存器的FULL0位被置’1’。

─ FIFO0发生溢出的情形, CAN_RF0R寄存器的FOVR0位被置’1’。

● FIFO1中断可由下列事宜产生:

─ FIFO1吸收到一个新报文, CAN_RF1R寄存器的FMP1位不再是’00’。

─ FIFO1变为满的情形, CAN_RF1R寄存器的FULL1位被置’1’。

─ FIFO1发生溢出的情形, CAN_RF1R寄存器的FOVR1位被置’1’。

● 缺点和状态变革中断可由下列事宜产生:

─ 出错情形,关于出错情形的详细信息请参考CAN缺点状态寄存器(CAN_ESR)。

─ 唤醒情形,在CAN吸收引脚上监视到帧起始位(SOF)。

─ CAN进入就寝模式。

关于标识符筛选器和筛选器匹配序号的理解

这两个观点理解起来有点麻烦下面举个例子来理解。
面前有很多门,门上写着不同的属性,人得依据属性进门,比如说小门1 小门2 中门 大门1 大门2 个中小门1哀求身高正好即是1.87的人进入 而中门哀求身高小于1.90大于1.87的人进入 这2个观点便是标志筛选器的观点一个是标志符列表,另一个是屏蔽位 而进入门的人在后面的环节中 有丈量身高这一环 为了快速获知他们的身高 我们可以用他们进的门来表示,由于门实际上包含了他们的身高信息这便是筛选器匹配的观点 筛选器匹配便是在很多门中有可能同时都可以使这个人进入 但是只有那一个门的身高和人得身高最靠近 比如说人高1.70 门A哀求1.68-1.12 门B哀求1.70 那么便是门B由此筛选出门B这个匹配序号 可以直接获知这个人得身高信息。

相关文章

给3ds LL从新制作一条充电线_芯片_充电器

前几天在短视频平台上看到了3DS《节奏天国》的视频,很魔性,很上头。这么经典的游戏没有玩过,实在是罪过。于是就翻出了我吃灰已久3D...

通讯 2025-01-20 阅读0 评论0