stm32 can通信滤波设置问题,can2接收不到数据;

       本人用的主控是是stm32f405芯片,这款芯片的滤波器CAN1、2是共用的,所以设置的时候要注意两个总线都使用哪类通信方式;

     本人用的can1使用标准帧、数据帧,执行canopen标准通信方式,所以ID种类很少,所以就用了列表模式;只可以接收id=0x00000601 0x00000602 0x00000603 0x00000604 的数据;

    //设置成列表滤波
  sFilterConfig1.FilterBank = 0;
  sFilterConfig1.FilterMode = CAN_FILTERMODE_IDLIST;
  sFilterConfig1.FilterScale = CAN_FILTERSCALE_16BIT;

    sFilterConfig1.FilterIdHigh     =  0x00000601<<5;         //设置过滤器ID高16位
    sFilterConfig1.FilterIdLow      =  0x00000602<<5;         //设置过滤器ID低16位
    sFilterConfig1.FilterMaskIdHigh =  0x00000603<<5;         //设置过滤器掩码高16位
    sFilterConfig1.FilterMaskIdLow  =  0x00000604<<5;         //设置过滤器掩码低16位
    
  sFilterConfig1.FilterFIFOAssignment = CAN_RX_FIFO0;
  sFilterConfig1.FilterActivation = ENABLE;
  sFilterConfig1.SlaveStartFilterBank = 0;

    can2通信采用扩展帧、数据帧,接一个控制一个标准模块,它有一个ID=1;因为他们共用滤波器,所以又设置了一个过滤扩展帧的滤波,使其can2能够接收扩展帧;

         slave_id = 0x00000001;    
         //设置成只接受扩展帧slave_id
        sFilterConfig2.FilterBank = 15;
        sFilterConfig2.FilterMode = CAN_FILTERMODE_IDMASK;
        sFilterConfig2.FilterScale = CAN_FILTERSCALE_32BIT;
        sFilterConfig2.FilterIdHigh   =(((u32)slave_id<<3)&0xFFFF0000)>>16;
        sFilterConfig2.FilterIdLow  = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;
        sFilterConfig2.FilterMaskIdHigh  = 0x0000;//
        sFilterConfig2.FilterMaskIdLow   = 0x00FF;//只保证slave_id低8位一致就可以
        sFilterConfig2.FilterFIFOAssignment = CAN_RX_FIFO0;
        sFilterConfig2.FilterActivation = ENABLE;
        sFilterConfig2.SlaveStartFilterBank = 0;    

注意事项:

     1、FilterMaskIdLow= 0x00FF;为了过滤标准模块的ID;若不对id滤波的话,CAN1的标准帧就会通过该滤波接收到,所以,必须要对ID滤波;

      2、sFilterConfig2.FilterBank序号要不同;

     3、第二个滤波器就是根据5、对扩展帧进行过滤:(扩展帧不会被过滤掉),改过来的;

  u32 slave_id = 0x01 ;

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<3)&0xFFFF0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;

      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;

该设置的意思是ID必须是0x00000001,才能接收到数据;

  u32 slave_id = 0x01 ;

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<3)&0xFFFF0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;

      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0x0000;

      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0x00FF;

该设置的意思是ID最低字节必须是01,前面的不关心是多少;如果想接收其他的板id,再增加滤波器设置;

其他博主的设置,也分享一下:

三、滤波器的详细设置

u32 slave_id = 0x01 ;

1、对扩展数据帧进行过滤:(只接收扩展数据帧)

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<3)&0xFFFF0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLo=(((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

(注:标准帧数据帧、标准远程帧和扩展远程帧均被过滤)

2、对扩展远程帧过滤:(只接收扩展远程帧)

     CAN_FilterInitStructure.CAN_FilterIdHigh   = (((u32)slave_id<<3)&0xFFFF0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<3)|CAN_ID_EXT|CAN_RTR_REMOTE)&0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

3、对标准远程帧过滤:(只接收标准远程帧)

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<21)&0xffff0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_REMOTE)&0xffff;

      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

4、对标准数据帧过滤:(只接收标准数据帧)

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<21)&0xffff0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<21)|CAN_ID_STD|CAN_RTR_DATA)&0xffff;

     CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFF;

5、对扩展帧进行过滤:(扩展帧不会被过滤掉)

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<3)&0xFFFF0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<3)|CAN_ID_EXT)&0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

      CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;

6、对标准帧进行过滤:(标准帧不会被过滤掉)

     CAN_FilterInitStructure.CAN_FilterIdHigh   =(((u32)slave_id<<21)&0xffff0000)>>16;

     CAN_FilterInitStructure.CAN_FilterIdLow  = (((u32)slave_id<<21)|CAN_ID_STD)&0xffff;

      CAN_FilterInitStructure.CAN_FilterMaskIdHigh  = 0xFFFF;

     CAN_FilterInitStructure.CAN_FilterMaskIdLow   = 0xFFFC;

注:slave_id为要过滤的id号。

    

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小强工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值