Задание скорости взаимодействия с шиной CAN (FLAG_CONFIG_BUS_SPEED 0x00)¶
Для настройки скорости канала устройства для работы с 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