LIN — однопроводная шина для недорогих мехатронных узлов автомобиля: датчиков, кнопок, исполнительных механизмов. Каждый обмен — кадр: ведущий узел передаёт заголовок с идентификатором, а один из узлов отвечает данными и контрольной суммой. Инструмент собирает такой кадр по спецификации LIN 2.2A или проверяет байты, снятые с шины.
Коротко
- Заголовок: break не короче 13 бит в доминантном уровне, разделитель, байт sync 0x55 и защищённый идентификатор PID.
- PID: 6 бит ID и два бита чётности: P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4, P1 = ¬(ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5).
- Ответ: от 1 до 8 байт данных и контрольная сумма.
- Контрольная сумма: инвертированная сумма с переносом; классическая — по данным, расширенная — по PID и данным.
- Время: 34 бита заголовка и 10 бит на байт ответа; слот в расписании — 1,4 номинального времени.
Как пользоваться
В режиме «Собрать кадр» введите идентификатор от 00 до 3F в шестнадцатеричном виде и от 1 до 8 байт данных. Выберите контрольную сумму: расширенная — для узлов LIN 2.x, классическая — для LIN 1.x. Результат — байты кадра после break в том порядке, в каком они идут по шине, PID с битами чётности, контрольная сумма и время заголовка, ответа и всего кадра на выбранной скорости. Ниже — кадр по битам и таблица сложения с переносом.
Режим «Проверить байты» разбирает кадр, снятый логическим анализатором: введите PID, данные и контрольную сумму, байт sync 0x55 в начале можно оставить. Инструмент проверит биты чётности PID и скажет, с какой суммой совпала последняя: расширенной, классической или ни с одной. Все параметры хранятся в адресе страницы — ссылкой можно поделиться.
Как устроен кадр
Кадр делится на заголовок, который всегда передаёт ведущий, и ответ, который передаёт один узел — издатель этого идентификатора. Им может быть ведомый или сам ведущий. Все поля, кроме break, — обычные байты UART: старт-бит 0, восемь бит данных младшим вперёд и стоп-бит 1. Логический 0 на шине — доминантный уровень, близкий к земле, логическая 1 — рецессивный, близкий к напряжению питания.
| Поле | Длина | Кто передаёт | Что в нём |
|---|---|---|---|
| Break | не меньше 13 бит | ведущий | доминантный уровень: начало кадра |
| Разделитель break | не меньше 1 бита | ведущий | рецессивный уровень |
| Sync | 10 бит | ведущий | 0x55: по фронтам ведомый подстраивает скорость |
| PID | 10 бит | ведущий | ID 0–63 и два бита чётности |
| Данные | 10 бит на байт, 1–8 байт | издатель кадра | значения сигналов; многобайтные — младшим байтом вперёд |
| Контрольная сумма | 10 бит | издатель кадра | инвертированная сумма с переносом |
Идентификаторы 0x00–0x3B несут сигналы, 0x3C (запрос ведущего) и 0x3D (ответ ведомого) — диагностику и настройку узлов, 0x3E и 0x3F зарезервированы.
Защищённый идентификатор
Шесть бит идентификатора дополняются двумя битами чётности, и получается байт PID:
— в разряде 6, — в разряде 7. Для ID 0x10 = 01 0000₂ бит , остальные нули: , , и PID = 0x50. Каждый бит идентификатора входит хотя бы в одно уравнение, поэтому ошибка в любом одном бите PID меняет чётность и обнаруживается. PID всех 64 идентификаторов (таблица 2.4 спецификации):
| ID | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 |
|---|---|---|---|---|---|---|---|---|
| 00 | 80 | C1 | 42 | 03 | C4 | 85 | 06 | 47 |
| 08 | 08 | 49 | CA | 8B | 4C | 0D | 8E | CF |
| 10 | 50 | 11 | 92 | D3 | 14 | 55 | D6 | 97 |
| 18 | D8 | 99 | 1A | 5B | 9C | DD | 5E | 1F |
| 20 | 20 | 61 | E2 | A3 | 64 | 25 | A6 | E7 |
| 28 | A8 | E9 | 6A | 2B | EC | AD | 2E | 6F |
| 30 | F0 | B1 | 32 | 73 | B4 | F5 | 76 | 37 |
| 38 | 78 | 39 | BA | FB | 3C | 7D | FE | BF |
Строка — старшие разряды ID, столбец — прибавка к ним: ID 0x3C — строка 38, столбец +4, PID 0x3C.
Контрольная сумма
Контрольная сумма — инвертированная восьмибитная сумма с переносом. Байты складываются по очереди, и всякий раз, когда сумма превышает 255, из неё вычитают 255: перенос из старшего разряда возвращается в младший. Классическая сумма считается только по данным, расширенная начинает с PID.
Пример из таблицы 2.5 спецификации — данные 4A 55 93 E5, классическая сумма:
| Шаг | Сумма | Перенос |
|---|---|---|
| 0x4A | 0x4A | — |
| + 0x55 | 0x9F | — |
| + 0x93 = 0x132 | 0x33 | вычли 0xFF |
| + 0xE5 = 0x118 | 0x19 | вычли 0xFF |
| инверсия | 0xE6 | контрольная сумма |
С расширенной суммой и PID 0x50 сложение начинается с 0x50: 0x9A, 0xEF, 0x83, 0x69, после инверсии — 0x96. Приёмник проверяет кадр тем же сложением: промежуточная сумма плюс принятая контрольная должна дать 0xFF, здесь 0x19 + 0xE6 = 0xFF.
Модель суммы задаёт ведущий узел для каждого идентификатора: классическая — для узлов LIN 1.x, расширенная — для LIN 2.x. Диагностические кадры 0x3C и 0x3D всегда считаются по классической модели — даже в сети из узлов LIN 2.x.
Время кадра
Номинальное время кадра — это его биты без пауз между байтами: break занимает 13 бит, разделитель — 1, каждый из байтов — 10.
где — число байт данных. Паузы между байтами могут удлинить и заголовок, и ответ на 40 %, поэтому слот кадра в расписании ведущего должен быть не меньше . Кадр с 4 байтами на 19 200 бит/с — 84 бита: 4,375 мс номинально и до 6,125 мс с паузами.
| Байт данных | Бит в кадре | 19 200 бит/с | 10 400 бит/с | 9 600 бит/с |
|---|---|---|---|---|
| 1 | 54 | 2,81 мсдо 3,94 мс | 5,19 мсдо 7,27 мс | 5,63 мсдо 7,88 мс |
| 2 | 64 | 3,33 мсдо 4,67 мс | 6,15 мсдо 8,62 мс | 6,67 мсдо 9,33 мс |
| 3 | 74 | 3,85 мсдо 5,4 мс | 7,12 мсдо 9,96 мс | 7,71 мсдо 10,8 мс |
| 4 | 84 | 4,38 мсдо 6,13 мс | 8,08 мсдо 11,3 мс | 8,75 мсдо 12,3 мс |
| 5 | 94 | 4,9 мсдо 6,85 мс | 9,04 мсдо 12,7 мс | 9,79 мсдо 13,7 мс |
| 6 | 104 | 5,42 мсдо 7,58 мс | 10 мсдо 14 мс | 10,8 мсдо 15,2 мс |
| 7 | 114 | 5,94 мсдо 8,31 мс | 11 мсдо 15,3 мс | 11,9 мсдо 16,6 мс |
| 8 | 124 | 6,46 мсдо 9,04 мс | 11,9 мсдо 16,7 мс | 12,9 мсдо 18,1 мс |
Скорость шины LIN — от 1 до 20 кбит/с. В примере описания сети из спецификации — 19,2 кбит/с, а для скоростей 10,4 кбит/с и ниже спецификация задаёт драйверу отдельные нормы скважности (таблица 6.9) ради меньших помех.
Ограничения
- Байты считаются без пауз между ними: реальный кадр с анализатора может быть длиннее номинального.
- Классическую сумму с PID и расширенную без PID спецификация не определяет — их нет и здесь.
- Кадры по событию (event triggered) и спорадические кадры, расписания, диагностика по транспортному протоколу и переход в сон не моделируются.
- Длина break считается минимальной, 13 бит. Ведущие часто формируют его длиннее — это не ошибка.
Частые вопросы
Как посчитать PID в LIN?
Защищённый идентификатор — это 6-битный ID в разрядах 0–5 и два бита чётности: P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4 в разряде 6 и P1 = ¬(ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5) в разряде 7. Для ID 0x10 получается P0 = 1, P1 = 0 и PID 0x50, для ID 0x3C — 0x3C, для ID 0x01 — 0xC1. Все 64 значения сведены в таблицу 2.4 спецификации LIN 2.2A и в таблицу на этой странице.
Чем классическая контрольная сумма LIN отличается от расширенной?
Обе — инвертированная восьмибитная сумма с переносом. Классическая (LIN 1.x) считается только по байтам данных, расширенная (LIN 2.x) — по PID и байтам данных. Для данных 4A 55 93 E5 классическая сумма — 0xE6, расширенная с PID 0x50 — 0x96. Какую сумму использовать, задаёт ведущий узел для каждого идентификатора; диагностические кадры 0x3C и 0x3D всегда используют классическую.
Что значит сумма с переносом?
Байты складываются, и каждый раз, когда сумма становится больше 255, из неё вычитают 255 — это то же, что прибавить перенос из восьмого разряда обратно к младшему. Например, 0x9F + 0x93 = 0x132, после переноса 0x33. В конце сумму инвертируют. Приёмник проверяет кадр той же операцией: сумма принятых байтов вместе с контрольной должна дать 0xFF.
Сколько длится кадр LIN?
Номинально заголовок занимает 34 бита (break 13, разделитель 1, sync и PID по 10), ответ — 10 бит на каждый байт данных и на контрольную сумму. Кадр с 8 байтами — 124 бита, на 19 200 бит/с это 6,46 мс. Паузы между байтами могут удлинить кадр на 40 %, поэтому слот в расписании должен быть не короче 1,4 номинального времени: для того же кадра — 9,04 мс.
Зачем в LIN break длиной 13 бит?
Обычный байт на шине не может держать доминантный уровень дольше 9 бит подряд: старт-бит и восемь нулей, а затем обязательно рецессивный стоп-бит. Break из 13 доминантных битов отличается от любого байта, и ведомый узнаёт начало кадра даже с неточным генератором: спецификация требует порог обнаружения 11 своих битов, а узлам с кварцем или керамическим резонатором разрешает 9,5 номинальных.
Для чего нужен байт sync 0x55?
В байте 0x55 вместе со старт- и стоп-битом уровни чередуются через каждый бит. По фронтам ведомый измеряет длительность бита и подстраивает свою скорость под ведущего. Поэтому ведомые узлы LIN могут работать от RC-генератора без кварца: до синхронизации частота ведомого может отличаться от номинальной до 14 %, после неё — не больше чем на 2 % от частоты ведущего.
Источники
- LIN Consortium. LIN Specification Package, Revision 2.2A, 31 December 2010 — протокол: разд. 2.3.1 и рис. 2.3–2.5 — структура кадра, break не короче 13 бит и разделитель не короче 1 бита, порог обнаружения break у ведомого 11 бит; 2.3.1.2 — байт sync 0x55; 2.3.1.3 — защищённый идентификатор и уравнения чётности; 2.3.1.4 — от 1 до 8 байт данных; 2.3.1.5 — классическая и расширенная контрольная сумма, ID 0x3C и 0x3D — всегда классическая; 2.3.2 — формулы длины кадра (3)–(8); 2.8.2–2.8.3, табл. 2.4 и 2.5 — все 64 PID и пример суммы; физический уровень: разд. 6.3 — скорости от 1 до 20 кбит/с и допуски
- sigrok project. sigrok-test: decoder/test/lin — расшифровки сгенерированных кадров LIN 2 на 19 200 бит/с: ID 0x01 с данными 11 11 — контрольная сумма 0x1C, ID 0x23 с данными 11 22 — 0x29; по ним проверены PID и расширенная сумма
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/lin-frame/" title="Кадр LIN по байтам" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/lin-frame/">Кадр LIN по байтам</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено . Нашли ошибку в расчёте? Напишите нам.