Открытие канала (COMMAND_CHANNEL_OPEN 0x18)¶
Доступна настройка канала в момент его открытия. Настройки передаются по аналогии с получением информации об устройстве.
Для обратной совместимости с программным обеспечением, использующим наши устройства, временно оставлен старой механизм настройки каналов.
После посылки данной команды начнётся обмен данными с шиной.
// Используемые структуры
typedef struct {
uint16_t Prescaler;
uint16_t tqSeg1;
uint16_t tqSeg2;
uint16_t SyncJW;
} __attribute__((packed)) BusCustomBaudRate;
// Если установлен старший бит, то в 0x00FF0000U выставляется количество элементов с дополнительной информацией.
#define CC_MULTIWORD 0x80000000U
// Выставление номинальной скорости канала
#define CC_BUS_SPEED_N 0x01000000U
// Выставление скорости канала для данных. Применимо для CAN-FD
#define CC_BUS_SPEED_D 0x02000000U
// Режим работы CAN/CAN-FD канала
#define CC_CAN_MODE 0x11000000U
// Режим отправки данных в CAN-FD шину
#define CC_CAN_FRAME 0x12000000U
// Автоматически переотправлять сообщения, которые не ушли в шину.
// Отслеживание идёт на уровне процессора, что может привести к зависанию аппаратного модуля CAN, если не шине не будет принимающих узлов
// не в режиме слушателя.
#define CC_CAN_RETRANSMIT 0x13000000U
// Настройка формата отправляемых сообщений: ISO/NonISO. Доступно в прошивке с версей 2.2.4 или новее.
#define CC_CAN_FRAME_FORMAT 0x14000000U
// Зедержка перевода LIN шины в состояния IDLE.
#define CC_LIN_IDLE_DELAY 0x21000000U
/**************************************************************************************************/
// CC_BUS_SPEED_N - Задание номинальной скорости CAN
// Данная настройка может принимать индекс заранее предопределённой скорости шины и настройки скорости шины исходя из типа используемого устройства
// (36МГц для устройств с классическим CAN / 120МГц для устройств, поддерживающих CAN-FD).
// Для использования индекса скорости флаг CC_MULTIWORD не выставляется и в младшем байте задаётся индекс скорости из следующего перечисления:
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,
NOMINAL_BITRATE_DETECT = 0xFF // Если канал поддерживает механизм определения скорости шины
};
// При выставлении флага DI_MULTIWORD в следующем байте за старшим ожидается указани длины данных в 32-битных словах.
// При этом в следующих словах ожидается структура BusCustomBaudRate.
// Пример: 0x0100000B
// Представление в памяти: 0B 00 00 01
// Описание: Задать предопределённую скорость в 500кб/с.
// Пример: 0x81020000 0x000F0004 0x00010002
// Представление в памяти: 00 00 02 81 04 00 0F 00 02 00 01 00
// Описание: Задать скорость в 500кб/с для устройства с классическим CAN.
// Здесь Prescaler = 4 / tqSeg1 = 15 / tqSeg2 = 2 / SyncJW = 1
/**************************************************************************************************/
// CC_BUS_SPEED_D - Задание скорости данных для CAN-FD
// Данная настройка может принимать индекс заранее предопределённой скорости шины и настройки скорости шины исходя из частоты 120МГц.
// Для использования индекса скорости флаг CC_MULTIWORD не выставляется и в младшем байте задаётся индекс скорости из следующего перечисления:
enum dataCanBitrate {
DATA_BITRATE_500K = 0,
DATA_BITRATE_1000K,
DATA_BITRATE_2000K,
DATA_BITRATE_4000K,
DATA_BITRATE_5000K
};
// При выставлении флага DI_MULTIWORD в следующем байте за старшим ожидается указани длины данных в 32-битных словах.
// При этом в следующих словах ожидается структура BusCustomBaudRate.
// Пример: 0x02000002
// Представление в памяти: 02 00 00 02
// Описание: Задать предопределённую скорость в 2000кб/с для данных.
// Пример: 0x82020000 0x00070006 0x00010002
// Представление в памяти: 00 00 02 82 06 00 07 00 02 00 01 00
// Описание: Задать скорость в 500кб/с для устройства с классическим CAN.
// Здесь Prescaler = 6 / tqSeg1 = 7 / tqSeg2 = 2 / SyncJW = 1
/**************************************************************************************************/
// CC_CAN_MODE - режим работы канала
// Активный режим (Normal), когда доступен и приём и передача данных, или пассивный режим (Listen only),
// когда устройство только слушает шину данных. Значение режима передаётся в младшем байте.
enum CHANNEL_MODES {
MODE_NORMAL = 0x00,
MODE_LISTEN = 0x01,
MODE_LOOPBACK = 0x02
};
// Пример: 0x11000001
// Представление в памяти: 01 00 00 11
// Описание: Канал настроен в режиме только прослушивания шины.
/**************************************************************************************************/
// CC_CAN_FRAME - режим отправки данных в шину.
// Для устройств, поддерживающих работу с CAN-FD можно указать режим отправки данных в шину.
// Значение режима передаётся в младшем байте.
enum CHANNEL_CAN_FRAME {
CAN_FRAME_CLASSIC = 0x00,
CAN_FRAME_FDF_NO_BRS = 0x01,
CAN_FRAME_FDF_BRS = 0x02
};
// Пример: 0x12000002
// Представление в памяти: 02 00 00 12
// Описание: Канал настроен в режиме передачи данных с переключением скорости.
/**************************************************************************************************/
// CC_CAN_RETRANSMIT - перепосылка данных
// Можно включить механизм автоматической, на уровне "железа", перепосылки сообщения в шину, если не
// пришло подтверждения получения сообщения другим устройством на шине.
// Не рекомендуется использовать, тк это может заблокировать отправку сообщений в шину.
// Включается/отключается настройка выставлением младшего бита в младшем байте.
// Пример: 0x13000001
// Представление в памяти: 01 00 00 13
// Описание: Включить автоматическую перепосылку сообщений в шину.
/**************************************************************************************************/
// CC_CAN_FRAME_FORMAT - формат передаваемых данных в шину
// Начиная с прошивки 2.2.4 есть возможность включения передачи данных для CAN-FD в формате Bosch
// Specification v1.0 (NonISO);
// Включается/отключается настройка выставлением младшего бита в младшем байте.
// Пример: 0x14000001
// Представление в памяти: 01 00 00 14
// Описание: Включить передачу данных в шину в формате NonISO.
/**************************************************************************************************/
// CC_BUS_SPEED_N - Задание номинальной скорости LIN
// Для LIN шины скорость задаётся в двух младших байтах
// Пример: 0x01004B00
// Представление в памяти: 00 4B 00 01
// Описание: Задание скорости LIN шины в 19200 б/с
/**************************************************************************************************/
// CC_LIN_IDLE_DELAY - задержка перевода LIN шины в состояние 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
};
// Пример: 0x21000003
// Представление в памяти: 03 00 00 21
// Описание: Перевод шины LIN в состояние IDLE через 250 мкс.
Запрос
Поле | Значение |
command | 0x18 |
sequence | порядковый номер запроса |
flags | FLAG_CHANNEL_x |
header.dSize | кратное 4 количество байт |
data[] | настройки канала |
Ответ
Поле | Значение |
command | 0x98 |
sequence | порядковый номер запроса |
flags | 0x00 |
dSize | 0x00 |
Пример
Открытие канала 1 с CAN-FD и BRS на скорости 500/2000.
⇒ 18 xx 20 20 00 00 00 11 02 00 00 12 00 00 02 81 0F 00 0C 00 03 00 01 00 00 00 02 82 06 00 07 00 02 00 01 00
⇐ 98 xx 00 00
Открытие канала 1 с CAN-FD и BRS на скорости 500/2000 с предопределёнными индексами скоростей.
⇒ 18 xx 20 20 00 00 00 11 02 00 00 12 0B 00 00 01 02 00 00 02
⇐ 98 xx 00 00
Открытие канала 2 с классическим CAN и скорость 500 кб/с на устройстве, поддерживающем CAN-FD.
⇒ 18 xx 40 14 00 00 00 11 00 00 00 12 00 00 02 81 0F 00 0C 00 03 00 01 00
⇐ 98 xx 00 00
Попытка открытия канала 5, который не предусмотрен в устройстве, с классическим CAN на скорости 500кб/с.
⇒ 18 xx A0 08 01 00 00 11 0B 00 00 01
⇐ FF xx 00 00