Настройка канала (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, доступны следующие настройки:
- Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00 deprecated)
- Задание скорости передачи данных на шине CANFD (FLAG_CONFIG_BUS_SPEED_FD 0x01 deprecated)
- Ручное задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED_M 0x02 deprecated)
- Ручное задание скорости передачи данных на шине CANFD (FLAG_CONFIG_BUS_SPEED_FD_M 0x03 deprecated)
- Подключить терминирующий резистор (FLAG_CONFIG_TERMINATOR 0x05 deprecated)
- Режим взаимодействия с шиной (FLAG_CONFIG_MODE 0x09 deprecated)
- Формат передачи данных по CAN шине (FLAG_CONFIG_CAN_FRAME 0x0A deprecated)
- Задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED 0x00 deprecated)
- Ручное задание скорости взаимодействия с шиной (FLAG_CONFIG_BUS_SPEED_M 0x02 deprecated)
- Подтяжка шины данных (FLAG_CONFIG_PULL_UP 0x06 deprecated)
- Задание режима расчёта контрольной суммы (FLAG_CONFIG_CRC_MODE 0x07 deprecated)
- Задержка обработки сигнала IDLE (FLAG_CONFIG_IDLE_DELAY 0x08 deprecated)
Задание скорости взаимодействия с шиной 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