Протокол (Версия 10 — outdated/устаревший) => Протокол (Версия 20) => Протокол (Версия 22)¶
- Протокол (Версия 10 — outdated/устаревший) => Протокол (Версия 20) => Протокол (Версия 22)
- Поддерживаемые команды
- Взаимодействие с данными в шинах данных
- Список поддерживаемых команд
- Синхронизация (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_CHANNEL_CONFIG 0x11)
- Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00)
- Ручное задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED_M 0x02)
- Подключить терминирующий резистор (FLAG_CONFIG_TERMINATOR 0x05)
- Режим взаимодействия с шиной (FLAG_CONFIG_MODE 0x09)
- Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00)
- Подтяжка шины данных (FLAG_CONFIG_PULL_UP 0x06)
- Задание режима расчёта контрольной суммы (FLAG_CONFIG_CRC_MODE 0x07)
- Открытие канала (COMMAND_CHANNEL_OPEN 0x18)
- Закрытие канала (COMMAND_CHANNEL_OPEN 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)
- Выставить режим формирования ответа в шину (COMMAND_SLAVE_RESPONSE_MODE 0x49)
- Получение сообщения из шины (COMMAND_MESSAGE 0x40)
- Получение статуса шины (COMMAND_BUS_ERROR 0x41)
Поля размерность 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, доступны следующие настройки:
- Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00)
- Ручное задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED_M 0x02)
- Подключить терминирующий резистор (FLAG_CONFIG_TERMINATOR 0x05)
- Режим взаимодействия с шиной (FLAG_CONFIG_MODE 0x09)
- Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00)
- Подтяжка шины данных (FLAG_CONFIG_PULL_UP 0x06)
- Задание режима расчёта контрольной суммы (FLAG_CONFIG_CRC_MODE 0x07)
Задание скорости взаимодействия с шиной (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 будет указан номер канала, для которого пришло данное сообщение.