Проект

Общее

Профиль

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

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

enum FLAG_CHANNEL_CONFIGS {
    FLAG_CONFIG_BUS_SPEED      = 0x00, // deprecated
    FLAG_CONFIG_BUS_SPEED_FD   = 0x01, // deprecated
    FLAG_CONFIG_BUS_SPEED_M    = 0x02,
    FLAG_CONFIG_BUS_SPEED_FD_M = 0x03,
    FLAG_CONFIG_TERMINATOR     = 0x05,
    FLAG_CONFIG_PULL_UP        = 0x06,
    FLAG_CONFIG_CRC_MODE       = 0x07,
    FLAG_CONFIG_IDLE_DELAY     = 0x08,
    FLAG_CONFIG_MODE           = 0x09,
    FLAG_CONFIG_CAN_FRAME      = 0x0A
};

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

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

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

Данная настройка помечена как устаревшая (deprecated).

Для настройки скорости канала устройства для работы с CAN шиной используется структура:

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

Здесь в поле speed заносится индекс скорости. На данный момент используется две таблицы скоростей.

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

enum nominalCanBitrate {
    NOMINAL_BITRATE_10K = 0,
    NOMINAL_BITRATE_20K,
    NOMINAL_BITRATE_33_3K,
    NOMINAL_BITRATE_50K,
    NOMINAL_BITRATE_62_5K,
    NOMINAL_BITRATE_83_3K,
    NOMINAL_BITRATE_95_2K,
    NOMINAL_BITRATE_100K,
    NOMINAL_BITRATE_125K,
    NOMINAL_BITRATE_250K,
    NOMINAL_BITRATE_400K,
    NOMINAL_BITRATE_500K,
    NOMINAL_BITRATE_800K,
    NOMINAL_BITRATE_1000K,
};

Для взаимодействия с классической CAN шиной используются следующие индексы:
enum canBitrate {
    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 значение из canBitrate или nominalCanBitrate, в зависимости от типа устройства

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

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

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

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

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

⇒ 11 xx 40 01 01
⇐ 91 xx 00 00

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

⇒ 11 xx 40 01 10
⇐ FF xx 00 00

Задание скорости передачи данных на шине CANFD (FLAG_CONFIG_BUS_SPEED_FD 0x01) deprecated

Данная настройка помечена как устаревшая (deprecated).

Для настройки скорости передачи данных канала устройства, подключенного к шине CANFD, используется структура:

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

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

enum dataCanBitrate {
    DATA_BITRATE_500K = 0,
    DATA_BITRATE_1000K,
    DATA_BITRATE_2000K,
    DATA_BITRATE_4000K,
    DATA_BITRATE_5000K
};

Запрос

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

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

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

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

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

Пример
Настройка канала 2 на скорость данных 1000Кбит.

⇒ 11 xx 41 01 01
⇐ 91 xx 00 00

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

⇒ 11 xx 41 01 10
⇐ FF xx 00 00

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

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

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;

Для устройств, в названии которых есть идентификатор FD, расчёт ведётся исходя из частоты 120МГц, для остальных устройств из линейки CAN-Hacker расчёт ведётся исходя из скорости 36МГц.

Запрос

Поле Значение
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 0A 00 0F 00 02 00 01 00
⇐ 91 xx 00 00

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

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

Ручное задание скорости передачи данных на шине CANFD (FLAG_CONFIG_BUS_SPEED_FD_M 0x03) deprecated

Для ручного задания скорости передачи данных канала устройства, подключенного к шине CANFD, используется структура:

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;

Расчёт ведётся исходя из частоты 120МГц.

Запрос

Поле Значение
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 на скорость передачи данных в 2000Кбит с частотой CAN в 120МГц ( Prescaler = 6, tqSeg1 = 7, tqSeg2 = 2, SyncJW = 1 ).

⇒ 11 xx 23 08 06 00 07 00 02 00 01 00
⇐ 91 xx 00 00

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

Некоторые устройства позволяют задействовать терминирующий резистор на 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) deprecated

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

enum CHANNEL_MODES {
    MODE_NORMAL   = 0x00,
    MODE_LISTEN   = 0x01,
    MODE_LOOPBACK = 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) deprecated

Данная настройка помечена как устаревшая (deprecated).

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

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

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

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

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;

ПРи задании пользовательской скорости учитывается значение поля Prescaler, в который и передаётся значение требуемой скорости. Остальные поля должны быть равны 0.

Запрос

Поле Значение
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

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

⇒ 11 xx 22 08 00 4B 00 00 00 00 00 00
⇐ 91 xx 00 00

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

Некоторые устройства позволяют подтягивать шину данных 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) deprecated

Для каналов, отвечающих за работу с шиной 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

Задержка обработки сигнала IDLE (FLAG_CONFIG_IDLE_DELAY 0x08) deprecated

Иногда случается, что при мониторинге взаимодействия Master и Slave устройства последнее отвечает с задержкой, большей чем предусматривает стандарт. Поэтому мы предусмотрели возможность установить задержку по обработке сигнала IDLE, возникающего на шине. Для настройки данного параметра используется структура:

enum LIN_IDLE_DELAY {
    LIN_IDLE_DELAY_None = 0,
    LIN_IDLE_DELAY_100us,
    LIN_IDLE_DELAY_200us,
    LIN_IDLE_DELAY_250us,
    LIN_IDLE_DELAY_500us,
    LIN_IDLE_DELAY_750us,
    LIN_IDLE_DELAY_1000us,
    LIN_IDLE_DELAY_1500us,
    LIN_IDLE_DELAY_2000us
};
typedef struct {
    CommandHeader header;
    uint8_t delay;
} __attribute__((packed)) ChannelConfigureIdleDelay;

Здесь в поле delay заносится значение индекса задержки.

Запрос

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

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

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

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

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

Пример
Настройка задержки обработки IDLE в канале 3 на 1000 микросекунд.

⇒ 11 xx 68 01 06
⇐ 91 xx 00 00

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

⇒ 11 xx 68 01 10
⇐ FF xx 00 00