Фильтр приёма CAN (acceptance filter)
В шине CAN каждый узел слышит все кадры, а нужна ему обычно малая их часть. Чтобы процессор не разбирал каждое сообщение, контроллер CAN отбрасывает лишнее аппаратно — фильтрами приёма по идентификатору.
Обновлено Редакция GAW
Фильтр приёма CAN (acceptance filter) — аппаратный блок контроллера CAN, который по идентификатору кадра решает, нужен ли кадр этому узлу. В CAN идентификатор описывает содержание сообщения, а не адрес получателя, поэтому каждый кадр слышат все узлы; фильтр пропускает в приёмный буфер только нужные и отбрасывает остальные без участия процессора (RM0090, разд. 32.7.4). Обычно фильтры работают в двух режимах: маска (группа идентификаторов) и список (точные идентификаторы).
Фильтры bxCAN в STM32F4
- 28 банков (0–27), общих для CAN1 и CAN2; граница задаётся полем CAN2SB.
- Масштаб. Банк — это либо один 32-битный фильтр по STDID[10:0], EXTID[17:0], IDE и RTR, либо два 16-битных по STDID, RTR, IDE и EXTID[17:15]; выбор — бит FSCx в CAN_FS1R.
- Режим. Бит FBMx в CAN_FM1R: маска (регистр идентификатора плюс регистр маски) или список (два идентификатора).
- FIFO. Каждый фильтр направляет кадры в FIFO 0 или FIFO 1 (CAN_FFA1R); у каждого FIFO три места. Если FIFO полон, новый кадр либо перезаписывает последний, либо отбрасывается — по биту RFLM.
- Индекс FMI. Номер сработавшего фильтра хранится вместе с сообщением, и программа может разобрать кадр по нему, не сравнивая идентификатор.
Банк настраивают, когда он выключен (бит FACT в CAN_FA1R сброшен); неиспользуемые банки RM0090 советует оставлять выключенными. Если кадр проходит через несколько фильтров, побеждает 32-битный над 16-битным, список над маской, а при равенстве — меньший номер.
Пример маски
Нужно принимать стандартные кадры с ID от 0x100 до 0x10F. Наш расчёт: эталон 0x100, маска 0x7F0 по полю STDID — старшие 7 бит должны совпасть, младшие 4 не проверяются. В регистрах bxCAN поле STDID сдвинуто на 21 бит в 32-битном режиме, поэтому значения пишут со сдвигом; раскладку битов кадра показывает калькулятор кадра CAN.
У других контроллеров
Фильтры есть почти у любого контроллера CAN, но устроены по-разному: у TWAI в ESP32 один фильтр приёма с одинарным и двойным режимом (ESP32 TRM, разд. 25.2). Протокол, приоритет по идентификатору и арбитраж — в статье «Шина CAN».
Частые вопросы
Как принять все кадры на bxCAN?
Включить хотя бы один фильтр, который пропускает всё. По RM0090 в память попадают только кадры, прошедшие фильтр, поэтому без активного фильтра приёма не будет (наш вывод). Обычный способ — банк в режиме 32-битной маски с маской из нулей: все биты идентификатора помечены как «не важно», и проходит всё. Фильтр привязывают к FIFO 0 или 1 и активируют битом в CAN_FA1R. Сам режим маски описан в RM0090, разд. 32.7.4.
Чем режим маски отличается от режима списка?
В режиме маски один регистр задаёт эталонный идентификатор, второй — маску: биты с единицей в маске должны совпасть, биты с нулём не проверяются. Так пропускают группу идентификаторов. В режиме списка оба регистра — идентификаторы, и проходят только кадры с ровно такими ID; число отдельных идентификаторов на банк удваивается (RM0090, разд. 32.7.4).
Как делятся фильтры между CAN1 и CAN2?
У STM32F4 все 28 банков общие. Поле CAN2SB в CAN_FMR задаёт номер первого банка CAN2: банки ниже него достаются CAN1, начиная с него — CAN2. При CAN2SB = 28 все банки у CAN1, при 0 — ни одного (RM0090, разд. 32.9.4).
Источники
- STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 32.2 — CAN 2.0 A/B, до 1 Мбит/с, три почтовых ящика передачи, два приёмных FIFO по три сообщения, 28 банков фильтров на CAN1 и CAN2; 32.7.4 — идентификатор относится к содержанию, а не к узлу; 28 масштабируемых банков, в каждом два 32-битных регистра CAN_FxR1 и CAN_FxR2; рис. 342 — в 32-битном режиме STID[10:0] занимает биты 31:21; один 32-битный фильтр (STDID, EXTID, IDE, RTR) или два 16-битных; режим маски и режим списка; настройка при сброшенном FACT; неиспользуемые фильтры оставлять выключенными; индекс совпавшего фильтра (FMI) хранится с сообщением; приоритет: 32-бит над 16-бит, список над маской, меньший номер; FIFO с блокировкой RFLM и без неё; 32.9.4 — CAN2SB задаёт первый банк CAN2; CAN_FFA1R — выбор FIFO для фильтра
- Espressif. ESP32 Technical Reference Manual, Version 5.8 — разд. 25.2 — у контроллера TWAI ESP32 фильтр приёма с одинарным и двойным режимом, приёмный FIFO 64 байта
Нашли ошибку?
Смотрите также
- CANCAN_H и CAN_L, терминаторы, кадр, арбитраж, ошибки, тайминг, MCP2515
- Конструктор кадра CANCAN и CAN FD по битам: CRC-15, CRC-17 и CRC-21, битстаффинг, длина кадра
- Битовый тайминг CANCAN_BTR для STM32, CNF1–CNF3 для MCP2515, точка выборки
- Арбитраж шиныДоминантный бит побеждает: CAN и I2C
- TWAI (CAN в ESP32)Встроенный контроллер CAN 2.0 у ESP32 под названием Espressif
- MCP2515CAN по SPI: выводы, кварц и скорость, маски и фильтры, режимы