0

我正在使用 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;
    }

有什么想法,我的错误可能是什么?谢谢!

4

2 回答 2

0

我发布的代码(编辑版本)现在可以使用。原来我在手动计算地址时遇到了问题。

谢谢@Tagli。

于 2020-02-20T13:33:43.473 回答
0

掩码过滤按位工作。所以你不能创建一个过滤器来接受 0x18FEC100 - 0x18FEC999 之间的值。你需要考虑二进制。

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

ID = 0x18FEC101 和 Mask = 0x1FFFF000 意味着它将接受 0x18FEC000 - 0x18FECFFF 之间的值,因为过滤器不会关心最低有效 12 位。

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

于 2020-02-19T08:15:14.777 回答