Проект

Общее

Профиль

Отправить сообщение в шину (COMMAND_MESSAGE 0x40)

По сравнению с первой версией протокола данная команда претерпела ряд изменений в передаваемых данных устройству для передачи в шину данных. Теперь отправка сообщений происходит с использованием следующей структуры:

enum FLAG_MESSAGE_CHANNELS {
    FLAG_MESSAGE_CHANNEL_1 = 0x2000,
    FLAG_MESSAGE_CHANNEL_2 = 0x4000,
    FLAG_MESSAGE_CHANNEL_3 = 0x6000,
    FLAG_MESSAGE_CHANNEL_4 = 0x8000,
    FLAG_MESSAGE_CHANNEL_5 = 0xA000,
    FLAG_MESSAGE_CHANNEL_6 = 0xC000,
    FLAG_MESSAGE_CHANNEL_7 = 0xE000
};

#define FLAG_MESSAGE_CONFIRM_REQUIRED   0x0001U

// 29-bit message identifier
#define FLAG_MESSAGE_EXTID              0x00000001U
// Remote frame
#define FLAG_MESSAGE_RTR                0x00000002U
// CAN-FD frame
#define FLAG_MESSAGE_FDF                0x00000004U
// CAN-FD bit rate switch
#define FLAG_MESSAGE_BRS                0x00000008U
// CAN-FD Error status indicator
#define FLAG_MESSAGE_ESI                0x00000010U
// Block TX
#define FLAG_MESSAGE_BLOCK_TX           0x30000000U

typedef struct {
    uint32_t flags;                             // 4 bytes
    uint32_t time;                              // 4 bytes
    uint32_t msgID;                             // 4 bytes
    uint32_t dlc;                               // 4 bytes
    uint8_t  data[64];
} __attribute__((packed)) ToBusMessage;

typedef struct {
    MsgCommandHeader header;
    ToBusMessage message;
} __attribute__((packed)) SendMessage;

Если в поле message.dlc указывается длина передаваемых данных меньше 64 байт, то поле data может соответствовать количеству данных, указанных в message.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.

Следует учесть, что по сравнению с первой версией протокола в header.flags указывается только номер канала из FLAG_MESSAGE_CHANNEL_x, через который будет происходить передача данных.
Для настройки формата передаваемых данных теперь используется поле message.flags. Следует учесть, что если для CAN шины в message.flags не выставить флаг FLAG_MESSAGE_BLOCK_TX, то устройство после отправки сообщения в шину вернёт его с соответствующим флагом.

Для обратной совместимости также временно поддерживается старая структура отправки сообщений в шину.

Запрос

Поле Значение
header.command 0x40
header.sequence порядковый номер запроса
header.flags FLAG_MESSAGE_CHANNEL_x
header.dSize 0x10 - 0x50
message.flags FLAG_MESSAGE_xxxx
message.time всегда 0
message.msgID идентификатор отправляемого сообщения
message.dlc размер передаваемых данных в шину
message.data данные, передаваемые в шину

Ответ
Если выставлен флаг FLAG_MESSAGE_CONFIRM_REQUIRED в поле header.flags и запрос успешно обработан.

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

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

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

Пример
Передача 4 байт данных в шину с 29 битным идентификатором сообщения 0x1FF00000.

⇒ 40 xx 00 20 14 00 01 00 00 30 00 00 00 00 00 00 F0 1F 04 00 00 00 00 00 07 F0

Передача RTR запроса в шину с 11 битным идентификатором сообщения 0x2FF.

⇒ 40 xx 00 20 10 00 02 00 00 30 00 00 00 00 FF 02 00 00 04 00 00 00