OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2055|回复: 4

CAN屏蔽模式设置

[复制链接]

20

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-1-3
在线时间
44 小时
发表于 2019-4-30 17:36:38 | 显示全部楼层 |阅读模式
本帖最后由 fengc234 于 2019-4-30 17:38 编辑

网上有个对CAN的说明,链接https://blog.csdn.net/flydream0/article/details/8148791

内容如下:

下面给出一个代码例子,假设我们要接收多个ID:0x7e9,0x1800f001,前面为标准ID,后面为扩展ID,要同时能接收这两个ID,那么该如何设置这个过滤器呢?

CAN_FilterInitTypeDef  CAN_FilterInitStructure;U16 std_id =0x7e9;
U32 ext_id =0x1800f001;
U32 mask =0;
CAN_FilterInit(&CAN_FilterInitStructure);   
//初始化CAN_FilterInitStructrue结构体变量CAN_FilterInitStructure.CAN_FilterNumber=0;     
//设置过滤器组0,范围为0~13CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;   
//设置过滤器组0为屏蔽模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;   
//设置过滤器组0位宽为32位 //标识位寄存器的设置
//ext_id<<3对齐,见上图9,再>>16取高16位CAN_FilterInitStructure.CAN_FilterIdHigh=((ext_id<<3) >>16) &0xffff;  
//设置标识符寄存器高字节。CAN_FilterInitStructure.CAN_FilterIdLow=(U16)(ext_id<<3) | CAN_ID_EXT;   
//设置标识符寄存器低字节//这里也可以这样设置//CAN_FilterInitStructure.CAN_FilterIdHigh=std_id<<5;  
//设置标识符寄存器高字节.这里为什么是左移5位呢?从上图可以看出,CAN_FilterIdHigh包含的是STD[0~10]和EXID[13~17],标准CAN ID本身是不包含扩展ID数据,因此为了要将标准CAN ID放入此寄存器,标准CAN ID首先应左移5位后才能对齐.
//CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_EXT;   
//设置标识符寄存器低字节,这里也可以设置为CAN_ID_STD
//屏蔽寄存器的设置//这里的思路是先将标准CAN ID和扩展CAN ID对应的ID值先异或后取反,为什么?异或是为了找出两个CAN ID有哪些位是相同的,是相同的位则说明需要关心,需要关心的位对应的屏蔽码位应该设置为1,因此需要取反一下。最后再整体左移3位。mask =(std_id<<18);//这里为什么左移18位?因为从ISO11898中可以看出,标准CAN ID占ID18~ID28,为了与CAN_FilterIdHigh对齐,应左移2位,接着为了与扩展CAN对应,还应该再左移16位,因此,总共应左移2+16=18位。也可以用另一个方式来理解:直接看Mapping的内容,发现STDID相对EXID[0]偏移了18位,因此左移18位.
mask ^=ext_id;  //将对齐后的标准CAN与扩展CAN异或后取反
mask =~mask;mask <<=3;  //再整体左移3位
mask |=0x02; //只接收数据帧,不接收远程帧
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=(mask>>16)&0xffff; //设置屏蔽寄存器高字节
CAN_FilterInitStructure.CAN_FilterMaskIdLow=mask&0xffff;   //设置屏蔽寄存器低字节
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;  //此过滤器组关联到接收
FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活此过滤器组
请问大家,标识位寄存器的设置已经对扩展帧进行了屏蔽设置,我想在屏蔽寄存器的设置中只要对标准帧进行设置,为何要将标准帧和扩展帧进行异或呢?标准帧左移18位后,0-17不重叠,但18-29位和扩展帧重叠的。请问有没有好的解释,谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-30 19:57:03 | 显示全部楼层
就两个id最好最简单的是用两个过滤器,都指定通过相应id就可以了   
要是非用一个过滤器过滤这俩,也就是例子的做法

屏蔽位为1则关心标识位,标准CAN与扩展CAN异或后取反的结果就是相同取1,不同取0,也就是正好相同的位让过滤器位1 不同的位不关心,两个id 都能进来
这样的缺点是能进来的id 个数应该是疑惑取反后0 位的2^次方个id,也包含你的那俩id


建议用一个fifo挂两个过滤器组吧,简单省事
回复 支持 反对

使用道具 举报

20

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-1-3
在线时间
44 小时
 楼主| 发表于 2019-5-1 06:04:09 | 显示全部楼层
我觉得这个例子把需要接收的ID范围扩大了,如果用两个过滤器组就好很多
回复 支持 反对

使用道具 举报

20

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-1-3
在线时间
44 小时
 楼主| 发表于 2019-5-1 22:05:15 | 显示全部楼层
标准CAN与扩展CAN有一部分是数据位是重叠的,我只是觉得这种方法选择的过滤区间是有限的,只能过滤一部分,起的作用是有限的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-8-1
在线时间
15 小时
发表于 2019-8-10 16:51:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 02:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表