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位寄存器。这就是为什么代码对 FilterIdHigh
和 FilterMaskIdHigh
.
都有左移 (<< 5
)
0x100 值不是 9 位值,它是 11 位值 001 0000 0000
。
掩码 0x700 值也是一个 11 位值 111 0000 0000
.
因此,11位标识符的高三位必须为001,任何形式的标识符
001 xxxx xxxx
将通过过滤器。因此,从 0x100 到 0x1ff 的标识符将通过过滤器。
我想了解下面的代码,为什么在 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位寄存器。这就是为什么代码对 FilterIdHigh
和 FilterMaskIdHigh
.
<< 5
)
0x100 值不是 9 位值,它是 11 位值 001 0000 0000
。
掩码 0x700 值也是一个 11 位值 111 0000 0000
.
因此,11位标识符的高三位必须为001,任何形式的标识符
001 xxxx xxxx
将通过过滤器。因此,从 0x100 到 0x1ff 的标识符将通过过滤器。