Перейти к содержанию

Кадр LIN по байтам

Введите идентификатор и байты данных — инструмент посчитает PID и контрольную сумму по спецификации LIN 2.2A, разложит кадр на поля и биты, покажет сложение с переносом шаг за шагом и время кадра на выбранной скорости. Второй режим проверяет байты, снятые анализатором с шины.

Исходные данные

Режим
HEX

6 бит: от 00 до 3F; 3C и 3D — диагностические кадры

4A 55 93 E5, 0x4A,0x55 или 4A5593E5

Контрольная сумма

Результат

Байты после break
55 50 4A 55 93 E5 96
sync, PID, данные, контрольная сумма
Защищённый идентификатор (PID)
0x50P1 = 0, P0 = 1, ID = 010000 — кадр сигналов (обычные данные)
Контрольная сумма, расширенная
0x96по PID и данным
Заголовок
1,771 мс34 бита; с допуском 40 % — до 2,479 мс
Ответ
2,604 мс50 бит; до 3,646 мс
Кадр
4,375 мсслот в расписании — не меньше 6,125 мс

Кадр на шине

Break — не меньше 13 бит в доминантном (низком) уровне, затем разделитель и байтовые поля: старт-бит, 8 бит данных младшим вперёд, стоп-бит.

Кадр LIN: 55 50 4A 55 93 E5 960000000000000Break13 бит1Разд.1 бит0101010101Sync0x550000010101PID0x500010100101Данные 10x4A0101010101Данные 20x550110010011Данные 30x930101001111Данные 40xE50011010011Контр. сумма0x96
БайтСуммаПеренос
0x500x50—
0x4A0x9A—
0x550xEF—
0x930x83был: вычли 0xFF
0xE50x69был: вычли 0xFF
инверсия0x96контрольная сумма

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 — рецессивный, близкий к напряжению питания.

Кадр LIN с ID 0x10: break, sync 0x55, PID 0x50, данные 4A 55 93 E5, контрольная сумма 0x960000000000000Break13 бит1Разд.1 бит0101010101Sync0x550000010101PID0x500010100101Данные 10x4A0101010101Данные 20x550110010011Данные 30x930101001111Данные 40xE50011010011Контр. сумма0x96
Кадр с ID 0x10 и данными 4A 55 93 E5: break из 13 доминантных битов, разделитель, sync 0x55, PID 0x50, четыре байта данных и расширенная контрольная сумма 0x96. Под каждым полем — его биты в порядке передачи.
ПолеДлинаКто передаётЧто в нём
Breakне меньше 13 битведущийдоминантный уровень: начало кадра
Разделитель breakне меньше 1 битаведущийрецессивный уровень
Sync10 битведущий0x55: по фронтам ведомый подстраивает скорость
PID10 битведущийID 0–63 и два бита чётности
Данные10 бит на байт, 1–8 байтиздатель кадразначения сигналов; многобайтные — младшим байтом вперёд
Контрольная сумма10 битиздатель кадраинвертированная сумма с переносом

Идентификаторы 0x00–0x3B несут сигналы, 0x3C (запрос ведущего) и 0x3D (ответ ведомого) — диагностику и настройку узлов, 0x3E и 0x3F зарезервированы.

Защищённый идентификатор

Шесть бит идентификатора дополняются двумя битами чётности, и получается байт PID:

P0=ID0⊕ID1⊕ID2⊕ID4,P1=ID1⊕ID3⊕ID4⊕ID5‾,P_0 = ID_0 \oplus ID_1 \oplus ID_2 \oplus ID_4, \qquad P_1 = \overline{ID_1 \oplus ID_3 \oplus ID_4 \oplus ID_5},

P0P_0 — в разряде 6, P1P_1 — в разряде 7. Для ID 0x10 = 01 0000₂ бит ID4=1ID_4 = 1, остальные нули: P0=1P_0 = 1, P1=1‾=0P_1 = \overline{1} = 0, и PID = 0x50. Каждый бит идентификатора входит хотя бы в одно уравнение, поэтому ошибка в любом одном бите PID меняет чётность и обнаруживается. PID всех 64 идентификаторов (таблица 2.4 спецификации):

ID+0+1+2+3+4+5+6+7
0080C14203C4850647
080849CA8B4C0D8ECF
10501192D31455D697
18D8991A5B9CDD5E1F
202061E2A36425A6E7
28A8E96A2BECAD2E6F
30F0B13273B4F57637
387839BAFB3C7DFEBF

Строка — старшие разряды ID, столбец — прибавка к ним: ID 0x3C — строка 38, столбец +4, PID 0x3C.

Контрольная сумма

Контрольная сумма — инвертированная восьмибитная сумма с переносом. Байты складываются по очереди, и всякий раз, когда сумма превышает 255, из неё вычитают 255: перенос из старшего разряда возвращается в младший. Классическая сумма считается только по данным, расширенная начинает с PID.

Пример из таблицы 2.5 спецификации — данные 4A 55 93 E5, классическая сумма:

ШагСуммаПеренос
0x4A0x4A—
+ 0x550x9F—
+ 0x93 = 0x1320x33вычли 0xFF
+ 0xE5 = 0x1180x19вычли 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.

Tзаг=34 Tбит,Tотв=10 (N+1) Tбит,Tкадр,max=1,4 (Tзаг+Tотв),T_\text{заг} = 34\,T_\text{бит}, \qquad T_\text{отв} = 10\,(N + 1)\,T_\text{бит}, \qquad T_\text{кадр,max} = 1{,}4\,(T_\text{заг} + T_\text{отв}),

где NN — число байт данных. Паузы между байтами могут удлинить и заголовок, и ответ на 40 %, поэтому слот кадра в расписании ведущего должен быть не меньше Tкадр,maxT_\text{кадр,max}. Кадр с 4 байтами на 19 200 бит/с — 84 бита: 4,375 мс номинально и до 6,125 мс с паузами.

Байт данныхБит в кадре19 200 бит/с10 400 бит/с9 600 бит/с
1542,81 мсдо 3,94 мс5,19 мсдо 7,27 мс5,63 мсдо 7,88 мс
2643,33 мсдо 4,67 мс6,15 мсдо 8,62 мс6,67 мсдо 9,33 мс
3743,85 мсдо 5,4 мс7,12 мсдо 9,96 мс7,71 мсдо 10,8 мс
4844,38 мсдо 6,13 мс8,08 мсдо 11,3 мс8,75 мсдо 12,3 мс
5944,9 мсдо 6,85 мс9,04 мсдо 12,7 мс9,79 мсдо 13,7 мс
61045,42 мсдо 7,58 мс10 мсдо 14 мс10,8 мсдо 15,2 мс
71145,94 мсдо 8,31 мс11 мсдо 15,3 мс11,9 мсдо 16,6 мс
81246,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 % от частоты ведущего.

Источники

  1. 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 кбит/с и допуски
  2. 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>

Обновлено . Нашли ошибку в расчёте? Напишите нам.