Проект

Общее

Профиль

Запрос информации об устройстве (COMMAND_DEVICE_INFO 0x06)

Вместо формирования нескольких запросов для получения информации об устройстве можно отправить единую команду, по которой будет отправлена полная информация о версии прошивки, аппаратного обеспечения, серийном номере и прочее.
Результатом запроса будет массив из uint32_t элементов.

// Если установлен старший бит, то в 0x00FF0000U выставляется количество элементов с дополнительной информацией.
#define DI_MULTIWORD                    0x80000000U

// Информация о типе устройства. Хранится в младшем байте. Возможные значения представлены в HWIdentifiers.
#define DI_HARDWARE_ID                  0x01000000U
// Версия прошивки. Используется с флагом DI_MULTIWORD. Версия прошивки сохраняется в дополнительных элементах 
// в виде ASCII строки, которая ограничивается 0x0 или длиной массива, выделенного под этот параметр.
#define DI_FIRMWARE_VERSION             0x02000000U
// Серийный номер устройства. Используется с флагом DI_MULTIWORD. Серийный номер представлен в бинарном виде.
#define DI_DEVICE_SERIAL                0x03000000U
// Битовая маска поддерживаемых дополнительных функций устройства. Описание ниже.
#define DI_FEATURES                     0x11000000U
// Карта поддерживаемых каналов и их типов. Может использоваться с флагом DI_MULTIWORD. Тогда описание каланов
// располагается в дополнительных элементах. Младший байт отвечает за первый канал, старший за максимальный.
// Без флага DI_MULTIWORD используется 3 младших байта. Описание ниже.
#define DI_CHANNEL_MAP                  0x12000000U
// Доступные опции по каналам.
#define DI_CHANNEL_FEATURES             0x13000000U
// Настройки доступных фильтров по каналам.
#define DI_FILTER                       0x14000000U
// Настройки шлюза по каналам.
#define DI_GATEWAY                      0x15000000U
// Информация, на какой частоте работает CAN/CAN-FD модуль.
#define DI_CHANNEL_FREQUENCY            0x16000000U
// Информация о размере буфера для поддержки протокола ISO-TP.
#define DI_ISOTP                        0x21000000U
// Информация о размере буфера для трейсера.
#define DI_TX_BUFFER                    0x22000000U
// Информация о количестве заданий на периодическую отправку в шину.
#define DI_TX_TASK                      0x23000000U

/**************************************************************************************************/
// DI_HARDWARE_ID - Идентификатор устройства
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_ODB_FD   = 0x14, /* CAN-Hacker in ODB interface on G431 mcu with single CANFD channel and single LIN channel */
    HW_FDL2_M02 = 0x06  /* CAN-Hacker CH-P on G473 mcu with dual CANFD channels and single LIN channel */
    HW_FDL2_M05 = 0x16  /* CAN-Hacker CH-P on G473 mcu with dual CANFD channels and single LIN channel */
};
// Пример: 0x01000001 
// Представление в памяти: 01 00 00 01
// Описание: Идентификатор устройства 0x01, что соответствует HW_CH32.

/**************************************************************************************************/
// DI_FIRMWARE_VERSION - Версия используемой прошивки
// Пример 1: 0x82020000 0x2E322E32 0x00392E30
// Представление в памяти: 00 00 02 82 32 2E 32 2E 30 2E 39 00
// Описание: Содержит версию прошивки 2.2.0.9
// Пример 2: 0x82020000 0x2E322E32 0x30312E30
// Представление в памяти: 00 00 02 82 32 2E 32 2E 30 2E 31 30
// Описание: Содержит версию прошивки 2.2.0.10

/**************************************************************************************************/
// DI_DEVICE_SERIAL - Серийный номер устройства
// Пример: 0x83020000 0x00000000 0x01000000
// Представление в памяти: 00 00 02 83 00 00 00 00 00 00 00 01
// Описание: Серийный номер устройства 00 00 00 00 00 00 00 01

/**************************************************************************************************/
// DI_FEATURES - Флаги доступных функций устройства

// Поддерживается шлюз между каналами. Если данный флаг установлен, то дополнительно будет информация
// о настройках шлюза в DI_GATEWAY.
#define DI_FEATURE_GATEWAY              0x00000001U

// Устройство поддерживает возможность отправки и приёма сообщений в формате ISO-TP (ISO 15765-2).
#define DI_FEATURE_ISOTP                0x00000002U

// Поддерживается буфер передачи данных из трейсера для выдерживания таймингов.
// Если данный флаг установлен, то дополнительно будет информация о размере буфера в DI_TX_BUFFER.
#define DI_FEATURE_TX_BUFFER            0x00000004U

// Поддерживается периодическая отправку данных в шину с заданными интервалами.
// Если данный флаг установлен, то дополнительно будет информация о количестве заданий, которое может 
// обработать устройство в DI_TX_TASK.
#define DI_FEATURE_TX_TASK              0x00000008U

// Пример: 0x11000009
// Представление в памяти: 09 00 00 11
// Описание: Доступны функции шлюза и периодическая отправка на CAN шине.

/**************************************************************************************************/
// DI_CHANNEL_MAP - Карта каналов устройства
enum ChannelTypeEnum {
    CTE_None   = 0x00, /* Канал не используется и дальше ничего нет */
    CTE_CAN    = 0x01,
    CTE_CANFD  = 0x02,
    CTE_LIN    = 0x10
};
// Пример: 0x12100101
// Представление в памяти: 01 01 10 12
// Описание: 3 канала: 1-CAN, 2-CAN и 3-LIN.

/**************************************************************************************************/
// DI_CHANNEL_FEATURES - Доступные опции для канала. Для каждого канала своя запись.

// Маска канала, для которого пришло описание опций. Каналы нумеруются с 1.
#define DI_CHANNEL_CHANNEL_MASK         0x00FF0000U
#define DI_CHANNEL_CHANNEL_SHIFT        16

// На канале есть контроль Arbitration Lost
#define DI_CHANNEL_FEATURE_ALC          0x00000001U
// На канале есть возможность управлять подключением терминирующего резистора для CAN
#define DI_CHANNEL_FEATURE_TERMINATOR   0x00000002U
// На канале есть возможность управлять подтяжкой линии данных для LIN
#define DI_CHANNEL_FEATURE_PULLUP       0x00000004U
// На канале поддерживается определение скорости шины классического CAN
#define DI_CHANNEL_FEATURE_CSD          0x00000008U
// Для LIN шины можно установить задёржку определения IDLE
#define DI_CHANNEL_FEATURE_IDLE         0x00000010U
// На канале поддерживается определение скорости шины CANFD
#define DI_CHANNEL_FEATURE_DSD          0x00000020U
// На канале возможно выставление формата CANFD фреймов в стиле NonISO
#define DI_CHANNEL_FEATURE_NONISO       0x00000040U

// Пример: 0x13010002
// Представление в памяти: 02 00 01 13
// Описание: Для первого канала доступно управление подключением терминирующим резистором.

/**************************************************************************************************/
// DI_FILTER - Настройки фильтров. Для каждого канала может быть несколько посылок.

// Маска канала, для которого пришло описание фильтра. Каналы нумеруются с 1.
#define DI_FILTER_CHANNEL_MASK          0x00FF0000U
#define DI_FILTER_CHANNEL_SHIFT         16

// Маска типа фильтра.
#define DI_FILTER_TYPE_MASK             0x0000FF00U
#define DI_FILTER_TYPE_SHIFT            8
// Фильтр 8 бит
#define DI_FILTER_TYPE_8BIT             0x00000001U
// Фильтр 11 бит
#define DI_FILTER_TYPE_11BIT            0x00000002U
// Фильтр 29 бит
#define DI_FILTER_TYPE_29BIT            0x00000004U

// Маска количества фильтров.
#define DI_FILTER_SIZE_MASK             0x000000FFU
#define DI_FILTER_SIZE_SHIFT            0

// Пример: 0x1401060E
// Представление в памяти: 0E 06 01 14
// Описание: Фильтр для канала 1 в количестве 14 штук, которые являются 11- и 29- битными.
// Пример: 0x1401021С 0x14010408
// Представление в памяти: 1С 02 01 14 08 04 01 14
// Описание: Фильтры для канала 1, где с 0 по 27 являются 11-битрыми, а с 28 по 35 являются 29-битными.

/**************************************************************************************************/
// DI_GATEWAY - Описание возможных пробросов сообщений между каналами и количество фильтров.

// Маска исходного канала (нумерация c 1)
#define DI_GATEWAY_SRC_MASK             0x00FF0000U
#define DI_GATEWAY_SRC_SHIFT            16

// Маска канала назначения (нумерация c 1)
#define DI_GATEWAY_DST_MASK             0x0000FF00U
#define DI_GATEWAY_DST_SHIFT            8

// Маска количества фильтров шлюза
#define DI_GATEWAY_FILTER_MASK          0x000000FFU
#define DI_GATEWAY_FILTER_SHIFT         0

// Пример: 0x15010210
// Представление в памяти: 10 02 01 15
// Описание: Возможен проброс сообщений из канала 1 в канал 2 и установкой 16 фильтров.

/**************************************************************************************************/
// DI_CHANNEL_FREQUENCY - Частота, на которой работает модуль для работы с CAN/CAN-FD, и которую
// необходимо учитывать для расчёта параметров задания скорости шины.
// Пример: 0x15010078
// Представление в памяти: 78 00 01 15
// Описание: Частота работы модуля CAN/CAN-FD на первом канале 120МГц.

/**************************************************************************************************/
// DI_TX_BUFFER - Размер буфера отправки сообщений в шину для трейсера.
// Размер буфера указывается в количестве сообщений, которые будут отправляться с заданными интервалами.
// Пример: 0x22000010
// Представление в памяти: 10 00 00 22
// Описание: Буфер рассчитан на 16 сообщений.

/**************************************************************************************************/
// DI_TX_TASK - Количество ячеек памяти, в которые можно поместить задания на периодическую отправку сообщений.
// Пример: 0x23000010
// Представление в памяти: 10 00 00 23
// Описание: Буфер рассчитан на 16 сообщений.

Запрос

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

Ответ

Поле Значение
header.command 0x06
header.sequence порядковый номер запроса
header.flags 0x00
header.dSize кратное 4 количество байт
data[] данные с информацией об устройстве

Пример

⇒ 06 xx 00 00
⇐ 06 xx 00 38 01 00 00 01 00 00 02 82 32 2E 32 2E 30 2E 39 00 00 00 02 83 00 00 00 00 00 00 00 00 01 00 00 11 01 01 10 12 0E 06 01 14 0E 06 02 14 08 01 03 14 20 02 01 15 20 01 02 15