Проект

Общее

Профиль

Установить фильтр (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