CAN-шина:
от теории к практике в Link G4X
Подробное руководство для энтузиастов, которые хотят подключать CAN-устройства к своему ECU самостоятельно — без «священных танцев», глядя в даташит и понимая, что именно они настраивают.
01Из чего состоит CAN-сообщение
Типовое CAN-сообщение выглядит так:
27A 4 A1 24 DD FF
27A — идентификатор сообщения (ID, в hex).
4 — длина данных (DLC, от 0 до 8).
Далее идут сами данные: A1 24 DD FF. Четыре байта, каждый по 8 бит.
02Hex и двоичная запись
Шестнадцатеричная (0x..) и двоичная (0b..) запись —
это одно и то же число в разных системах счисления. Полезно помнить
«степени двойки» — они соответствуют отдельным битам внутри байта:
| Hex | Binary | Какой бит установлен |
|---|---|---|
| 0x00 | 0b00000000 | — |
| 0x01 | 0b00000001 | бит 0 |
| 0x02 | 0b00000010 | бит 1 |
| 0x04 | 0b00000100 | бит 2 |
| 0x08 | 0b00001000 | бит 3 |
| 0x10 | 0b00010000 | бит 4 |
| 0x20 | 0b00100000 | бит 5 |
| 0x40 | 0b01000000 | бит 6 |
| 0x80 | 0b10000000 | бит 7 |
Биты внутри байта нумеруются справа налево (младший — справа):
03Размерность: сколько бит занимает число
Объём, который нужен числу, выбирается по максимальному значению, которое надо передать. В CAN реально используются три размера: 1, 8 и 16 бит.
| Размер | Диапазон (unsigned) | Hex | Применение |
|---|---|---|---|
| 1 бит | 0 … 1 | — | Флаги: вкл/выкл, аварийные индикаторы |
| 8 бит | 0 … 255 | 0xXX | Температуры, проценты, уровни |
| 16 бит | 0 … 65 535 | 0xXXXX | Обороты, скорость, давление |
Примеры из жизни
- Флаг — достаточно 1 бита. Значения только 0 или 1.
- Температура — обычно 8 бит. Если нужны отрицательные значения, применяют offset (см. раздел 5).
- Тахометр — 16 бит: в 8 бит 8000 об/мин не лезет.
04Порядок байтов (endian)
Как только число занимает больше одного байта, появляется вопрос: какой байт идёт в шину первым — старший или младший. Это и есть byte order, он же endian.
Пример: число 10000 = 0x2710. Это два байта: 0x27 (старший) и 0x10 (младший).
| Порядок | Как идёт в потоке | Обозначение в Link |
|---|---|---|
| Big endian | 0x27 0x10 (старший первый) | MS First |
| Little endian | 0x10 0x27 (младший первый) | LS First |
05Offset: смещение значения
Байт в CAN по умолчанию беззнаковый (0…255). Но передавать часто нужно знаковые величины — например, температуру от −40 до +215. Тогда к «сырому» значению прибавляют offset.
Температура = сырой_байт − 40 сырой_байт 0 → −40 °C сырой_байт 40 → 0 °C сырой_байт 130 → +90 °C
06Как описывается сигнал внутри кадра
Любой сигнал в CAN-кадре описывается тремя параметрами:
| Параметр | Что означает |
|---|---|
| Start byte | Номер байта, с которого начинается значение |
| Bit offset | Сдвиг внутри байта — с какого бита стартует |
| Bit length | Сколько бит занимает значение |
Что такое битовый сдвиг — на пальцах
Возьмём число 7:
7 = 0x07 = 0b00000111
Сдвигаем на 2 бита влево:
0b00000111 << 2 = 0b00011100 = 0x1C = 28
Зачем это нужно: чтобы воткнуть значение в нужную позицию внутри байта и не тронуть соседние биты, в которых лежат другие данные.
07Два флага в одном байте
Задача: в сообщение с ID 0x27A, в байт 3,
положить флаг «аварийное давление масла» (бит 5) и флаг «авария АКБ» (бит 2).
Биты считаем от 1.
| Параметр | Масло | АКБ |
|---|---|---|
| Start byte | 3 | 3 |
| Bit length | 1 бит | 1 бит |
| Bit offset | 4 (бит 5 − 1) | 1 (бит 2 − 1) |
Как это выглядит в байте
Где М — флаг масла (бит 5), А — флаг АКБ (бит 2).
- Оба флага активны:
0b00010010= 0x12 - Только масло:
0b00010000= 0x10 - Только АКБ:
0b00000010= 0x02
08Структура CAN Setup в Link
Теперь — как вся теория из первой части превращается в реальные клики в CAN Setup. Link G4X — мощный, но слегка «программистский» ECU: у него много свободы и много мелких ловушек.
В Link G4X окно настройки CAN состоит из пяти вкладок:
| Вкладка | Что настраивается |
|---|---|
| Mode | Модуль (CAN 1 / CAN 2), битрейт, режим, OBD |
| Streams | Сами сигналы: стримы, кадры, параметры |
| Test Calculator | Отладочный калькулятор для проверки значений |
| CAN Devices | Готовые профили под известные устройства |
| Custom CAN File | Импорт/экспорт .lcs-файлов настроек |
Для энтузиаста главные вкладки — Mode и Streams. Почти всё будет происходить именно в них.
09Вкладка Mode — базовые настройки канала
| Поле | Значение | Пояснение |
|---|---|---|
| CAN Module | CAN 1 / CAN 2 | Физический канал на ECU. У старших Link их два. Один часто занят под заводскую шину или дашборд, второй оставляют под свои устройства. |
| Mode | User Defined | Ручной режим: ты сам прописываешь каждый сигнал. Альтернативы — готовые профили (Link Dash, AEM и т. д.). |
| Bit Rate | 1 Mbit / 500 kbit / 250 kbit | Скорость шины. Должна совпадать у всех устройств на шине. 1 Мбит — современный стандарт. |
| OBD | OFF / ISO 15765 | Включение OBD-II на этом канале. Для User Defined оставляем OFF: OBD и кастомные стримы на одной шине не живут. |
10Иерархия Stream → Frame → Parameter
Главная особенность Link, которую надо понять один раз и навсегда:
Stream → Frame → Parameter
- Stream — логический канал. Их в Link до 10 штук. Каждый стрим работает на приём (Receive) или на передачу (Transmit). Это контейнер.
- Frame — один CAN-кадр с конкретным CAN ID. Внутри стрима может быть несколько кадров. То, что раньше мы называли «CAN-сообщение».
- Parameter — один сигнал внутри кадра. Обороты, температура, флаг. У каждого параметра свои start, width, byte order, type, multiplier, divider, offset.
11Поля кадра (Frame)
| Поле | Пояснение |
|---|---|
| Frame Size | Длина кадра в байтах. Почти всегда 8 (максимум CAN 2.0). Лишние байты = нули, так что 8 можно ставить по умолчанию. |
| ID Position | Позиция байта-идентификатора для мультиплексированных кадров. None — обычный кадр. 0, 1, 2… — режим, где в байте 0/1/2 лежит номер подкадра. |
| ID (decimal) | CAN ID кадра в десятичном виде. Это важно: в даташитах почти всегда hex, а здесь надо вводить decimal. |
1552. Держи под рукой
калькулятор или пользуйся Test Calculator внутри самого CAN Setup.
12Колонки параметров
| Колонка | Что это по теории | Что писать |
|---|---|---|
| Parameter | Имя сигнала | Выбирается из внутреннего списка Link: реальный канал (Engine Speed, ECT, MAP) или «сырой» CAN An / CAN DI / CAN TC. |
| Start P | Start byte + bit offset в одном числе | Позиция старта сигнала в битах, сквозной счёт 0…63. Чтобы получить байт: start / 8. Бит внутри байта: start % 8. |
| Width | Bit length | Размер в битах: 1, 8, 16 (иногда 32). |
| Byte Order | Endian | LS First = little endian. MS First = big endian. |
| Type | Знаковое / беззнаковое | Unsigned — обычный беззнаковый. Signed — для значений, которые могут быть отрицательными без offset. |
| Multi | Множитель | Умножает сырое значение. Для передачи дробных величин через целые байты. |
| Divider | Делитель | Делит сырое значение. Часто 10 или 100 для точности 0.1 / 0.01. |
| Offset | Смещение значения | Вычитается из сырого. Для передачи знаковых величин через unsigned (классика — температуры с −50). |
13Start Position — Link считает в битах
Внизу вкладки Streams есть линейка 0…63 с разметкой байтов 0…7 — именно она и отражает эту шкалу. По ней очень удобно глазом проверять, какие биты уже заняты и нет ли пересечений.
Пересчёт
byte = start_position / 8 bit_in_byte = start_position % 8 start 0 → байт 0, бит 0 start 8 → байт 1, бит 0 start 16 → байт 2, бит 0 start 24 → байт 3, бит 0 start 32 → байт 4, бит 0 start 40 → байт 5, бит 0 start 48 → байт 6, бит 0 start 56 → байт 7, бит 0
Если даташит даёт «байт N, бит M», то в Link пиши: start = N × 8 + M.
14Ловушка LS First: «странные» старты 7, 23, 39, 55
Здесь — главное место, где новички плутают. Когда Byte Order = MS First, Start Position указывает на самый старший бит значения. Для 16-битного числа на границе байта это «круглые» числа: 0, 8, 16, 24, 32, 40, 48, 56.
Когда Byte Order = LS First, Start Position указывает на самый младший бит значения в первом по порядку байте. Для 16-битного числа это «нечётные» числа: 7, 23, 39, 55.
Запоминалка
8, 24, 40, 56 → это MS First, 16-битные значения7, 23, 39, 55 → это LS First, 16-битные значения56 с Width 8 → это 1-байтное значение в байте 715Формула пересчёта: Multi / Divider / Offset
Полная формула пересчёта сырого значения в физическое:
Physical = (Raw × Multi / Divider) − Offset
Примеры из реальных стримов
| Параметр | Multi | Div | Offset | Что получается |
|---|---|---|---|---|
| MAP | 10 | 1 | 0 | Raw 1053 → 105.3 кПа (точность 0.1) |
| ECT | 1 | 1 | 50 | Raw 90 → 40 °C, Raw 40 → −10 °C |
| CAN An давление | 1 | 100 | 0 | Raw 45823 → 458.23 кПа (точность 0.01) |
| Engine Speed | 1 | 1 | 0 | Raw 6500 → 6500 об/мин (как есть) |
Когда что использовать
- Multi — когда устройство передаёт целое число, а в реальности это десятичная дробь.
- Divider — обратная задача. Полученное сырое значение надо поделить. Часто 10 или 100.
- Offset — когда unsigned надо превратить в знаковое. Температура — классика.
16ID Position и мультиплексированные кадры
Иногда надо передать больше данных, чем влезает в 8 байт одного CAN-кадра. Решение: несколько кадров идут по шине с одним и тем же CAN ID, но первый байт хранит номер подкадра. Приёмник смотрит этот байт и понимает, какой «подкадр» пришёл.
В Link это и есть ID Position. Варианты:
- None — обычный кадр. Все 8 байт (биты 0…63) свободны под сигналы.
- 0 — в байте 0 лежит номер подкадра (0, 1, 2…). Полезных байт — 7.
- 1, 2, … — то же самое, но номер кладётся в байт 1, 2 и т. д.
Как это выглядит на практике
У стрима один CAN ID (например, 1000 = 0x3E8). Внутри стрима
создаём несколько Frame: Frame 1 с ID=0, Frame 2 с ID=1,
Frame 3 с ID=2. Link отправляет их по очереди, подставляя номер
в байт 0. Приёмник (например, приборка) раскладывает их обратно по содержимому.
17Пошаговая инструкция
Универсальный алгоритм для любого CAN-устройства, которое ты хочешь прицепить к Link G4X.
Открой даташит устройства
Найди разделы с описанием CAN-протокола. Выпиши: битрейт шины, CAN ID каждого кадра, для каждого сигнала — start byte, bit offset, длину, endian, формулу пересчёта.
Физически подключи устройство
CAN-H к CAN-H, CAN-L к CAN-L. Не забудь про терминаторы 120 Ом на концах шины (у Link обычно есть встроенный). Длинные шины — витая пара.
Настрой вкладку Mode
Выбери CAN Module. Mode = User Defined. Bit Rate — как в даташите устройства. OBD = OFF.
Создай Stream
В дереве слева выбери свободный Stream. В поле Mode выбери Receive User Stream или Transmit User Stream — в зависимости от того, слушаешь ты устройство или передаёшь ему.
Добавь Frame
Нажми Add Frame. Frame Size = 8. ID Position = None (для простых кадров). ID (decimal) — CAN ID из даташита, переведённый в десятичный.
Добавь Parameters
Для каждого сигнала нажми Add. Заполни: Parameter, Start P (N × 8 + M), Width, Byte Order, Type, Multi, Divider, Offset.
Проверь по линейке внизу
Посмотри на шкалу 0…63 внизу окна. Убедись, что параметры не пересекаются и нет «дырок» в неожиданных местах.
Apply и проверка в реальном времени
Нажми Apply. В руновом окне Link (F12) найди соответствующие каналы. Если числа странные — обычно endian, формула пересчёта или ID.
18Три типовых примера подключения
Спорт-приборка AiM / Racepak TX
Задача: передавать с Link на приборку обороты, MAP, давление масла и ECT.
Даташит приборки говорит: «жду кадр с ID 0x3E8, байт 0–1 — RPM (MS First),
байт 2–3 — MAP ×10, байт 4–5 — Oil Pressure ×10, байт 6 — ECT unsigned со смещением +50».
Настройки стрима
| Stream Mode | Transmit User Stream |
| Frame ID (dec) | 1000 (это 0x3E8 в hex) |
| Frame Size | 8 |
| ID Position | None |
| Transmit Rate | 50 Hz |
Параметры
| Parameter | Start P | Width | Byte Or | Type | Multi | Div | Offset |
|---|---|---|---|---|---|---|---|
| Engine Speed | 0 | 16 | MS First | Unsign | 1 | 1 | 0 |
| MAP | 16 | 16 | MS First | Unsign | 10 | 1 | 0 |
| Oil Pressure | 32 | 16 | MS First | Unsign | 10 | 1 | 0 |
| ECT | 48 | 8 | MS First | Unsign | 1 | 1 | 50 |
Модуль термопар на 4 канала RX
Задача: принять от внешнего модуля 4 температуры выхлопа.
Модуль передаёт кадр с ID 0x780, в каждом кадре 4 × 16-битных
значения температуры, LS First, без смещения, в °C.
Настройки стрима
| Stream Mode | Receive User Stream |
| Frame ID (dec) | 1920 (0x780) |
| Frame Size | 8 |
| ID Position | None |
Параметры
| Parameter | Start P | Width | Byte Or | Type | Multi | Div | Offset |
|---|---|---|---|---|---|---|---|
| CAN TC 1 | 7 | 16 | LS First | Unsign | 1 | 1 | 0 |
| CAN TC 2 | 23 | 16 | LS First | Unsign | 1 | 1 | 0 |
| CAN TC 3 | 39 | 16 | LS First | Unsign | 1 | 1 | 0 |
| CAN TC 4 | 55 | 16 | LS First | Unsign | 1 | 1 | 0 |
7, 23, 39, 55 — классическая подпись
LS First для 16-битных значений. Если в даташите сказано «LS First, байты
0–1 / 2–3 / 4–5 / 6–7», то в Link это именно такие цифры.
CAN-датчики давления RX
Задача: принять давления масла, топлива, наддува от внешнего CAN-модуля. Формат: 16-битные unsigned значения, LS First, точность 0.01 кПа (Raw делится на 100).
Параметры
| Parameter | Start P | Width | Byte Or | Type | Multi | Div | Offset |
|---|---|---|---|---|---|---|---|
| CAN An 1 — Oil Press | 7 | 16 | LS First | Unsign | 1 | 100 | 0 |
| CAN An 2 — Fuel Press | 23 | 16 | LS First | Unsign | 1 | 100 | 0 |
| CAN An 3 — Boost | 39 | 16 | LS First | Unsign | 1 | 100 | 0 |
19Отладка: что делать, если не работает
20Итоговый чек-лист
Перед тем как нажать Apply, пробегись по пунктам: