Can-bus过滤器和屏蔽逻辑

时间:2019-08-28 07:01:39

标签: c can-bus

我想了解下面的代码,为什么要在1xFF地址之间过滤0x100。 掩码值是1110000000000000(16位),过滤器值是10000000000000。这意味着我的ID可能是 100 100000000000(16位), 100 00100000000(16位)等(< strong> 100 ..一侧的所有ID必须是常量。

但是0x100的值是100000000(9位),我怎么可能不明白这是怎么比较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;
}

1 个答案:

答案 0 :(得分:1)

CAN总线具有11位标识符(base frame format)和29位标识符(extended frame format)。

因此,如果FilterIdHigh为16位,并且11位标识符位于寄存器的高位,则需要将标识符左移5位以将其放入寄存器的11个MSB中。这就是为什么代码对<< 5FilterIdHigh都左移(FilterMaskIdHigh)的原因。

0x100值不是9位值,而是11位值001 0000 0000
掩码0x700的值也是11位值111 0000 0000

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