打印
[STM32F1]

CAN协议过滤器设置~~请大神指导下

[复制链接]
1717|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yang5223536|  楼主 | 2015-11-27 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    CAN_FilterInitStructure.CAN_FilterNumber = 1;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit;

        CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)0x07AF<<21)&0xffff0000)>>16;
        CAN_FilterInitStructure.CAN_FilterIdLow   =(((u32)0x07A0<<21)&0xffff0000)>>16;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFA0;

    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

    CAN_FilterInit( &CAN_FilterInitStructure );

我想过滤的ID为 07A0~07AF这一组数据,但是FilterIdHigh、FilterIdLow、FilterMaskIdHigh、FilterMaskIdLow这4个值,应该怎样设置~~~~!!!! 谢谢各位前辈、大神~!!
沙发
ouyangyitao| | 2015-11-27 15:43 | 只看该作者
  CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)0x07AF<<3)&0xffff0000)>>16;
  CAN_FilterInitStructure.CAN_FilterIdLow   =(((u32)0x07AF<<3)&0xffff0000);
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((u32)0x07A0<<3)&0xffff0000)>>16;;
CAN_FilterInitStructure.CAN_FilterMaskIdLow =(((u32)0x07A0<<3)&0xffff0000);
这个是29位ID的设置方法

使用特权

评论回复
板凳
yang5223536|  楼主 | 2015-11-27 16:11 | 只看该作者
ouyangyitao 发表于 2015-11-27 15:43
CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)0x07AF16;
  CAN_FilterInitStructure.CAN_Filter ...

谢谢您的回复~!
是这样的,我自设置滤波ID 为 07A0~07AF、07B0~07BF、07C0~07CF、07D0~07DF这几组,目前要提取出 07A0~07AF这一组~
使用您的方法,这四组都能提取,没有区分出 07A0~07AF这一组。。。

使用特权

评论回复
地板
ouyangyitao| | 2015-11-27 16:56 | 只看该作者
yang5223536 发表于 2015-11-27 16:11
谢谢您的回复~!
是这样的,我自设置滤波ID 为 07A0~07AF、07B0~07BF、07C0~07CF、07D0~07DF这几组,目前 ...

过滤器要改成32位的就可以使用这个设置
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
具体看你设计需求,要11位ID还是29位ID

使用特权

评论回复
5
ouyangyitao| | 2015-11-27 17:02 | 只看该作者
yang5223536 发表于 2015-11-27 16:11
谢谢您的回复~!
是这样的,我自设置滤波ID 为 07A0~07AF、07B0~07BF、07C0~07CF、07D0~07DF这几组,目前 ...

CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((u32)0x07A0<<3)&0xffff0000)>>16;;
CAN_FilterInitStructure.CAN_FilterMaskIdLow =(((u32)0x07A0<<3)&0xffff0000);
要改为
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((u32)0xfff0<<3)&0xffff0000)>>16;;
CAN_FilterInitStructure.CAN_FilterMaskIdLow =(((u32)0xfff0<<3)&0xffff0000);
不好意思,没注意看

使用特权

评论回复
6
yang5223536|  楼主 | 2015-11-27 17:53 | 只看该作者
ouyangyitao 发表于 2015-11-27 17:02
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((u32)0x07A016;;
CAN_FilterInitStructure.CAN_Filte ...

    CAN_FilterInitStructure.CAN_FilterNumber = 1;
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

        CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)0x07AF<<3)&0xffff0000)>>16;
        CAN_FilterInitStructure.CAN_FilterIdLow   =(((u32)0x07AF<<3)&0xffff0000);
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (((u32)0xfff0<<3)&0xffff0000)>>16;;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow =(((u32)0xfff0<<3)&0xffff0000);

    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    CAN_FilterInit( &CAN_FilterInitStructure );

我这样使用,也是不行的。。。都是滤全部啊~~ 欲哭无泪的感觉~~!
不过还是谢谢您了~

使用特权

评论回复
7
yang5223536|  楼主 | 2015-11-29 09:36 | 只看该作者
有木有,大神指导一下啊!怎样选择性的过滤一组数据啊?

使用特权

评论回复
8
yang5223536|  楼主 | 2015-11-29 13:10 | 只看该作者
已解决!谢谢 ouyangyitao,给了借鉴和提示!

使用特权

评论回复
9
tcc8073| | 2015-12-1 15:12 | 只看该作者
本帖最后由 tcc8073 于 2015-12-1 15:21 编辑

我在配置CAN的过滤寄存器的时候也有点模糊,按照过滤寄存器件存数据定义,0-2bit是用来存RTR和IDE的(0位预留,定义为0),3-13位是存储标准ID的11位,14-31位是用来存储18位的扩展ID;那我如果要输出02 03 04 05(02为高位字节)四个字节的ID,这四个字节的怎么和寄存器联系起来,是把这02 03 04 05做一个完整的32位ID,还是要把这四个字节按照规范组合下,怎么组,难道直接把0X02030405送到滤波寄存器,有没有比较统一的做法,我目前的做法是把0X02030405的低0-10位做为标准ID,29-31位高3位去除,11-28位做为扩展ID,再把做过处理的舒服放到滤波器对应位置,IDE和RTR按照条件置位。

使用特权

评论回复
10
asian21| | 2016-7-21 22:08 | 只看该作者
最后一位好像有点问题,3-20共18位为扩展ID,21到31是标准ID

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

0

粉丝