Отправить сообщение в шину (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