Лень конкретно вникать, но предположу, что вопрос в правильной
инициализации фильтров и масок. У STM32 там вроде черезжопное
распределение фильтровых и масочных битов по регистрам, вроде для
какой-то совместимости. Мой вариант: void CAN_Filter_Cfg(uint32_t bank, uint32_t id, uint32_t mask) {
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterBank = bank;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = (uint16_t)(id >> 13);
sFilterConfig.FilterIdLow = (uint16_t)(id << 3) | CAN_ID_EXT;
sFilterConfig.FilterMaskIdHigh = (uint16_t)(mask >> 13);
sFilterConfig.FilterMaskIdLow = (uint16_t)(mask << 3) | CAN_ID_EXT;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.SlaveStartFilterBank = 14;
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
{
/* Filter configuration Error */
}
}
Использование - что-то вроде
CAN_Filter_Cfg(0, 0x1FFFFFFF, 0x00000000); //принимаем все возможные CAN ID
или
CAN_Filter_Cfg(0, 0x00000010, 0x1FFFFFF0); //