硬件:阿波罗STM32F429IGTx开发板
软件:keil5,c语言
一、问题描述
使用正点原子的CAN模块,接收指定帧ID的CAN报文。
二、问题分析
根据STM32F429开发指南可知,STM32F429 拥有28个过滤器,每个过滤器是一个 32 位寄存器。其中,每两个过滤器分为一组,共14组。为什么要两两一组呢?是为了提供两种过滤模式:屏蔽位模式和标识符列表模式。
1.屏蔽位模式
以STM32F429中的单组过滤器进行说明:
屏蔽位模式:第一个过滤器存放 验证码(下图中的ID),第二个过滤器存放屏蔽码(下图中的掩码)。
其中,验证码和屏蔽码的作用也很简单:
屏蔽码指定了需要关心的位。
验证码指定了用来比较的值。
以下图为例:假设我们想筛选出第7,8,9,10为数值“1156”的身份证,那么首先可以使用屏蔽码000000111100000000 & 身份证号码,屏蔽掉无关位,只留下我们关心的第7,8,9,10位数值,然后再将结果与我们提前设定好的验证码000000115600000000 进行比较。如果判断相同,就得到了我们想要的身份证号码,如果不同就舍弃。
在这种模式下,每两个过滤器为一组,限制帧ID的接收。
2.列表模式
以STM32F429中的单组过滤器进行说明:
列表模式:第一个过滤器存放 验证码(下图中的ID),第二个过滤器仍存放验证码(下图中的第二个ID)。
这个就原理更简单啦:
验证码直接标识了我们想要的值。
假设我们只想接收为1826f456的帧ID,就设置验证码为此数值就可以了,将收到的帧ID与设置的验证码进行比较即可。
在这种模式下,每个过滤器都可以标识一个指定的帧ID,所以最多可以接收28个帧ID。
3.其他
由于STM32F429 每个过滤器组的位宽都可以独立配置,以满足应用程序的不同需求。根据位宽
的不同,每个过滤器组可提供:
● 1 个 32 位过滤器,包括:STDID[10:0]、EXTID[17:0]、IDE 和 RTR 位
● 2 个 16 位过滤器,包括:STDID[10:0]、IDE、RTR 和 EXTID[17:15]位
如果我们接收CAN报文的扩展帧,扩展帧ID为29位,就可以选用32位的过滤器。如果接收CAN报文的标准帧,标准帧ID为11位,就可以选用16位的过滤器。两种情况都考虑到了,真的很方便。
下图中最右边的筛选器编号,就是之前说的过滤器组。
两个过滤器为一组,编号范围为0-13。

三、问题解决
我的需求是接收4个各不相同的扩展帧ID,所以考虑使用列表模式。实现代码如下:(打开can.c文件)
下面展示一些 内联代码片。
// An highlighted block
u8 CAN1_Mode_Init(u32 tsjw,u32 tbs2,u32 tbs1,u16 brp,u32 mode)
{
//标识符列表模式,仅允许接收为以下ID的帧
u32 ExtId1 =0x1826F456;
u32 ExtId2 =0x1801f456;
u32 ExtId3 =0x1807F456;
u32 ExtId4 =0x1808F456;
CAN_FilterConfTypeDef CAN1_FilerConf;
CAN1_Handler.Instance=CAN1

1万+

被折叠的 条评论
为什么被折叠?



