CAN总线过滤器和屏蔽逻辑

Can-bus Filter and Mask Logic

我想了解下面的代码,为什么在 1xFF 地址之间过滤 0x100。 掩码值为 1110000000000000(16 位),过滤器值为 10000000000000。这意味着我的 ID 可以是 100100000000000(16 位),10000100000000(16 bit) 等等 (100.. side 必须是常量所有 ids。

但是 0x100 值是 100000000(9 位)这怎么可能我不能understand.How它比较 9 位和 16 位 id?

HAL_StatusTypeDef CAN_Filter_Init(CAN_HandleTypeDef *hcanxx)
{
  CAN_FilterTypeDef can_filter_config;
  //100 to 1FF in other words block all messages after 0x0200
  can_filter_config.FilterActivation = CAN_FILTER_ENABLE;
  can_filter_config.FilterBank = 0;
  can_filter_config.FilterIdHigh = 0x100 << 5;
  // can_filter_config.FilterIdHigh = 0x000;

  can_filter_config.FilterIdLow = 0x0000;
  can_filter_config.FilterMode = CAN_FILTERMODE_IDMASK;
  can_filter_config.FilterScale = CAN_FILTERSCALE_32BIT;
  can_filter_config.FilterMaskIdHigh = 0x700 << 5;
  // can_filter_config.FilterMaskIdHigh = 0X000;
  can_filter_config.FilterMaskIdLow = 0x0000;
  can_filter_config.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  can_filter_config.SlaveStartFilterBank = 0;

  if (HAL_CAN_ConfigFilter(hcanxx, &can_filter_config) != HAL_OK)
  {
    Error_Handler();
  }
  return HAL_OK;
}

CAN 总线有 11 位标识符 (base frame format) and 29-bit identifiers (extended frame format)。

所以如果FilterIdHigh是16位,而11位的标识符在寄存器的高位,那么就需要将标识符左移5位,放到寄存器的高11位寄存器。这就是为什么代码对 FilterIdHighFilterMaskIdHigh.

都有左移 (<< 5)

0x100 值不是 9 位值,它是 11 位值 001 0000 0000
掩码 0x700 值也是一个 11 位值 111 0000 0000.

因此,11位标识符的高三位必须为001,任何形式的标识符
001 xxxx xxxx 将通过过滤器。因此,从 0x100 到 0x1ff 的标识符将通过过滤器。