Как настроить мой CAN-фильтр в режиме списка?

Я написал некоторый код для передачи / получения сообщений CAN, и у меня возникли некоторые проблемы с моим фильтром. Во-первых, я хочу сказать, что я понимаю режим маски и смог заставить его работать со следующей конфигурацией:

uint16_t id = 0x12; // 0001 0010
uint16_t mask = 0xFC; // 1111 1100

sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale=CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh=id<<5;
sFilterConfig.FilterIdLow=0;
sFilterConfig.FilterMaskIdHigh=mask<<5;
sFilterConfig.FilterMaskIdLow=0;
sFilterConfig.FilterFIFOAssignment=0;
sFilterConfig.FilterActivation=ENABLE;

HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);

Это принимает сообщения с идентификатором 0x1X, где X - от 0 до 3. Я не совсем понимаю назначение последних 2 битов идентификатора, так как они не имеют отношения к маске, верно ли мое мышление? Во всяком случае, это не главная проблема.

Теперь, прочитав RM0090, я пытаюсь создать фильтр, который будет принимать сообщения с идентификатором от 0x120 до 0x1FA с кодом ниже:

uint16_t id = 0x120; // 0001 0010 0000
uint16_t mask = 0x1FA; // 0001 1111 1010

sFilterConfig.FilterBank=0;
sFilterConfig.FilterMode=CAN_FILTERMODE_IDLIST;
sFilterConfig.FilterScale=CAN_FILTERSCALE_16BIT;
sFilterConfig.FilterIdHigh=mask<<5;
sFilterConfig.FilterIdLow=id<<5;
sFilterConfig.FilterMaskIdHigh=0;//mask<<5;
sFilterConfig.FilterMaskIdLow=0;
sFilterConfig.FilterFIFOAssignment=0;
sFilterConfig.FilterActivation=ENABLE;

HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);

Он не работает должным образом, кажется, он принимает только идентификаторы 0x120 и 0x00, мое понимание режима списка неверно или моя реализация фильтра? или оба?

РЕДАКТИРОВАТЬ:

Мое понимание режима "Маска / Список" было неверным. Я понимаю, как использовать маски, но я подумал, что режим списка можно использовать для создания диапазона допустимых идентификаторов, но кажется, что вы можете использовать режим списка только для захвата пары определенных идентификаторов. Я нашел эту страницу довольно полезной.

На странице, на которую я ссылался выше, написано, что вы можете получить диапазоны только в форме 2^N - (2^(N-1) - 1).

Теперь мой вопрос: в чем смысл маскировки низкого / высокого и filterID низкого / высокого? Сначала я подумал, что, может быть, это младшие / старшие 16 битов 32-битного регистра, но каждая переменная младшего / старшего разрядов уже uint32, так что эта идея не имела для меня смысла. Любая ясность будет оценена.

Ура!

1 ответ

Я предполагаю, что вы смешиваете фильтр и маску: маска фильтра используется, чтобы определить, какие биты в идентификаторе полученного кадра сравниваются с фильтром

Если бит маски установлен на ноль, соответствующий бит идентификатора будет автоматически принят, независимо от значения бита фильтра.

Если бит маски установлен в единицу, соответствующий бит идентификатора будет сравниваться со значением бита фильтра; если они совпадают, это принимается, иначе кадр отклоняется.

Другие вопросы по тегам