Проект

Общее

Профиль

Протокол (Версия 10 — outdated/устаревший) => Протокол (Версия 20) => Протокол (Версия 22)

Поля размерность uint16_t и uint32_t передаются в формате Motorola (big-endian)!

Протокол взаимодействия приложения и устройств CAN-Hacker происходит по бинарному протоколу. Каждое пересылаемое сообщение начинается с заголовка:

typedef struct {
    uint8_t command;
    uint8_t sequence;
    uint8_t flags;
    uint8_t dSize;
} __attribute__((packed)) CommandHeader;

Однако для сообщений, используемых для работы с шинами данных используется заголовок немного другого вида:
typedef struct {
    uint8_t command;
    uint8_t sequence;
    uint16_t flags;
    uint16_t dSize;
} __attribute__((packed)) MsgCommandHeader;

В поле command отсылается команда для устройства. Диапазон команд от 0x01 до 0x7F.
Если устройство отвечает подтверждением выполнения команды, то в поле command выставляется старший бит для присланной команды. В поле sequence помещается порядковый номер запроса, поля flags и dSize сброшены в 0x00.
Если результатом выполнения команды является некий ответ, то в поле command будет выставлен номер команды из запроса. В поле sequence помещается порядковый номер запроса, поля flags и dSize будут заполнены исходя из формата ответа.
Исходя из ранее сказанного, поле sequence можно использовать для контроля обрабатываемых команд. Так же следует учесть, что для нумерации сообщений используется 2 счётчика сообщений. Первый используется для обработки команд от приложения к устройству, второй для контроля сообщений от устройства к приложению (например, сообщения с данными шины или с её состоянием, команды COMMAND_MESSAGE (0x40) и COMMAND_BUS_ERROR (0x41)).
Флаги в поле flags выставляются в зависимости от посылаемой команды.
В случае, если команда не поддерживается, то устройство присылает ответ, где в качестве команды будет значение 0xFF, в поле sequence порядковый номер запроса, а поля flags и dSize сброшены в 0x00.

Поддерживаемые команды

Синхронизация (COMMAND_SYNC 0xA5)

Информация об устройстве и управление

Нормально взаимодействие с устройством можно после отправки команды синхронизации (COMMAND_SYNC 0xA5) устройства.

Запрос идентификатора устройства (COMMAND_DEVICE_HARDWARE 0x05)
Запрос кода устройства (COMMAND_DEVICE_INFO 0x01)
Запрос внутренней версии ПО устройства (COMMAND_DEVICE_FIRMWARE 0x02)
Запрос серийного номера устройства (COMMAND_DEVICE_SERIAL 0x03)

Установка режима работы устройства (COMMAND_DEVICE_MODE 0x04)

Начать работу с устройством (COMMAND_DEVICE_OPEN 0x08)
Завершить работу с устройством (COMMAND_DEVICE_CLOSE 0x09)

Управление каналами

Работать с каналами взаимодействия с шиной можно после отправки устройства команды начала работы (COMMAND_DEVICE_OPEN 0x08).
Нумерация каналов зависит от выбранного режима работы устройства.
Номер канала задаётся в поле flags заголовка отправляемой команды. Поддерживается работа до 7 каналов.

enum FLAG_CHANNELS {
    FLAG_CHANNEL_1 = 0x20,
    FLAG_CHANNEL_2 = 0x40,
    FLAG_CHANNEL_3 = 0x60,
    FLAG_CHANNEL_4 = 0x80,
    FLAG_CHANNEL_5 = 0xA0,
    FLAG_CHANNEL_6 = 0xC0,
    FLAG_CHANNEL_7 = 0xE0
};

Настройка канала (COMMAND_CHANNEL_CONFIG 0x11)
Открытие канала (COMMAND_CHANNEL_OPEN 0x18)
Закрытие канала (COMMAND_CHANNEL_CLOSE 0x19)

Управление аппаратными фильтрами

Настройка фильтров возможна только после открытия канала соединения с шиной. При закрытии канала, фильтры сбрасываются.
Следует учесть, что в зависимости от типа устройства, настройка фильтров может отличаться.

Установить фильтр (COMMAND_FILTER_SET 0x21)
Сбросить фильтр (COMMAND_FILTER_CLEAR 0x22)

Управление пробросом сообщений между каналами

После открытия каналов связи с шинами, можно активировать проброс сообщений между однотипными каналами.

Включить проброс сообщений между каналами (COMMAND_GATEWAY_ON 0x31)
Выключить проброс сообщений между каналами (COMMAND_GATEWAY_OFF 0x32)

Взаимодействие с данными в шинах данных

После открытия канала шины данных, устройство начнёт приём данных из шины и отправку сообщений в шину.

Отправка данных в шину

Отправить сообщение в шину (COMMAND_MESSAGE 0x40)

Выставить ответ в шину (COMMAND_SLAVE_RESPONSE_SET 0x48) для шины LIN
Выставить режим формирования ответа в шину (COMMAND_SLAVE_RESPONSE_MODE 0x49) для шины LIN

Приём данных из шины

Получение сообщения из шины (COMMAND_MESSAGE 0x40)
Получение статуса шины (COMMAND_BUS_ERROR 0x41)

Список поддерживаемых команд

Синхронизация (COMMAND_SYNC 0xA5)

Единственная команда, которая не подпадает под стандарт. Используется для инициализации устройства в первоначальное состояние. Происходит закрытие каналов связи с шинами данных, сброс счётчиков и буферов данных. Работа с устройством всегда начинается с отправки данной команды.
Обратите внимание, что данная команда является константой и всегда посылается в одном и том же виде.

Пример

⇒ A5 00 A5 00
⇐ 5A 00 5A 00

Запрос идентификатора устройства (COMMAND_DEVICE_HARDWARE 0x05)

Возвращается идентификатор используемого устройства. Идентификатор зависит от аппаратной составляющей устройства.
В ответе используется структура:

enum HWIdentifiers {
    HW_CH30     = 0xFF, /* Old identifier for CAN-Hacker on F105 mcu with dual CAN channels and single LIN channel */
    HW_ODB_OLD  = 0x02, /* Old identifier for CAN-Hacker in ODB interface with single CAN channel and single LIN channel */
    HW_CH32     = 0x01, /* CAN-Hacker 3.2 on F105 mcu with dual CAN channels and single LIN channel */
    HW_ODB      = 0x04, /* CAN-Hacker in ODB interface on F105 mcu with single CAN channel and single LIN channel */
    HW_CHP      = 0x03, /* CAN-Hacker CH-P on F105 mcu with dual CAN channels and single LIN channel */
    HW_CH33     = 0x11, /* CAN-Hacker 3.3 on F407 mcu with dual CAN channels and single LIN channel */
    HW_CHPM03   = 0x13, /* CAN-Hacker CH-P on F407 mcu with dual CAN channels and single LIN channel */
    HW_FDL2     = 0x06  /* CAN-Hacker CH-P on G473 mcu with dual CAN channels and single LIN channel */
};

typedef struct {
    CommandHeader header;
    uint8_t hwId;
} __attribute__((packed)) DeviceIdentifier;

Все устройства делятся на группы CH-105/CH-407/CH-4FD.
CH-105 – В своей основе имеют контроллер F105.
CH-407 – В своей основе имеют контроллер F407.
CH-4FD – В своей основе имеют контроллер G4xx.

Запрос

Поле Значение
command 0x05
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Ответ

Поле Значение
header.command 0x05
header.sequence порядковый номер запроса
header.flags 0x00
header.dSize 0x01
hwId 1 байт типа устройства

Пример

⇒ 05 xx 00 00
⇐ 05 xx 00 01 03

Запрос кода устройства (COMMAND_DEVICE_INFO 0x01)

Возвращается тип используемого устройства. Например "CH-3.x", "CH-ODB" или "CH-P".

Запрос

Поле Значение
command 0x01
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Ответ

Поле Значение
command 0x01
sequence порядковый номер запроса
flags 0x00
dSize количество байт данных
data[] ответ

Пример
Получение кода устройства CH-P

⇒ 01 xx 00 00
⇐ 01 xx 00 04 43 48 2D 50

Запрос внутренней версии ПО устройства (COMMAND_DEVICE_FIRMWARE 0x02)

Возвращается в виде текста версия ПО записанного на устройство. Например "0.1.20".

Запрос

Поле Значение
command 0x02
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Ответ

Поле Значение
command 0x02
sequence порядковый номер запроса
flags 0x00
dSize количество байт данных
data[] ответ

Пример

⇒ 02 xx 00 00
⇐ 02 xx 00 06 30 2E 31 2E 32 30

Запрос серийного номера устройства (COMMAND_DEVICE_SERIAL 0x03)

Возвращается серийный номер устройства.
В ответе используется структура

typedef struct {
    CommandHeader header;
    uint8_t[8] serial;
} __attribute__((packed)) DeviceSerialNumber;

Запрос

Поле Значение
command 0x03
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Ответ

Поле Значение
header.command 0x03
header.sequence порядковый номер запроса
header.flags 0x00
header.dSize 0x08
serial 8 байт серийного номера

Пример
Получение серийного номера 000000000000002E

⇒ 03 xx 00 00
⇐ 03 xx 00 08 00 00 00 00 00 00 00 2E

Установка режима работы устройства (COMMAND_DEVICE_MODE 0x04)

Перед тем как начать работу с устройством, необходимо выставить его режим работы. Этот режим задаётся через задание значения в поле flags заголовка запроса.
Допускается использовать следующие значения:

enum FLAG_DEVICE_MODES {
    FLAG_DEVICE_MODE_FULL = 0x00,
    FLAG_DEVICE_MODE_CAN  = 0x01,
    FLAG_DEVICE_MODE_LIN  = 0x02
};

Следует учесть, что при выставлении режима работы FLAG_DEVICE_MODE_CAN, то остаются доступны для работы только каналы отвечающие за работу с CAN. Каналы для работы с LIN не доступны. При выставлении режима работы FLAG_DEVICE_MODE_LIN остаются доступны каналы работы только с LIN и их нумерация начинается с 1.

Запрос

Поле Значение
command 0x04
sequence порядковый номер запроса
flags режим работы устройства
dSize 0x00

Ответ

Поле Значение
command 0x84
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример

⇒ 04 xx 01 00
⇐ 84 xx 00 00

Начать работу с устройством (COMMAND_DEVICE_OPEN 0x08)

После посылки данной команды, можно формировать команды для настройки каналов взаимодействия с шинами данных.

Запрос

Поле Значение
command 0x08
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Ответ

Поле Значение
command 0x88
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример

⇒ 08 xx 00 00
⇐ 88 xx 00 00

Завершить работу с устройством (COMMAND_DEVICE_CLOSE 0x09)

Посылка данной команды автоматически закрывает все каналы работы с шинами данных.

Запрос

Поле Значение
command 0x09
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Ответ

Поле Значение
command 0x89
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример

⇒ 09 xx 00 00
⇐ 89 xx 00 00

Настройка канала (COMMAND_CHANNEL_CONFIG 0x11)

Перед началом работы с каналом для взаимодействия с шиной данных, его необходимо настроить. В зависимости от типа канала доступен разный набор опций.
Общий список возможных опций для настройки:

enum FLAG_CHANNEL_CONFIGS {
    FLAG_CONFIG_BUS_SPEED    = 0x00,
    FLAG_CONFIG_BUS_SPEED_M  = 0x02,
    FLAG_CONFIG_TERMINATOR   = 0x05,
    FLAG_CONFIG_PULL_UP      = 0x06,
    FLAG_CONFIG_CRC_MODE     = 0x07,
    FLAG_CONFIG_MODE         = 0x09
};

При отправке команды настройки канала в поле flags необходимо поместить одно из значений перечисления FLAG_CHANNELS и одно из значений FLAG_CHANNEL_CONFIGS.

Для настройки канала, ответственного за работу с шиной CAN, доступны следующие настройки: Для настройки канала, ответственного за работу с шиной LIN, доступны следующие настройки:

Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00)

Для настройки скорости канала устройства используется структура:

typedef struct {
    CommandHeader header;
    uint8_t speed;
} __attribute__((packed)) ChannelConfigureSpeed;

Здесь в поле speed заносится индекс предзаданной скорости. В зависимости от типа устройства этот индекс свой.

Для устройств, в названии которых есть идентификатор FDL, используется следующие индексы:

enum CAN_BITRATE_FDL {
    CAN_BITRATE_FDL_10K = 0,
    CAN_BITRATE_FDL_20K,
    CAN_BITRATE_FDL_33_3K,
    CAN_BITRATE_FDL_50K,
    CAN_BITRATE_FDL_62_5K,
    CAN_BITRATE_FDL_83_3K,
    CAN_BITRATE_FDL_100K,
    CAN_BITRATE_FDL_125K,
    CAN_BITRATE_FDL_250K,
    CAN_BITRATE_FDL_400K,
    CAN_BITRATE_FDL_500K,
    CAN_BITRATE_FDL_800K,
    CAN_BITRATE_FDL_1000K
};

Для остальных устройств из линейки CAN-Hacker используются следующие индексы:
enum CAN_BITRATE {
    CAN_BITRATE_10K = 0,
    CAN_BITRATE_20K,
    CAN_BITRATE_33_3K,
    CAN_BITRATE_50K,
    CAN_BITRATE_62_5K,
    CAN_BITRATE_83_3K,
    CAN_BITRATE_95K,
    CAN_BITRATE_100K,
    CAN_BITRATE_125K,
    CAN_BITRATE_250K,
    CAN_BITRATE_400K,
    CAN_BITRATE_500K,
    CAN_BITRATE_800K,
    CAN_BITRATE_1000K
};

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_BUS_SPEED
header.dSize 0x01
speed значение из CAN_BITRATE или CAN_BITRATE_FDL, в зависимости от типа устройства

Ответ
Если запрос успешно обработан и значение индекса скорости в поле speed задано из допустимого диапазона значений.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Настройка канала 2 на скорость 20Кбит.

⇒ 11 xx 40 01 01
⇐ 91 xx 00 00

Настройка канала 2 с заданием неверного индекса скорости.

⇒ 11 xx 40 01 10
⇐ FF xx 00 00

Ручное задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED_M 0x02)

Для ручного задания скорости канала устройства используется структура:

typedef struct {
    uint16_t Prescaler;
    uint16_t tqSeg1;
    uint16_t tqSeg2;
    uint16_t SyncJW;
} __attribute__((packed)) BusCustomBaudRate;

typedef struct {
    CommandHeader header;
    BusCustomBaudRate speed;
} __attribute__((packed)) ChannelConfigureCustomSpeed;

Для устройств, в названии которых есть идентификатор FDL, расчёт ведётся исходя из частоты 120МГц, для остальных устройств из линейки CAN-Hacker расчёт ведётся исходя из скорости 36МГц. Следует учесть, что данные передаются в формате Motorola (big-endian).

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_BUS_SPEED_M
header.dSize 0x08
speed.Prescaler 2 байта
speed.tqSeg1 2 байта
speed.tqSeg2 2 байта
speed.SyncJW 2 байта

Ответ
Если запрос успешно обработан и значения полей структуры в поле speed заданы из диапазона допустимых величин.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Настройка канала 1 на скорость 200Кбит с частотой CAN в 36МГц ( Prescaler = 10, tqSeg1 = 15, tqSeg2 = 2, SyncJW = 1 ).

⇒ 11 xx 22 08 00 0A 00 0F 00 02 00 01
⇐ 91 xx 00 00

Настройки канала 1 с заданием одного из полей неправильным значением ( например, SyncJW = 16384\0x4000 ).

⇒ 11 xx 22 08 00 0A 00 0F 00 02 40 00
⇐ FF xx 00 00

Подключить терминирующий резистор (FLAG_CONFIG_TERMINATOR 0x05)

Некоторые устройства позволяют задействовать терминирующий резистор на 120Ом между линиями CAN-H и CAN-L. В таком случае используется данная настройка со следующей структурой обмена данных:

enum TERMINATOR_STATES {
    CAN_TERMINATOR_OFF  = 0x00,
    CAN_TERMINATOR_ON   = 0x01
};

typedef struct {
    CommandHeader header;
    uint8_t state;
} __attribute__((packed)) ChannelConfigureTerminator;

Данная настройка доступна для устройств с идентификаторами HW_CHP (0x03), HW_CHPM03 (0x13) и HW_FDL2 (0x06). Если устройство не поддерживает данную настройку, то ответ будет содержать 0xFF в поле с номером команды.

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_TERMINATOR
header.dSize 0x01
state значение из TERMINATOR_STATES

Ответ
Если запрос успешно обработан и значение состояния терминатора задано из допустимого диапазона значений.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Подключение терминатора для канала 2.

⇒ 11 xx 45 01 01
⇐ 91 xx 00 00

Задание состояния терминатора для канала 2 с неправильным значением.

⇒ 11 xx 45 01 10
⇐ FF xx 00 00

Режим взаимодействия с шиной (FLAG_CONFIG_MODE 0x09)

Можно указать режим работы с CAN шиной: активный режим (Normal), когда доступен и приём и передача данных, или пассивный режим (Listen only), когда устройство только слушает шину данных. Для некоторых устройств доступен сервисный режим, когда канал не подключается к шине, а отправленные данные сразу попадают на вход.
Для настройки данного параметра используется следующая структура:

enum CHANNEL_MODES {
    MODE_NORMAL  = 0x00,
    MODE_LISTEN  = 0x01,
    MODE_SERVICE = 0x02
};

typedef struct {
    CommandHeader header;
    uint8_t mode;
} __attribute__((packed)) ChannelConfigureMode;

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_MODE
header.dSize 0x01
mode значение из CHANNEL_MODES

Ответ
Если запрос успешно обработан и значение режима работы канала задано из допустимого диапазона значений.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Задание режима работы канала 1 в режиме только прослушивания шины

⇒ 11 xx 29 01 01
⇐ 91 xx 00 00

Задание режима работы канала 1 с неправильным значением.

⇒ 11 xx 29 01 05
⇐ FF xx 00 00

Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00)

Для настройки канала устройства используется структура:

typedef struct {
    CommandHeader header;
    uint8_t speed;
} __attribute__((packed)) ChannelConfigureSpeed;

Здесь в поле speed заносится индекс предзаданной скорости.
Доступны следующие значения:
enum LIN_BITRATE {
    LIN_BITRATE_2400 = 0,
    LIN_BITRATE_9600,
    LIN_BITRATE_10400,
    LIN_BITRATE_14400,
    LIN_BITRATE_15600,
    LIN_BITRATE_19200,
    LIN_BITRATE_20000,
    LIN_BITRATE_38400
};

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_BUS_SPEED
header.dSize 0x01
speed значение из LIN_BITRATE

Ответ
Если запрос успешно обработан и значение индекса скорости в поле speed задано из допустимого диапазона значений.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Настройка канала 3 на скорость 19200 бит.

⇒ 11 xx 60 01 05
⇐ 91 xx 00 00

Настройка канала 3 с заданием неверного индекса скорости.

⇒ 11 xx 60 01 10
⇐ FF xx 00 00

Подтяжка шины данных (FLAG_CONFIG_PULL_UP 0x06)

Некоторые устройства позволяют подтягивать шину данных LIN к +12В. В таком случае используется данная настройка со следующей структурой обмена данных:

enum PULL_UP_STATES {
    LIN_PULL_UP_OFF  = 0x00,
    LIN_PULL_UP_ON   = 0x01
};

typedef struct {
    CommandHeader header;
    uint8_t state;
} __attribute__((packed)) ChannelConfigurePullUp;

Данная настройка доступна для устройств с идентификаторами HW_CHP (0x03), HW_CHPM03 (0x13) и HW_FDL2 (0x06). Если устройство не поддерживает данную настройку, то ответ будет содержать 0xFF в поле с номером команды.

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_PULL_UP
header.dSize 0x01
state значение из PULL_UP_STATES

Ответ
Если запрос успешно обработан и значение подтяжки задано из допустимого диапазона значений.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Подтяжка шины данных к +12В для канала 3.

⇒ 11 xx 66 01 01
⇐ 91 xx 00 00

Задание подтяжки шины данных для канала 3 с неправильным значением.

⇒ 11 xx 66 01 10
⇐ FF xx 00 00

Задание режима расчёта контрольной суммы (FLAG_CONFIG_CRC_MODE 0x07)

Для каналов, отвечающих за работу с шиной LIN можно задать тип контрольной суммы, используемой для отправки данных в шину. Для данной настройки используется структура:

enum CRC_MODES {
    LIN_CRC_MODE_CLASSIC   = 0x00,
    LIN_CRC_MODE_ENCHANCED = 0x01
};

typedef struct {
    CommandHeader header;
    uint8_t mode;
} __attribute__((packed)) ChannelConfigureCRCMode;

Запрос

Поле Значение
header.command 0x11
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_CONFIG_CRC_MODE
header.dSize 0x01
mode значение из CRC_MODES

Ответ
Если запрос успешно обработан и значение вида контрольной суммы задано из допустимого диапазона значений.

Поле Значение
command 0x91
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Задание расчёта классической контрольной суммы для канала 2.

⇒ 11 xx 47 01 00
⇐ 91 xx 00 00

Задание вида расчёта контрольной суммы для канала 2 с неправильным значением.

⇒ 11 xx 47 01 10
⇐ FF xx 00 00

Открытие канала (COMMAND_CHANNEL_OPEN 0x18)

После настройки канала его можно открыть. После посылки данной команды начнётся обмен данными с шиной.

Запрос

Поле Значение
command 0x18
sequence порядковый номер запроса
flags FLAG_CHANNEL_x
dSize 0x00

Ответ

Поле Значение
command 0x98
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Открытие канала 1.

⇒ 18 xx 20 00
⇐ 98 xx 00 00

Попытка открытия канала 5, который не предусмотрен в устройстве.

⇒ 18 xx A0 00
⇐ FF xx 00 00

Закрытие канала (COMMAND_CHANNEL_OPEN 0x19)

Закрытие канала сбрасывает аппаратные фильтры, назначенные для закрываемого канала.

Запрос

Поле Значение
command 0x19
sequence порядковый номер запроса
flags FLAG_CHANNEL_x
dSize 0x00

Ответ

Поле Значение
command 0x99
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Закрытие канала 1.

⇒ 19 xx 20 00
⇐ 99 xx 00 00

Попытка закрытия канала 5, который не предусмотрен в устройстве.

⇒ 18 xx A0 00
⇐ FF xx 00 00

Установить фильтр (COMMAND_FILTER_SET 0x21)

В зависимости от типа устройства реализуются разные механизмы по настройке фильтров. Так для одних устройств с помощью флага можно указать тип фильтра: 11 бит или 29 бит. Для других тип фильтра определяется его индексом.
Для устройств группы 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 {
    uint8_t number;
    uint32_t id;
    uint32_t mask;
} __attribute__((packed)) FilterStruct;

typedef struct {
    CommandHeader header;
    FilterStruct filter;
} __attribute__((packed)) FilterSet;

Здесь в поле filter.number передаётся порядковый номер фильтра для канала. Нумерация идёт от 0. Канал и тип фильтра задаются в поле header.flag.

Запрос

Поле Значение
header.command 0x21
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x + FLAG_FILTER_TYPE
header.dSize 0x09
filter.number порядковый номер фильтра для канала
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 09 01 00 00 00 10 00 00 07 F0
⇐ A1 xx 00 00

Настройка канала 2 с заданием неверного индекса фильтра.

⇒ 21 xx 40 09 33 00 00 00 10 00 00 07 F0
⇐ FF xx 00 00

Сбросить фильтр (COMMAND_FILTER_CLEAR 0x22)

Команда сброса фильтра. Как только на канал будут сброшены все фильтры, то канал работает на пропуск всех сообщений с шины.

Для сброса фильтра используется структура:

typedef struct {
    CommandHeader header;
    uint8_t number;
} __attribute__((packed)) FilterClear;

Здесь в поле number передаётся порядковый номер фильтра для канала. Нумерация идёт от 0. Канал фильтра задаётся в поле header.flag.

Запрос

Поле Значение
header.command 0x22
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x
header.dSize 0x01
number порядковый номер фильтра для канала

Ответ
Если запрос успешно обработан и номер фильтра задан из допустимого диапазона значений.

Поле Значение
command 0xA2
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Сброс фильтра 2 для второго канала.

⇒ 22 xx 40 01 01
⇐ A2 xx 00 00

Сброс фильтра канала 2 с заданием неверного индекса фильтра.

⇒ 22 xx 40 01 33
⇐ FF xx 00 00

Включить проброс сообщений между каналами (COMMAND_GATEWAY_ON 0x31)

Включение проброса сообщений между CAN каналами устройства. Данную команду можно выполнить только после открытия двух каналов. Так как CAN-каналов может быть только 2, то и проброс включается только из канала 1 в канал 2 и из канала 2 в канал 1.

Запрос

Поле Значение
command 0x31
sequence порядковый номер запроса
flags FLAG_CHANNEL_x номер канала, из которого будет происходить проброс сообщений
dSize 0x00

Ответ

Поле Значение
command 0xB1
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Включение проброса сообщений из канала 1 в канал 2.

⇒ 31 xx 20 00
⇐ B1 xx 00 00

Попытка включения проброса сообщений из несуществующего канала.

⇒ 31 xx A0 00
⇐ FF xx 00 00

Выключить проброс сообщений между каналами (COMMAND_GATEWAY_OFF 0x32)

Выключение проброса сообщений между CAN каналами устройства.

Запрос

Поле Значение
command 0x32
sequence порядковый номер запроса
flags FLAG_CHANNEL_x номер канала, для которого отключается проброс сообщений
dSize 0x00

Ответ

Поле Значение
command 0xB1
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Выключение проброса сообщений из канала 1 в канал 2.

⇒ 32 xx 20 00
⇐ B2 xx 00 00

Попытка выключения проброса сообщений из несуществующего канала.

⇒ 32 xx A0 00
⇐ FF xx 00 00

Отправить сообщение в шину (COMMAND_MESSAGE 0x40)

Отправка сообщения в шину происходит с помощью следующей структуры:

enum FLAG_MESSAGE_CHANNELS {
    FLAG_MESSAGE_CHANNEL_1 = 0x2000,
    FLAG_MESSAGE_CHANNEL_2 = 0x4000,
    FLAG_MESSAGE_CHANNEL_3 = 0x6000,
    FLAG_MESSAGE_CHANNEL_4 = 0x8000,
    FLAG_MESSAGE_CHANNEL_5 = 0xA000,
    FLAG_MESSAGE_CHANNEL_6 = 0xC000,
    FLAG_MESSAGE_CHANNEL_7 = 0xE000
};

// CAN 29-bit message identifier
#define FLAG_MESSAGE_EXTID              0x0800U
// CAN Remote frame
#define FLAG_MESSAGE_RTR                0x0400U
// Confirm required
#define FLAG_MESSAGE_CONFIRM_REQUIRED   0x0001U

typedef struct {
    uint32_t msgID;
    uint8_t dlc;
    uint8_t data[8];
} __attribute__((packed)) ToBusMessage;

typedef struct {
    MsgCommandHeader header;
    ToBusMessage message;
} __attribute__((packed)) SendMessage;

Если в поле message.dlc указывается длина передаваемых данных меньше 8 байт, то поле data может соответствовать количеству данных, указанных в message.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.

Запрос

Поле Значение
header.command 0x40
header.sequence порядковый номер запроса
header.flags FLAG_MESSAGE_CHANNEL_x + FLAG_MESSAGE_xxxx
header.dSize 0x0D
message.msgID идентификатор отправляемого сообщения
message.dlc размер передаваемых данных в шину
message.data данные, передаваемые в шину

Ответ
Если выставлен флаг FLAG_MESSAGE_CONFIRM_REQUIRED и запрос успешно обработан.

Поле Значение
command 0xC0
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Передача 4 байт данных в шину с 29 битным идентификатором сообщения 0x1FF00000.

⇒ 40 xx 28 00 00 09 1F F0 00 00 04 00 00 07 F0

Передача RTR запроса в шину с 11 битным идентификатором сообщения 0x2FF.

⇒ 40 xx 24 00 00 05 00 00 02 FF 04

Выставить ответ в шину (COMMAND_SLAVE_RESPONSE_SET 0x48)

Данная команда используется для выставления Slave ответа в LIN шине. Данная команда использует следующую структуру данных:

typedef struct {
    uint32_t msgID;
    uint8_t dlc;
    uint8_t data[8];
} __attribute__((packed)) ToBusMessage;

typedef struct {
    CommandHeader header;
    ToBusMessage slave;
} __attribute__((packed)) SlaveResponse;

Если в поле slave.dlc указывается длина передаваемых данных меньше 8 байт, то поле data может соответствовать количеству данных, указанных в slave.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.
Здесь указывается для какого сообщения необходимо выставить Slave ответ. Идентификатор сообщения может быть как с выставленными битами защиты, так и со сброшенными.

Запрос

Поле Значение
header.command 0x48
header.sequence порядковый номер запроса
header.flags FLAG_CHANNEL_x
header.dSize длина передаваемых данных
slave.msgID идентификатор отслеживаемого сообщения
slave.dlc размер передаваемых данных в шину
slave.data данные, передаваемые в шину

Ответ

Поле Значение
command 0xC8
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Если запрос не обработан.

Поле Значение
command 0xFF
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Необходимо при получении сообщения (биты защиты сброшены) передать 4 байта данных.

⇒ 48 xx 20 09 00 00 00 01 04 00 00 07 F0
⇐ С8 xx 00 00

Выставить режим формирования ответа в шину (COMMAND_SLAVE_RESPONSE_MODE 0x49)

Выставление режима формирования ответа в LIN-шину переводит устройство в целом в режим SLAVE. В итоге из панели передачи данных вы не сможете отправлять пакеты в LIN-шину. Режим работы задаётся выставлением в поле flags заголовка запроса соответствующего значения.
Возможные значения:

enum FLAG_LIN_SLAVE_MODES {
    FLAG_LIN_SLAVE_MODE_OFF = 0x00,
    FLAG_LIN_SLAVE_MODE_ON  = 0x01
};

Запрос

Поле Значение
command 0x49
sequence порядковый номер запроса
flags FLAG_CHANNEL_x + FLAG_LIN_SLAVE_MODES
dSize 0x00

Ответ

Поле Значение
command 0xC9
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Включение SLAVE режима для LIN-шины.

⇒ 49 xx 21 00
⇐ C9 xx 00 00

Попытка выключения SLAVE режима на несуществующем LIN-канале.

⇒ 49 xx A0 00
⇐ FF xx 00 00

Получение сообщения из шины (COMMAND_MESSAGE 0x40)

Получение данных из шины происходит с использованием следующих структур:

enum FLAG_MESSAGE_CHANNELS {
    FLAG_MESSAGE_CHANNEL_1 = 0x2000,
    FLAG_MESSAGE_CHANNEL_2 = 0x4000,
    FLAG_MESSAGE_CHANNEL_3 = 0x6000,
    FLAG_MESSAGE_CHANNEL_4 = 0x8000,
    FLAG_MESSAGE_CHANNEL_5 = 0xA000,
    FLAG_MESSAGE_CHANNEL_6 = 0xC000,
    FLAG_MESSAGE_CHANNEL_7 = 0xE000
};

// CAN 29-bit message identifier
#define FLAG_MESSAGE_EXTID              0x0800U
// CAN Remote frame
#define FLAG_MESSAGE_RTR                0x0400U
// Error frame for CAN
#define FLAG_MESSAGE_EF                 0x0080U

// LIN Master request
#define FLAG_MESSAGE_MR                 0x0400U
// LIN Slave response
#define FLAG_MESSAGE_SR                 0x0200U

typedef struct {
    uint32_t time;    // время получения сообщения из шины в микросекундах по внутренним часам устройства
    uint32_t crc;     // предполагаемая контрольная сумма сообщения. используется для LIN. в остальных случаях не определено.
    uint32_t msgID;
    uint8_t dlc;
    uint8_t data[8];
} __attribute__((packed)) BusMessage;

typedef struct {
    MsgCommandHeader header;
    BusMessage message;
} __attribute__((packed)) RcvMessage;

Если в поле message.dlc указывается длина передаваемых данных меньше 8 байт, то поле data может соответствовать количеству данных, указанных в message.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.

Получение статуса шины (COMMAND_BUS_ERROR 0x41)

Данная команда от устройства возвращает статус шины в случае возникновения ошибки. Если в последствии ошибка на шине уходит, то приходит команда со статусом ошибки 0.
Команда со статусом шины может принимать следующие значения:

#define ERROR_CAN_STUFF                 0x00000001U
#define ERROR_CAN_FORMAT                0x00000002U
#define ERROR_LIN_FRAME                 0x00000002U
#define ERROR_CAN_ACK                   0x00000004U
#define ERROR_CAN_TRANSMIT              0x00000008U
#define ERROR_CAN_CRC                   0x00000010U
#define ERROR_BUS_OFF                   0x00000020U
#define ERROR_PASSIVE                   0x00000040U
#define ERROR_WARNING                   0x00000080U

typedef struct {
    CommandHeader header;
    uint32_t error;
} __attribute__((packed)) BusError;

В поле header.flags будет указан номер канала, для которого пришло данное сообщение.