Интерфейс LIN. Полный обзор и описание стандарта.

Совсем недавно мы разбирали протокол CAN, и вот сегодня продолжаем двигаться по автомобильным стандартам! На очереди интерфейс LIN, который также свое основное применение нашел в автомобильной промышленности, да и, в общем-то, для этого и был изначально создан 🙂

Чуть забегу вперед – этому интерфейсу будет посвящено целых три статьи. Сегодня будет исключительно теория, максимально подробно и наглядно. Во второй части мы будем работать с LIN на практике при помощи STM32 с использованием аппаратных средств микроконтроллера. А вот в третьей части мы с нуля напишем свой собственный драйвер для LIN на базе UART.

А пока к теории!

Итак, стандарт LIN был создан в конце 90-х годов (первая версия спецификации относится к 1999 году) группой известных компаний, в основном, автопроизводителей. Среди них:

  • Audi
  • Volkswagen
  • BMW
  • Volvo
  • Motorola

В целом архитектура шины выглядит следующим образом:

Архитектура сети LIN.

В чем же смысл, спросите вы, ведь есть же CAN? Так вот, использование интерфейса LIN не исключает использование CAN, а скорее дополняет. LIN является однопроводной шиной, более дешевой, чем CAN, и используется для связи менее критичных для безопасности и для работы автомобиля узлов между собой. То есть основная связь по-прежнему обеспечивается протоколом CAN, а менее важные блоки и датчики уже подключаются по LIN:

Использование интерфейса LIN.

Низкая стоимость обеспечивается в том числе тем, что для реализации протокола обычно используется обычный UART микроконтроллера. Все остальное, необходимое для работы шины, реализуется исключительно в ПО. Но это с программной точки зрения. Физически же все-таки требуется использование дополнительной микросхемы трансивера. И самый популярный кандидат бесспорно – TJA1021:

LIN трансивер TJA1021.

Скорость передачи данных также вполне стандартная для UART’а: от 1 – до 20 кБод, длина линии может достигать 40 м. Давайте теперь перейдем к самому интересному, к структуре пакета в LIN!

Структура пакета интерфейса LIN.

Каждый пакет состоит из заголовка (header) и непосредственно данных (data):

Интерфейс LIN, структура пакета.

Причем важной особенностью интерфейса является то, что на шине присутствуют два типа устройств – LIN Master (ведущий) и LIN Slave (подчиненный). При этом инициировать передачу данных может только Master. То есть Slave-устройство не может само по себе выслать в сеть данные, оно должно ожидать запроса от ведущего и никак иначе 🙂

Таким образом, именно Master отправляет в шину заголовки пакетов. В зависимости от определенного бита заголовка (это мы разберем чуть позже) подчиненные устройства понимают, что им требуется сделать:

  • выслать данные, которые запрашивает ведущий
  • или продолжать прием данных, в случае если, например, Master выполняет конфигурацию подчиненного
Передача данных.

Как видите, иерархия очень строгая!

С организацией обмена данными разобрались, теперь можно углубиться непосредственно в структуру уже упомянутых частей LIN-фреймов. Заголовок пакета состоит из нескольких байт:

Заголовок пакета.
  • Поле Break – это поле представляет из себя 13 нулевых битов подряд.
  • Поле Sync – поле синхронизации. Этот байт имеет определенное значение – 0x55. Именно это число выбрано по той причине, что в двоичном виде оно представляет из себя чередующиеся нули и единицы – 0b01010101. При помощи этого поля устройства могут настроить свою скорость передачи данных.
  • Поле PID – поле идентификатора. В нем зашифровано следующее:
Идентификатор LIN.

Старт и стоп-биты здесь играют ту же роль, что и при передаче данных по UART, и используются для каждого из передаваемых по LIN байт.

Из битов ID0…ID5 складывается непосредственно значение идентификатора. А поскольку под это выделено только 6 битов, то значит диапазон значений идентификатора составляет от 0 до 0x3F (0b111111). При этом значения от 0x3C до 0x3F являются служебными. Кроме того, в значении идентификатора содержится информация о количестве передаваемых в Frame Data байт:

Идентификатор Кол-во байт
0x00-0x1F 2
0x20-0x2F 4
0x30-0x3F 8

Итак, тут у нас остаются еще два бита четности, для них формула выглядит следующим образом:

P0 = ID0 \oplus ID1 \oplus ID2 \oplus ID4
P1 = \medspace!(ID1 \oplus ID3 \oplus ID4 \oplus ID5)

И на этом все! Заголовок пакета сформирован.

Поле данных в свою очередь состоит из непосредственно байт данных (от 1-го до 8-ми байт) и контрольной суммы (1 байт):

Поле данных интерфейса LIN.

Для расчета контрольной суммы есть два варианта:

  • Классическая контрольная сумма (версия LIN1.x) – сумма всех байт данных из поля Frame Data с переносом. После суммирования полученный байт инвертируется.
  • Расширенная контрольная сумма (версия LIN2.x) – используется такой же алгоритм, только в суммировании участвует еще и байт PID. Сообщения с заголовками 0x3C и 0x3D должны использовать классическую контрольную сумму.

Давайте рассмотрим пример расчета классической контрольной суммы. Пусть байты данных равны: 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37. Суммируем:

0x30 + 0x31 + 0x32 + 0x33 + 0x34 + 0x35 + 0x36 + 0x37 = 0x19C

Вычитаем из полученного значения 0xFF:

0x19C – 0xFF = 0x9D

И инвертируем, в итоге получаем:

!(0x9D) = 0x62

Для выбранных нами байт данных контрольная сумма равна 0x62.

В практической статье по интерфейсу LIN мы обязательно посмотрим, как все это будет выглядеть на деле, а пока на этом заканчиваем, до скорой встречи!

Поделиться!

Подписаться
Уведомление о
guest
1 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Гай
Гай
3 месяцев назад

Спасибо

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Ноябрь 2020
Пн Вт Ср Чт Пт Сб Вс
 1
2345678
9101112131415
16171819202122
23242526272829
30  

© 2013-2020 MicroTechnics.ru