【问题标题】:CAN filter for STM32F446STM32F446 的 CAN 滤波器
【发布时间】:2020-12-29 09:09:42
【问题描述】:

下面是我的一段 CAN 过滤器代码。我希望只接受 ID 为 0x102XXXXXX(十六进制值)的帧,其中 X 可以是任意数字。

  uint32_t filter_id =   0x10200000;
  uint32_t filter_mask = 0x1fffffff;
  sFilterConfig.FilterBank = 14;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//CAN_FILTERMODE_IDLIST;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = ((filter_id << 5)  | (filter_id >> (32 - 5))) & 0xFFFF; // STID[10:0] & EXTID[17:13];
  sFilterConfig.FilterIdLow = (filter_id >> (11 - 3)) & 0xFFF8; // EXID[12:5] & 3 Reserved bits
  sFilterConfig.FilterMaskIdHigh = ((filter_mask << 5)  | (filter_mask >> (32 - 5))) & 0xFFFF;
  sFilterConfig.FilterMaskIdLow = (filter_mask >> (11 - 3)) & 0xFFF8;
  sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.SlaveStartFilterBank = 14;

  if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig) != HAL_OK)
  {
    /* Filter configuration Error */
    Error_Handler();
  }

根据此页面https://schulz-m.github.io/2017/03/23/stm32-can-id-filter/,它应该可以按我的预期工作,即丢弃除以 0x102XXXXX 开头的 ID 之外的其他 ID。
但它也阻止了所需的 ID。请告诉我哪里出错了?

【问题讨论】:

    标签: c can-bus


    【解决方案1】:

    问题还是一样。问题解决了。更新了下面的代码。我只使用 CAN Ext Id。

      uint32_t filter_id =   0x1020;
      uint32_t filter_mask = 0x1ff0;
      sFilterConfig.FilterBank = 14;
      sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
      sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
      sFilterConfig.FilterIdHigh = filter_id << 3;
      sFilterConfig.FilterIdLow = 0;
      sFilterConfig.FilterMaskIdHigh = filter_mask << 3;
      sFilterConfig.FilterMaskIdLow = 0;
      sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO1;
      sFilterConfig.FilterActivation = ENABLE;
      sFilterConfig.SlaveStartFilterBank = 14;
    
      if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig) != HAL_OK)
      {
        /* Filter configuration Error */
        Error_Handler();
      }
    

    此过滤器(仅)接受与 ID 序列 0x102XXXXX 匹配的消息,其中 X 可以是任何数字。

    【讨论】:

    • 你能解释一下为什么它现在有效,而不是以前?
    • OP 中的代码是从网站复制粘贴的。我什至不在乎看看它做了什么。我只是希望它能以某种方式工作。然后我参考了数据表 DM00135183 Pg。 1044 和 1066 并了解如何正确识别 CAN 消息并进行过滤。对于标准 ID (num
    • 能否请您将其添加到您的答案中以使其更有用?如果您喜欢,您可以让它喜欢;你需要参考数据表,你需要...
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2023-04-10
    • 2014-07-29
    • 2014-07-14
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多