STM32之CANCANID过滤器分析Word下载.docx
- 文档编号:18021884
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:16
- 大小:638.34KB
STM32之CANCANID过滤器分析Word下载.docx
《STM32之CANCANID过滤器分析Word下载.docx》由会员分享,可在线阅读,更多相关《STM32之CANCANID过滤器分析Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
•通过CAN_FM1R(CAN过滤器模式寄存器)的FBMx位,可以配置对应的屏蔽/标识符寄存器的标
识符列表模式或屏蔽位模式。
(见后续3.2节)
应用程序不用的过滤器组,应该保持在禁用状态。
关于过滤器配置,可参见下图
2.4过滤器匹配序号
一旦收到的报文被存入FIFO,就可被应用程序访问。
通常情况下,报文中的数据被拷贝到SRAM中;
为了把数据
拷贝到合适的位置,应用程序需要根据报文的标识符来辨别不同的数据。
bxCAN提供了过滤器匹配序号,以简化
这一辨别过程。
根据过滤器优先级规则,过滤器匹配序号和报文一起,被存入邮箱中。
因此每个收到的报文,都有与它相关联的过滤器匹配序号。
过滤器匹配序号可以通过下面两种方式来使用:
•把过滤器匹配序号跟一系列所期望的值进行比较•把过滤器匹配序号当作一个索引来访问目标地址对于标识符列表模式下的过滤器(非屏蔽方式的过滤器),软件不需要直接跟标识符进行比较。
对于屏蔽位模式下的过滤器,软件只须对需要的那些屏蔽位(必须匹配的位)进行比较即可。
在给过滤器编号时,并不考虑过滤器组是否为激活状态。
另外,每个FIFO各自对其关联的过滤器进行编号,如下图:
2.5过滤器优先级规则
根据过滤器的不同配置,有可能一个报文标识符能通过多个过滤器的过滤;
在这种情况下,存放在接收邮箱中的过滤器匹配序号,根据下列优先级规则来确定:
•位宽为32位的过滤器,优先级高于位宽为16位的过滤器
•对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式
•位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高如下图:
Exampleof3filterbanksin32-bitUnidentifiedListmodeandremainmgin32-bitIdentifierMaskmod«
M&
aiageRecei-ed
IdentifierCtrlData
MessageDrsc^rded
图3
如上图,在接收一个报文时,其标识符首先与配置在标识符列表模式下的过滤器相比较;
如果匹配上,报文就被存
放到相关联的FIFO中,并且所匹配的过滤器的序号(这时为4)被存入过滤器匹配序号中。
如同例子中所显示,
报文标识符跟#4标识符匹配,因此报文内容和FMI4被存入FIFO。
如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。
如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件有任何打扰。
3与过滤器相关的寄存器
3.1CAN过滤器主控寄存器(CAN_FMR)
地址偏移量:
0x200
复位值:
0x2A1C0E01
注:
该寄存器的非保留位完全由软件控制。
3130
29
282726
25
24
23
22
21
20
19
18
L7
16
保留
1514
13
121110
9
8
1
6
□
4
3
2
FIMT
rw
保81
CA\2SBL5:
0]
res
xw
图
位31:
保留位,强制为复位值。
位0
FINIT:
过滤器初始化模式针对所有过滤器组的初始化模式设置。
0:
过滤器组工作在正常模式;
1:
过滤器组工作在初始化模式。
3.2CAN过滤器模式寄存器(CAN_FM1R)
0x204
复位值:
0x00000000
只有在设置CAN_FMR(FINIT=1),使过滤器处于初始化模式下,才能对该寄存器写入。
31302928留跃饷2423222L2019IEIF1E
保蔭
1514131211109876513210
F^M13
FBM12
FBM11
FBM1Q
F&
M9
FBS17
FBM6
FBM4
FBM3
FBM2
FBM1
TVTwIr^nrnrrvnjrwrwrirnrnrrvrw
图5
14
保留位,硬件强制为0
位13:
FBMx:
过滤器模式
过滤器组x的工作模式。
过滤器组x的2个32位寄存器工作在标识符屏蔽位模式;
过滤器组x的2个32位寄存器工作在标识符列表模式。
3.3CAN过滤器位宽寄存器(CAN_FS1R)
0x20C
31
30
27
26
IS
17
15
12
11
10
S
7
5
FSC13
FSC12
PSC11
FSC1Q
FSC9
FSC8
FSC7
FSC6
FSCd
FSC4
FSC3
FSC2
FSC1
FSCC
nr
rv
Y垢
rp
TTT
tv
TT
图6
FSCx:
过滤器位宽设置过滤器组x(13〜0)的位宽。
0:
过滤器位宽为2个16位;
1:
过滤器位宽为单个32位。
3.4CAN过滤器FIFO关联寄存器(CAN_FFA1R)
0x214
保留位,硬件强制为0。
FFAx:
过滤器位宽设置
报文在通过了某过滤器的过滤后,将被存放到其关联的FIFO中。
0:
过滤器被关联到FIFO0;
1:
过滤器被关联到FIFO1o
3.5CAN过滤器激活寄存器(CAN_FA1R)
0x21C
31帥29272625242322212019131716
g
nf
e
FACT13
FACT12
FACT9
FACTS
FACT:
FACT6
FACI5
FACT4
FACT?
FACIl
FfiiCIO
rr
位
31:
FACTx:
过滤器激活
软件对某位设置1来激活相应的过滤器。
只有对FACTx位清0,或对CAN_FMR寄存器的FINIT位设置1后,才能修改相应的过滤器寄存器x(CAN_FxR[0:
1])。
过滤器被禁用;
过滤器被激活。
3.6CAN过滤器组x寄存器(CAN_FiRx)(i=0..13,x=1..2)
0x240h..0x2AC
未定义位
共有14组过滤器:
i=0..13。
每组过滤器由2个32位的寄存器,CAN_FiR[2:
1]组成。
只有在CAN_FaxR寄
存器(CAN过滤器激活寄存器)相应的FACTx位清’0'
或CAN_FMR寄存器(CAN过滤器主控寄存器)的FINIT位为’时,才能修改相应的过滤器寄存器。
28
1716
F031
FB30
FB28
FB27
FB26
FB25
FB23
FB23
FB22
FB21
FB20
FBI^
FB1&
FBI?
FE1G
ri
TW
IT
rir
『宵
ID
FBI4
FB13
FBi2
FB11
FBLO
FB9
FB7
FB6
FB5
FB』
FB3
FB2
FBI
FBO
TV
图8
必须匹配,到来的标识符位必须与滤波器对应的标识符寄存器位相一致。
根据过滤器位宽和模式的不同设置,过滤器组中的两个寄存器的功能也不尽相同。
。
关于过滤器的映射,功
能描述和屏蔽寄存器的关联,请参见2节标识符过滤。
屏蔽位模式下的屏蔽/标识符寄存器,跟标识符列表模式下的寄存器位定义相同。
4代码实例
4.1CANID值的结构分析
在讲到代码实例之前,首先大家都弄懂一件事,当给定一个CANID,如0x1800f001,当然这个是扩展ID,这里要
问的是,这个CANID的值本身包含两部分,即基本ID与扩展ID,即么你知道这个扩展ID0x1800f001的哪些位是基本ID,哪些位又是扩展ID?
(在基本CANID格式下不存在这个问题)
在回答这个问题之前我们来看看ISO11898的定义,如下图:
Firstbitfieldtranspired
Figure10—Orderofbittransmission(baserormat)
U-
O
7)
(base)Identifier
LU
Q
-
Identifier(exte口对on)
Ct
Control
Data
CRC
r"
z
1—
D
oa
L
c(T
DLC
MSB
I
LSB
乍I
l-irslbittransmitted
Figure11—Orderofbittransmission(extendedformat)
图9
如上图,基本格式不存在扩展ID,而扩展格式中ID0~ID17为ExtensionID,而ID18~ID28为BaseID.
因此CANID值0x1800f001用二进制表示为:
Ob00011000000000001111000000000001,用括号分别区别为:
0b000[11000000000][001111000000000001],红色部分为扩展ID,蓝色部分为基本ID。
那么知道这些有什么用呢?
接下来的代码示例中你就会有什么用了。
4.2位宽为32位的屏蔽模式
在此种模式下中过滤多个CANID,此时,过滤器包含两个寄存器,屏蔽码寄存器和标识符寄存器。
此模式下最多
只存在一个屏蔽过滤器。
如下图所示:
ID为标识符寄存器,中间部分的MASK为屏蔽码寄存器。
每个寄存器都是32位的。
最下边显示
CAN值
的是与CANID各位定位的映射关系。
由4.1的知识很快可以发现,上图最下边的映射关系恰好等于扩展左移3位再补上IDE(扩展帧标识),RTR(远程帧标志)。
因此,我们初步得出这样的推论:
对于一个扩展CANID,不能单纯地将它看到的一个数,而应该将它看成两部分,
基本ID和扩展ID(当然标准CANID只包含基本ID部分),过滤器屏蔽码寄存器和标识符寄存器也应该看成多个部分,然后问题就变成了如何将CANID所表示的各部分如何针对过滤器寄存器各部分对号入座的问题了。
对号入座的方法多种多样,但万变不离其心,主要是掌握其核心思想即可:
1:
在各种过滤器模式下,CANID与寄
存器相应位置一定要匹配;
2:
在屏蔽方式下,屏蔽码寄存器某位为1表示接收到的CANID对应的位必须对验证
码寄存器对应的位相同。
下面给出一个代码例子,假设我们要接收多个ID:
0x7e9,0x1800f001,前面为标准ID,后面为扩展ID,要同时能接
收这两个ID,那么该如何设置这个过滤器呢?
【cpp]
1.CAN_FilterlnitTypeDefCAN_FilterlnitStructure;
2.U16std」d=0x7e9;
3.U32ext_id=0x1800f001;
4.U32mask=0;
5.
5.CAN_Filterlnit(&
CAN_FilterlnitStructure);
//初始化CAN_FilterlnitStructrue结构体变量
6.CAN_FilterlnitStructure.CAN_FilterNumber=0;
//设置过滤器组0,范围为0〜13
7.CAN_FilterlnitStructure.CAN_FilterMode=CAN_FilterMode_ldMask;
//设置过滤器组0为屏蔽模式
8.CAN_FilterlnitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
//设置过滤器组0位宽为32位
10.
9.//标识位寄存器的设置
10.//ext_id<
<
3对齐,见上图9,再>
>
16取高16位
11.
//设置标识符寄存器高字节。
设置标识符寄存器低字节
CAN_FilterlnitStructure.CAN_FilterldHigh=((ext_id<
3)>
16)&
0xffff;
12.CAN_FilterlnitStructure.CAN_FilterldLow=(U16)(ext_id<
3)|CAN_ID_EXT;
//
13.//这里也可以这样设置
14.〃CAN_FilterlnitStructure.CAN_FilterldHigh=std_id<
5;
//设置标识符寄存器高字节.这里为什么是左移5
位呢?
从上图可以看出,CAN_FilterIdHigh包含的是STD[O〜10]和EXID[13〜17],标准CANID本身是不包含扩展
ID数据,因此为了要将标准CANID放入此寄存器,标准CANID首先应左移5位后才能对齐.
15.〃CAN_FilterlnitStructure.CAN_FilterldLow=0|CAN」D_EXT;
//设置标识符寄存器低字节,这里也可以设置
为CAN_ID_STD
18.
19.//屏蔽寄存器的设置
20.//这里的思路是先将标准CANID和扩展CANID对应的ID值先异或后取反,为什么?
异或是为了找出两个CANID
有哪些位是相同的,是相同的位则说明需要关心,需要关心的位对应的屏蔽码位应该设置为1,因此需要取反一下。
最后再整体左移3位。
21.mask=(std_id<
18);
〃这里为什么左移18位?
因为从ISO11898中可以看出,标准CANID占ID18〜ID28,为了
与CAN_FilterIdHigh对齐,应左移2位,接着为了与扩展CAN对应,还应该再左移16位,因此,总共应左移2+16
=18位。
也可以用另一个方式来理解:
直接看Mapping的内容,发现STDID相对EXID[0]偏移了18位,因此左移18位.
22.maskA=ext_id;
//将对齐后的标准CAN与扩展CAN异或后取反
23.mask=~mask;
24.mask<
=3;
〃再整体左移3位
25.mask|=0x02;
//只接收数据帧,不接收远程帧
26.
设置屏蔽寄存器高字节
设置屏蔽寄存器低字节
此过滤器组关联到接收FIFO0
激活此过滤器组
CAN_FilterlnitStructure.CAN_FilterMaskldHigh=(mask>
16)&
27.CAN_FilterlnitStructure.CAN_FilterMaskldLow=mask&
//28.
29.CAN_FilterlnitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
30.CAN_FilterlnitStructure.CAN_FilterActivation=ENABLE;
31.
设置过滤器
CANFilterlnit(&
CANFilterlnitStructure);
总结可知,当过滤器为屏蔽模式时,标识符寄存器对应的ID内容可为任意一需求接收的ID值,当同时要接收标准
帧和扩展帧时,标识符寄存器对应IDE位也随意设置,屏蔽寄存器的IDE位设置为0,表示不关心标准帧还是扩展帧。
而屏蔽寄存器对应的ID内容为各需求接收的ID值依次异或的结果再取反。
4.3位宽为32位的标识符列表模式
在此种模式下,过滤器组包含的两个寄存器含义一样,此模式下只多存在两个标识符列表过滤器如下图:
图11
[cpp]
3.U32ext_id=0x1800f001;
8.
16.
17.CAN_FilterlnitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
//此过滤器组关联到接收FlFO0
18.CAN_FilterlnitStructure.CAN_FilterActivation=ENABLE;
//激活此过滤器组
19.CANFilterlnit(&
//设置过滤器
4.4位宽为16位的屏蔽码模式
在此模式下,最多存在两个屏蔽码过滤器,如下图:
图12
由上图映射可知,最下面的映射只包含STDID0〜ID10,因此,此模式下的两个屏蔽过滤器只能实现对标准lD的过滤。
具体代码就不介绍了,参见上图的映射即可。
4.5位宽为16位的标识符列表模式
5LIFour16-BitFilters-IdentifierList
CANPxRl'
lS:
9|
CANPxRl[7iO|
in
CAN.I-jcHI;
24]
CANFxR1[23;
15]
;
nt1
CAN
CANFrfl2[7;
0l
】n+2
CAKFxRe|3k24]
CANFxft2[23:
18]
-n+3
Mapping
STC[iqp]
STlDk^imiDE
EXID|17;
1z-]
J
图13
在此模式下,由于标识符寄存器的高16位和低16位,屏蔽寄存器的高16位和低16位都用来做标识符寄存器,
因此,最多可存在4个标识符过滤器。
同样,只能实现对标准帧的过滤。
具体代码就不介绍了,参见上图的映射即可。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 CANCANID 过滤器 分析