STM32F446 CAN 滤波器

时间:2020-12-29 09:09:42

标签: c can-bus

以下是我的 CAN 过滤器代码。我希望只接受 ID 为 0x102XXXXX(十六进制值)的帧,其中 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。请告诉我哪里出错了?

1 个答案:

答案 0 :(得分:0)

问题还是一样。问题解决了。更新了下面的代码。我只使用 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 可以是任意数字。

相关问题