Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Filter 标准外设库中的STM8A CAN滤波_Filter_Can Bus_Stm8 - Fatal编程技术网

Filter 标准外设库中的STM8A CAN滤波

Filter 标准外设库中的STM8A CAN滤波,filter,can-bus,stm8,Filter,Can Bus,Stm8,我正在使用STM8AF5286UDY,并尝试设置CAN接口。 对于编程,我使用标准外设库。目前,我的CAN接口工作正常。唯一不起作用的是过滤 我使用扩展ID并希望获取从0x18FEC100到0x18FEC999的所有ID。 我的代码如下所示: /* CAN filter init */ CAN_FilterNumber = CAN_FilterNumber_0; CAN_FilterActivation = ENABLE; CAN_FilterMode = CAN_FilterMod

我正在使用STM8AF5286UDY,并尝试设置CAN接口。 对于编程,我使用标准外设库。目前,我的CAN接口工作正常。唯一不起作用的是过滤

我使用扩展ID并希望获取从0x18FEC100到0x18FEC999的所有ID。 我的代码如下所示:

/* CAN filter init */

 CAN_FilterNumber = CAN_FilterNumber_0;

 CAN_FilterActivation = ENABLE;

 CAN_FilterMode = CAN_FilterMode_IdMask;

 CAN_FilterScale = CAN_FilterScale_32Bit;

 CAN_FilterID1=0x18FEC101;

 CAN_FilterID2=0;

 CAN_FilterID3=0;

 CAN_FilterID4=0;

 CAN_FilterIDMask1=0x1FFFF000;

 CAN_FilterIDMask2=0;

 CAN_FilterIDMask3=0;

 CAN_FilterIDMask4=0;  

 CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, 
         CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,
         CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2, 
         CAN_FilterIDMask3, CAN_FilterIDMask4);
我将感谢任何帮助!谢谢大家!

编辑:在我的初始代码中,我忘记在寻址时包含IDE和RTR。此外,在库中,每个地址和掩码都是8位值。因此,我已将代码更改为以下内容:

/* CAN filter init */
  CAN_FilterNumber = CAN_FilterNumber_2;
  CAN_FilterActivation = ENABLE;
  CAN_FilterMode = CAN_FilterMode_IdMask; 
  CAN_FilterScale = CAN_FilterScale_32Bit; 
  CAN_FilterID1=0xc7;  
  CAN_FilterID2=0xed;
  CAN_FilterID3=0x02;
  CAN_FilterID4=0x02;
  CAN_FilterIDMask1=0xFF; 
  CAN_FilterIDMask2=0xE7; 
  CAN_FilterIDMask3=0xE0;
  CAN_FilterIDMask4=0x00; 
  CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode, 
                 CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,
                 CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2, 
                 CAN_FilterIDMask3, CAN_FilterIDMask4);
此过滤器适用于前16位,因此在使用0x18FEC101时,它会过滤0x18FE。不知何故,它不适用于其他16位

在库中,以下代码用于以32位写入过滤器组中的地址和掩码:

else if (CAN_FilterScale == CAN_FilterScale_32Bit)
    {
      CAN->Page.Filter.FR01 = CAN_FilterID1;
      CAN->Page.Filter.FR02 = CAN_FilterID2;
      CAN->Page.Filter.FR03 = CAN_FilterID3;
      CAN->Page.Filter.FR04 = CAN_FilterID4;
      CAN->Page.Filter.FR05 = CAN_FilterIDMask1;
      CAN->Page.Filter.FR06 = CAN_FilterIDMask2;
      CAN->Page.Filter.FR07 = CAN_FilterIDMask3;
      CAN->Page.Filter.FR08 = CAN_FilterIDMask4;
    }
有什么想法吗?我可能犯了什么错误?
谢谢

掩码过滤按位工作。因此,无法创建筛选器以接受0x18FEC100-0x18FEC999之间的值。你需要考虑二进制

在过滤器掩码寄存器中,1表示“必须匹配”,0表示“不在乎”

ID=0x18FEC101和Mask=0x1FFF000表示它将接受0x18FEC000-0x18FECFFF之间的值,因为过滤器不关心最低有效12位

然而,由于硬件寄存器的位排列,该过程更加复杂。请注意,RTR和IDE位也包含在过滤器寄存器中。我不知道标准外设库是否能处理这个问题,但可能不能。您可能需要手动排列位以确定正确的寄存器值。在参考手册(RM0016)中,参考图148

我发布的代码(编辑版)现在可以使用了。 结果发现我手工计算地址有问题


谢谢@Tagli。

谢谢您的回复!我完全忘记了RTR&IDE的部分。我更改了代码,它至少比以前工作得更好。我可以过滤地址的前16位,最多为0x18FE,但不知何故,我的消息无法通过,如果我添加下一个4位,那么过滤器中的“C”。。。你知道会发生什么吗?当前的代码看起来是这样的(尽管没有参考手册发布它可能没用):CAN\u FilterNumber=CAN\u FilterNumber\u 2;CAN_过滤器激活=启用;CAN\u FilterMode=CAN\u FilterMode\u IdMask;CAN_FilterScale=CAN_FilterScale_32位;CAN_FilterID1=0xc7;CAN_FilterID2=0xed;CAN_FilterID3=0x02;CAN_FilterID4=0x02;CAN_FilterIDMask1=0xFF;CAN_FilterIDMask2=0xE7;CAN_FilterIDMask3=0xE0;CAN_FilterIDMask4=0x00;我猜库变量与硬件寄存器名称不匹配。在32位模式下,每个过滤器只能有一个ID和一个掩码,这是32位变量。仅使用代码32 > CuyFieldID1<代码> >代码> ChanyFieldIsMask1具有位变量,但也考虑RTR和IDE位的位置。另外,也要查看图书馆手册。如果我没弄错的话,它们应该是匹配的。在使用32位的情况下,程序将每个ID或掩码写入相应的库中。else if(CAN_FilterScale==CAN_FilterScale_32位){CAN->Page.Filter.FR01=CAN\U FilterID1;CAN->Page.Filter.FR02=CAN\U FilterID2;CAN->Page.Filter.FR03=CAN\U FilterID3;CAN->Page.Filter.FR04=CAN\U FilterID4;CAN->Page.FilterIDMask1;CAN->Page.Filter.FR06=CAN\U FilterIDMask2;CAN->Page.Filter.FR07=CAN\U FilterIDMask3;CAN->Page.FilterIDMask3er.FR08=CAN_FilterIDMask4;}