Как настроить мой CAN-фильтр в режиме списка? - PullRequest
0 голосов
/ 27 сентября 2018

Я написал некоторый код для передачи / получения сообщений 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. Я ненеужели я не понимаю цели двух последних битов идентификатора, поскольку они не имеют отношения к маске, верно ли мое мышление?Во всяком случае, это не главная проблема.

Теперь, прочитав 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);

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

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

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

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

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

Ура!

1 Ответ

0 голосов
/ 28 сентября 2018

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

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

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

...