我想了解下面的代码,为什么要在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;
}
答案 0 :(得分:1)
CAN总线具有11位标识符(base frame format)和29位标识符(extended frame format)。
因此,如果FilterIdHigh
为16位,并且11位标识符位于寄存器的高位,则需要将标识符左移5位以将其放入寄存器的11个MSB中。这就是为什么代码对<< 5
和FilterIdHigh
都左移(FilterMaskIdHigh
)的原因。
0x100值不是9位值,而是11位值001 0000 0000
。
掩码0x700的值也是11位值111 0000 0000
。
因此,11位标识符的高3位必须为001,并且任何形式的标识符
001 xxxx xxxx
将通过过滤器。因此,从0x100到0x1ff的标识符将通过过滤器。