Установить фильтр (COMMAND_FILTER_SET 0x21)¶
В зависимости от типа устройства реализуются разные механизмы по настройке фильтров.
Для устройств группы CH-105/CH-407 (2 CAN + 1 LIN) доступно: CAN – 14 фильтров (11/29 бит); LIN – 8 фильтров (8 бит).
Для устройств группы CH-105/CH-407 (CAN + LIN) доступно: CAN – 28 фильтров (11/29 бит); LIN – 8 фильтров (8 бит).
Для устройств группы CH-4FD (2 CAN + 1 LIN) доступно: CAN – 28 фильтров 11 бит + 8 фильтров 29 бит; LIN – 8 фильтров (8 бит).
Для установки фильтра используется структура:
enum FLAG_FILTER_TYPE {
FLAG_FILTER_TYPE_29BIT = 0x01
};
typedef struct {
uint32_t number;
uint32_t type;
uint32_t id;
uint32_t mask;
} __attribute__((packed)) FilterStruct;
typedef struct {
CommandHeader header;
FilterStruct filter;
} __attribute__((packed)) FilterSet;
Здесь в поле filter.number передаётся порядковый номер фильтра для канала. Нумерация идёт от 0. Канал задаётся в поле header.flag. В поле filter.type задаётся тип фильтра.
Запрос
Поле | Значение |
header.command | 0x21 |
header.sequence | порядковый номер запроса |
header.flags | FLAG_CHANNEL_x |
header.dSize | 0x10 |
filter.number | порядковый номер фильтра для канала |
filter.type | тип фильтра из FLAG_FILTER_TYPE |
filter.id | идентификатор, по которому идёт фильтрация |
filter.mask | маска для отбрасывания битов, не участвующих в фильтрации |
Ответ
Если запрос успешно обработан и номер фильтра задан из допустимого диапазона значений.
Поле | Значение |
command | 0xA1 |
sequence | порядковый номер запроса |
flags | 0x00 |
dSize | 0x00 |
Если запрос не обработан.
Поле | Значение |
command | 0xFF |
sequence | порядковый номер запроса |
flags | 0x00 |
dSize | 0x00 |
Пример
Настройка фильтра 2 для второго канала для сообщения 11 бит для фильтрации сообщений с номерами 0x01* (0x010/0x7F0).
⇒ 21 xx 40 10 01 00 00 00 00 00 00 00 10 00 00 00 F0 07 00 00
⇐ A1 xx 00 00
Настройка канала 2 с заданием неверного индекса фильтра.
⇒ 21 xx 40 10 33 00 00 00 00 00 00 00 10 00 00 00 F0 07 00 00
⇐ FF xx 00 00