Технический документ · Tuning guide

CAN-шина:
от теории к практике в Link G4X

Подробное руководство для энтузиастов, которые хотят подключать CAN-устройства к своему ECU самостоятельно — без «священных танцев», глядя в даташит и понимая, что именно они настраивают.

Платформа
Link G4X
Протокол
CAN 2.0A/B
Уровень
Beginner → Pro
Разделов
20

01Из чего состоит CAN-сообщение

Типовое CAN-сообщение выглядит так:

27A  4  A1 24 DD FF

27A — идентификатор сообщения (ID, в hex). 4 — длина данных (DLC, от 0 до 8). Далее идут сами данные: A1 24 DD FF. Четыре байта, каждый по 8 бит.

Структура
ID27A
DLC4
Байт 0A1
Байт 124
Байт 2DD
Байт 3FF
Нумерация байтов. В софте ECU байты нумеруют слева направо. Программисты считают с 0 (Байт 0, Байт 1…), «обычные» люди с 1. Оба варианта встречаются в документации — всегда уточняй, с какого индекса стартует твой инструмент. Link G4X начинает с 0.

02Hex и двоичная запись

Шестнадцатеричная (0x..) и двоичная (0b..) запись — это одно и то же число в разных системах счисления. Полезно помнить «степени двойки» — они соответствуют отдельным битам внутри байта:

HexBinaryКакой бит установлен
0x000b00000000
0x010b00000001бит 0
0x020b00000010бит 1
0x040b00000100бит 2
0x080b00001000бит 3
0x100b00010000бит 4
0x200b00100000бит 5
0x400b01000000бит 6
0x800b10000000бит 7

Биты внутри байта нумеруются справа налево (младший — справа):

7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0

03Размерность: сколько бит занимает число

Объём, который нужен числу, выбирается по максимальному значению, которое надо передать. В CAN реально используются три размера: 1, 8 и 16 бит.

Размер Диапазон (unsigned) Hex Применение
1 бит0 … 1Флаги: вкл/выкл, аварийные индикаторы
8 бит0 … 2550xXXТемпературы, проценты, уровни
16 бит0 … 65 5350xXXXXОбороты, скорость, давление

Примеры из жизни

Хитрый пример: в УАЗ тахометр передаётся в 1 байте, но вес бита = 40 оборотов. Так 1 байт покрывает диапазон 0–10200 об/мин — просто дискретнее. На глаз разница незаметна.

04Порядок байтов (endian)

Как только число занимает больше одного байта, появляется вопрос: какой байт идёт в шину первым — старший или младший. Это и есть byte order, он же endian.

Пример: число 10000 = 0x2710. Это два байта: 0x27 (старший) и 0x10 (младший).

ПорядокКак идёт в потокеОбозначение в Link
Big endian0x27 0x10 (старший первый)MS First
Little endian0x10 0x27 (младший первый)LS First
В OEM-шинах японцы чаще используют MS First, в европейских стандартах и у большинства спорт-приборок — LS First. Всегда смотри даташит устройства.

05Offset: смещение значения

Байт в CAN по умолчанию беззнаковый (0…255). Но передавать часто нужно знаковые величины — например, температуру от −40 до +215. Тогда к «сырому» значению прибавляют offset.

Температура = сырой_байт − 40

сырой_байт  0   →  −40 °C
сырой_байт  40  →    0 °C
сырой_байт 130  →  +90 °C
Не путай offset значения (сдвиг по шкале числа) и bit offset (сдвиг бита внутри байта). Слово одно — смысл разный.

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 byte33
Bit length1 бит1 бит
Bit offset4 (бит 5 − 1)1 (бит 2 − 1)

Как это выглядит в байте

8
7
6
5
4
3
2
1
0
0
0
М
0
0
А
0

Где М — флаг масла (бит 5), А — флаг АКБ (бит 2).

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 и кастомные стримы на одной шине не живут.
Правило №1: битрейт у всех устройств на одной шине должен быть одинаковым. Несовпадение — самая частая причина «ничего не работает». Перед подключением нового устройства первым делом сверь в его даташите.

10Иерархия Stream → Frame → Parameter

Главная особенность Link, которую надо понять один раз и навсегда:

StreamFrameParameter
Проще говоря: один Stream = одно устройство или одна группа связанных кадров; один Frame = один CAN ID; внутри Frame лежат конкретные параметры.

11Поля кадра (Frame)

ПолеПояснение
Frame Size Длина кадра в байтах. Почти всегда 8 (максимум CAN 2.0). Лишние байты = нули, так что 8 можно ставить по умолчанию.
ID Position Позиция байта-идентификатора для мультиплексированных кадров. None — обычный кадр. 0, 1, 2… — режим, где в байте 0/1/2 лежит номер подкадра.
ID (decimal) CAN ID кадра в десятичном виде. Это важно: в даташитах почти всегда hex, а здесь надо вводить decimal.
Ловушка №1 — ID в десятичном виде. Если в даташите написано «ID = 0x610», в Link надо ввести 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 считает в битах

Самое главное отличие Link от большинства других ECU. В Haltech или HP Tuners ты пишешь «байт 3, бит 2». В Link есть только одно число: Start Position в битах, сквозная шкала 0…63.

Внизу вкладки 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.

Запоминалка

Видишь Start P 8, 24, 40, 56  →  это MS First, 16-битные значения
Видишь Start P 7, 23, 39, 55  →  это LS First, 16-битные значения
Видишь Start P 56 с Width 8  →  это 1-байтное значение в байте 7
Практика: если ты копируешь настройки из даташита устройства и видишь в Link «неправильные» цифры — скорее всего просто перепутаны endian. Поменяй Byte Order и пересчитай старт.

15Формула пересчёта: Multi / Divider / Offset

Полная формула пересчёта сырого значения в физическое:

Physical = (Raw × Multi / Divider) − Offset

Примеры из реальных стримов

ПараметрMultiDivOffsetЧто получается
MAP1010Raw 1053 → 105.3 кПа (точность 0.1)
ECT1150Raw 90 → 40 °C, Raw 40 → −10 °C
CAN An давление11000Raw 45823 → 458.23 кПа (точность 0.01)
Engine Speed110Raw 6500 → 6500 об/мин (как есть)

Когда что использовать

16ID Position и мультиплексированные кадры

Иногда надо передать больше данных, чем влезает в 8 байт одного CAN-кадра. Решение: несколько кадров идут по шине с одним и тем же CAN ID, но первый байт хранит номер подкадра. Приёмник смотрит этот байт и понимает, какой «подкадр» пришёл.

В Link это и есть ID Position. Варианты:

Как это выглядит на практике

У стрима один CAN ID (например, 1000 = 0x3E8). Внутри стрима создаём несколько Frame: Frame 1 с ID=0, Frame 2 с ID=1, Frame 3 с ID=2. Link отправляет их по очереди, подставляя номер в байт 0. Приёмник (например, приборка) раскладывает их обратно по содержимому.

Это часто встречается в OEM-шинах (BMW, Porsche) и в протоколах типа AEMnet. Если даташит устройства описывает несколько «пакетов» с одним ID — это оно.

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Три типовых примера подключения

Example 01 // Dashboard TRANSMIT

Спорт-приборка 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 ModeTransmit User Stream
Frame ID (dec)1000 (это 0x3E8 в hex)
Frame Size8
ID PositionNone
Transmit Rate50 Hz

Параметры

ParameterStart PWidthByte OrTypeMultiDivOffset
Engine Speed016MS FirstUnsign110
MAP1616MS FirstUnsign1010
Oil Pressure3216MS FirstUnsign1010
ECT488MS FirstUnsign1150
Раскладка по байтам: 0–1 RPM, 2–3 MAP, 4–5 Oil Pressure, 6 ECT, 7 свободен. MAP с Multi=10 означает, что 105.3 кПа уйдёт в шину как 1053 — приборка сама поделит обратно.
Example 02 // Thermocouple module RECEIVE

Модуль термопар на 4 канала RX

Задача: принять от внешнего модуля 4 температуры выхлопа. Модуль передаёт кадр с ID 0x780, в каждом кадре 4 × 16-битных значения температуры, LS First, без смещения, в °C.

Настройки стрима

Stream ModeReceive User Stream
Frame ID (dec)1920 (0x780)
Frame Size8
ID PositionNone

Параметры

ParameterStart PWidthByte OrTypeMultiDivOffset
CAN TC 1716LS FirstUnsign110
CAN TC 22316LS FirstUnsign110
CAN TC 33916LS FirstUnsign110
CAN TC 45516LS FirstUnsign110
Обрати внимание: старты 7, 23, 39, 55 — классическая подпись LS First для 16-битных значений. Если в даташите сказано «LS First, байты 0–1 / 2–3 / 4–5 / 6–7», то в Link это именно такие цифры.
Example 03 // Pressure sensors RECEIVE

CAN-датчики давления RX

Задача: принять давления масла, топлива, наддува от внешнего CAN-модуля. Формат: 16-битные unsigned значения, LS First, точность 0.01 кПа (Raw делится на 100).

Параметры

ParameterStart PWidthByte OrTypeMultiDivOffset
CAN An 1 — Oil Press716LS FirstUnsign11000
CAN An 2 — Fuel Press2316LS FirstUnsign11000
CAN An 3 — Boost3916LS FirstUnsign11000
Divider=100 даёт точность 0.01. Если модуль передал 45823, в рантайме получим 458.23 кПа. Дальше CAN An 1…3 привязываются к логическим функциям Oil Pressure, Fuel Pressure, Boost Pressure в настройках аналоговых входов Link.

19Отладка: что делать, если не работает

▸ Значение всегда 0
Проверь ID кадра (в Link decimal, в даташите hex), битрейт шины, проводку и терминаторы.
▸ Значение скачет нереально или стоит на огромном числе
Почти всегда перепутан endian. Поменяй Byte Order с LS First на MS First (или наоборот) и пересчитай Start P.
▸ Значение в 10 или 100 раз больше / меньше реального
Не настроен Multiplier или Divider. Читай даташит на точность передачи.
▸ Температура −50 °C при прогретом моторе
Забыт Offset (обычно 50).
▸ Значение отрицательное при unsigned
Попробуй Type = Signed или добавь Offset.
▸ Значения плавают и «звенят»
Проверь проводку, экранирование, терминаторы 120 Ом на концах шины.
▸ Стрим не передаётся
Проверь, что Stream Mode = Transmit (а не Receive) и задан Transmit Rate.
▸ Всё работает, но иногда пропадает
Шина перегружена. Снизь частоту передачи или уменьши количество кадров.

20Итоговый чек-лист

Перед тем как нажать Apply, пробегись по пунктам:

Битрейт шины совпадает у всех устройств на шине.
CAN ID переведён в десятичный и введён в поле ID (decimal).
Frame Size = 8 (если нет веских причин для другого).
ID Position = None (если нет мультиплексирования).
Для каждого параметра: правильно выбран Parameter.
Start P пересчитан по формуле N × 8 + M (с поправкой на endian).
Width соответствует размеру в даташите (1, 8, 16).
Byte Order совпадает с даташитом (LS First / MS First).
Type: Unsigned для обычных, Signed для знаковых без offset.
Multi / Divider настроены по формуле пересчёта.
Offset настроен, если надо сдвинуть шкалу (температуры).
По линейке 0–63 нет пересечений параметров.
После Apply значения в рантайме Link выглядят осмысленно.