AVR308
 

Программа подчиненного устройства LIN

Отличительные особенности:

  • Низкая стоимость, не требуются внешние компоненты
  • Совместимость с LIN протоколом версии 1.0
  • Эффективный размером кода

Введение

В данном примере применения описано как реализовать подчиненную LIN (локальная коммутационная сеть) задачу на 8 разрядном AVR RISC микроконтроллере без всяких внешних компонентов.

Протокол LIN - последовательный коммуникационный протокол, который эффективно поддерживает управление механическими узлами распределенных сетей. Это делает его идеальным протоколом для использования в автомобильных системах. LIN сеть состоит из единственного ведущего и множества подчиненных узлов. В данном примере применения описывается как реализовать протокол на физическом уровне и на уровне передачи данных в соответствии с двумя эталонными моделями низкого уровня ISO/OSI. Это фундаментальная основа для реализации передачи сообщений между точками распределенной сети. Физический уровень ISO/OSI моделей обеспечивает только передачу необработанных пакетов между двумя точками распределенной сети. Уровень передачи данных делает физический уровень более надежным за счет реализации обнаружения ошибок и управления. Также этот уровень добавляет средства для активизации, поддержания в активном состоянии и отключения соединения. Высшие уровни эталонных моделей ISO/OSI не относятся к LIN протоколу и поэтому в данном примере применения не рассматриваются.

LIN протокол отличается из CAN протокола тем, что его возможности меньше, а область применения уже, чем у CAN протокола. А его сильной стороной является то, что он проще и дешевле, что важно для приложений, не требующих больших возможностей CAN протокола. Основные свойства шины LIN:

  • Один ведущий, множество подчиненных.
  • Низкая стоимость полупроводниковых приборов.
  • Для синхронизации подчиненных узлов не требуются кварцевые или керамические резонаторы.
  • Гарантия времени ожидания для передачи сигналов.
  • Однопроводная линия связи.
  • Скорость передачи данных до 20 кбит/с.

Топология LIN сети
Рисунок 1. Топология LIN сети

Концепция протокола LIN

Один ведущий, несколько ведомых

Протокол LIN не использует управление доступом к шине. За передачу всех сообщений отвечает ведущий. Все подчиненные (ведомые) могут реагировать на сообщения ведущего или других узлов сети, но отвечать они могут только будучи адресованными ведущим и получив от него разрешение.

Переменная длина кадров данных

На длину поля сообщения указывают два бита, включенные в поле идентификатора (см. таблицу 1). Это добавляет гибкость системе и снижает количество байт сообщения, содержащего малое количество данных.

Групповой прием

После того, как кадр сообщения послан ведущим или ведомым, все подключенные узлы могут его получить. В зависимости от содержимого байта идентификатора, принимающие точки определяют, должны ли они реагировать на данное сообщение или нет. Например, в автомобильной охранной системе одна команда "CLOSE ALL", переданная ведущим, приведет к тому, что все подчиненные выполнят соответствующие действия по закрытию дверей и окон.

Временная синхронизация, не требующая применения в едущих узлах кварцевых или керамических резонаторов

После поля разрыва синхронизации ведущий передает поле синхронизации, которое позволяет всем подчиненным синхронизироваться с ведущим. Такие поля синхронизации передаются в начале каждого кадра сообщения. Стабильность рабочей частоты ведомых должна быть таковой, чтобы сохранить синхронизацию только в течение кадра сообщения. Это позволяет ведомым устройствам синхронизироваться от внутренних RC генераторов.

Проверка контрольной суммы и детектирование ошибок

Для обнаружения ошибок в данных кадра сообщения используется инвертированная по модулю 256 контрольная сумма с переносом старшего бита в младший разряд. Кроме того, идентификационный байт использует для обнаружения ошибок XOR алгоритм.

Обнаружение поврежденных точек сети

Ведущая задача ответственна за инициализацию передачи кадров сообщения и, таким образом несет ответственность, за информацию и проверяет, все ли узлы сети подключены к питанию и работают правильно.

Минимальная стоимость системы

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

Передача сигналов

Шина LIN состоит из одного канала, по которому передаются синхросигналы и данные. Физическая среда этого канала - однопроводная линия, подключенная через подтягивающий резистор к шине питания VCC (см. рисунок 1). Высокий или "рецессивный" сигнал на шине показывает, что она свободна, а низкий или "доминантный" - что она занята. Обычно в автомобильных системах VCC является положительным потенциалом.

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

В соответствии с требованиями к уровню паразитных ЭМИ, возникающих при передаче данных по однопроводным линиям связи, скорость передачи данных равняется 20 кбит/с.

Кадр сообщения

Вся информация, передаваемая по LIN шине разделена на кадры. Как показано в рисунке 2, кадр сообщения состоит из следующих полей:

  • Разрыв синхронизации
  • Поле синхронизации
  • Идентификационное поле
  • Поле данных
  • Поле контрольной суммы

Кадр сообщения LIN
Рисунок 2. Кадр сообщения LIN

Кадр сообщения состоит из двух частей: "заголовок", посланный ведущим и "ответ", который может формироваться как ведущей, так и подчиненной задачей.

Байтовые поля

Формат байтовых полей, показанный на рисунке 3, идентичен формату данных стандарта UART с кодированием 8N1. Это означает, что каждое байтовое поле содержит старт бит, 8 бит данных, стоп бит и не содержит бита проверки на четность. Таким образом, каждое байтовое поле содержит 10 бит (Tbit). Как показано на рисунке 3, старт бит указывает на начало байтового поля и является "доминирующим", в то время как стоп бит является "рецессивным". Восемь информационных битов могут быть как "доминирующими", так и "рецессивными".

Байтовое поле LIN
Рисунок 3. Байтовое поле LIN

Поле разрыва синхронизации

Поле разрыва синхронизации указывает на начало передачи кадра сообщения. Это поле всегда передается ведущей задачей и указывает на необходимость подчиненным подготовиться к приему поля синхронизации. Поле разрыва синхронизации состоит из двух частей: первая часть имеет доминирующей (низкий) уровень, длительность которого должна быть не менее 13 периодов байтового поля (Tbit), а вторая - рецессивной (высокий) уровень, длительность которого должна быть не менее четырех Tbit. Вторая часть поля необходима для обеспечения возможности обнаружения стартового бита следующего поля синхронизации.

Поле разрыва синхронизации
Рисунок 4. Поле разрыва синхронизации

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

Поле синхронизации

Поле синхронизации содержит сигналы, необходимые для синхронизации задающих генераторов подчиненных устройств сети. Поле синхронизации является байтовым полем, имеющем значение "0x55". Временная диаграмма этого поля приведена на рисунке 5.

Поле синхронизации
Рисунок 5. Поле синхронизации

Как видно из рисунка, поле синхронизации содержит пять спадающих фронтов (пять переходов от рецессивного к доминантному состоянию).

Эти спадающие фронты должны использоваться подчиненными устройствами для настройки скорости обмена данными.

Идентификационное поле

Идентификационное поле содержит информацию о содержимом и длине сообщения. Как показано на рисунке 6, это поле разделено на три секции: идентификационные биты (4 бита), служебные биты, указывающие на длину сообщения (2 бита) и биты проверки на четность (2 бита). Таким образом происходит деление 64 идентификационных номеров на четыре комплекта, каждый из которых содержит 16 идентификаторов.

Идентификационное поле
Рисунок 6. Идентификационное поле

В соответствии с LIN протоколом количество полей данных в кадре данных определяется по приведенной ниже таблице 1.

Таблица 1. Количество полей данных в кадре данных

ID5 ID4 NDATA (количество полей данных)
0 0 2
0 1 2
1 0 4
1 1 8

Как видно из таблицы 1 есть две группы с двумя полями данных, одна группа с четырьмя полями данных и одна группа с восьмью полями данных. Обратите внимание, что в идентификационном поле не описывается длина сообщения, а только указывается содержание кадра сообщения. Это позволяет приемникам подчиненных задач определить все ли были приняты данные или нет. Последние два бита идентификационного поля являются битами проверки на четность. LIN использует алгоритм смешанного контроля четности, который гарантирует, что идентификационное поле никогда не будет состоять из одних "рецессивных" или "доминантны" символов. Следует заметить, что этот алгоритм позволяет только обнаруживать ошибки, но не исправляет их.

Биты проверки на четность формируются в соответствии с приведенными ниже формулами:

    P0 = ID0 xor ID1 xor ID2 xor ID4
    P1 = ID1 xor ID3 xor ID4 xor ID5
    

Поле данных

Кадр данных включает в себя от двух до восьми полей данных, каждое из которых содержит восемь бит. Передача данных осуществляется старшим значащим битом (СЗБ) вперед. Поля данных записываются соответствующими подчиненными задачами. Так как нет никакого управления доступом к шине, то только одна подчиненная задача должна реагировать на идентификатор. Все остальные подчиненные задачи могут только принимать ответное сообщение и выполнять соответствующие действия.

Поле данных
Рисунок 7. Поле данных

Поле контрольной суммы

Последним полем в кадре сообщения является поле контрольной суммы. Этот байт содержит инвертированную сумму по модулю 256 всех байтов данных (кадр данных не включает идентификатор). Эта сумма рассчитывается путем суммирования с переносом всех байтов и инвертирования полученного результата. Свойства инвертированной суммы по модулю 256 таково, что если ее сложить с суммой всех байтов данных, то результат будет равен «0xFF».

Поле контрольной суммы
Рисунок 8. Поле контрольной суммы

Кадр дежурного режима

Структура кадра дежурного режима идентична обыкновенному кадру сообщения, за исключением того, что идентификационный байт равняется "0x80". Содержимое полей данных не определено и может использоваться для передачи в системе различных параметров.

Кадр дежурного режима
Рисунок 9. Кадр дежурного режима

Сигнал активизации

Режим сна (дежурный режим) может быть закончен путем посылки любой подчиненной задачей сигнала активизации (пробуждения). Сигнал пробуждения возможно сформировать только в том случае, когда шина находится в режиме сна и внутренние узлы отслеживают его. Сигнал пробуждения - это кодовая комбинация "0x80".

Кадр сигнала активизации
Рисунок 10. Кадр сигнала активизации

В зависимости от того, синхронизирована ли подчиненная задачи с ведущей задачей, скорость ее может быть отличной от скорости приемника ведущего устройства. По этой причине приемник ведущего устройства может идентифицировать переданный сигнал "0x80" как "0xC0", "0x80" или "0x00". Все эти сигналы будут восприняты как правильный сигнал пробуждения, и подчиненные устройства будут ожидать поля разрыва синхронизации от ведущего. Если в течение 128 Tbit не будет обнаружен этот сигнал, то сигнал пробуждения будет игнорирован. Так будет повторяться трижды. Перед посылкой нового запроса на пробуждения ведущее устройство будет ждать не менее 15 000 Tbit. В описываемом примере применения разграничитель пробуждения имеет значение 64 Tbit.

Обработка ошибок

LIN протокол обеспечивает обнаружение ошибок как в идентификационном поле, так и в поле данных. Исправление ошибок не предусмотрено, поэтому единственный путь - автоматический повтор передачи поврежденных данных. Для выяснения правильности приема ведущий опрашивает подчиненных.

LIN протокол не определяет процедуру подтверждения для корректности принятия сообщения. Управляющий модуль ведущего устройства сравнивает переданные данные с полученными от своей собственной подчиненной задачи. Если данные идентичны, то принимается решение о правильности передачи данных. Если же имеется расхождение в этих данных, то ведущий может повторить передачу сообщения.

Если несоответствие обнаруживает подчиненное устройство, то эта информация сохраняется и ведущему посылается запрос. Эта неверная информация может быть передана как часть кадра данных.

Соединения

Теоретически максимальное количество узлов в LIN сети не ограничено. Реально же, количество узлов будет ограничено шумами, задержками и электрической нагрузкой шины. Желательно, чтобы количество узлов в сети не превышало 16. В принципе, протокол поддерживает до 63 удаленных точек. Также LIN протокол требует, чтобы общая длина проводов не превышала 40 метров. Импеданс ведущего устройства должен быть порядка 1 кОм, а подчиненных - 20 - 47 кОм.

Передача сообщения

Фильтрация сообщений основана на присваивании подчиненным узлам личного идентификатора. Все подчиненные могут принимать и реагировать на все сообщения, но только один узел, чей идентификатор равен переданному, может отвечать ведущему.

Сообщение считается правильным если в пределах кадра сообщения не было обнаружено ошибок. Если в сообщении имеется ошибка, то принимается решение, что передачу данных не осуществлял ни ведущий, ни ведомый.

Ограничение ошибок

Ведомая задача должна быть способна идентифицировать следующие ошибочные ситуации:

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

Стабильность автогенератора

Обычно встроенные RC генераторы имеют большой допустимый диапазон (например, от -50 % до +100 %). LIN протокол требует, чтобы частота подчиненного отличалась от частоты ведущего не более, чем на 15 %. В длительности кадра отклонение частоты не должно превышать +-2 %. Эти требования должны выполняться во всем рабочем температурном диапазоне и при всех допустимых напряжениях питания.

Программная реализация

В данном разделе описывается реализация различных частей программы. Управляющая программа состоит из семи различных подпрограмм.

Таблица 2. Реализованные функции

Функция Описание Вызывающее событие
main Основная программа Сброс
ext_int0 Обработчик внешнего прерывания INT0 Спадающий фронт на выводе PIND2
check_parity Высчитывает количество доминантных бит в переданной переменной ext_int0
tim0_ovf Вызывается при переполнении нулевого таймера/счетчика при расчете длительности бита аппаратный нулевой таймер/счетчик
putchar Передача данных по LIN шине ext_int0
delay Основная подпрограмма формирования задержки ext_int0
wakeup Посылает ведущему сигнал пробуждения Пользовательская подпрограмма

main

В описываемом примере применения основная программа не выполняет никаких действий. В нее можно поместить код прикладной программы пользователя. Обратите внимание, что микроконтроллер AT90S1200 не имеет СОЗУ, а использует вместо него трехуровневый аппаратный стек. Если используется более трех уровней, то происходит перезапись первого значения последним. Это ведет к непредсказуемости выполняемой программы. Когда происходит внешнее прерывание, то вызывается подпрограмма обработки прерывания. При приеме данных вызывается подпрограмма check_parity, а при передаче - подпрограмма putchar. Таким образом, два уровня стека используется под внешние прерывания. Поэтому важно, чтобы прикладная программа пользователя не использовала больше одного уровня стека.

Байт состояния
Рисунок 11. Байт состояния

При обнаружении ошибки бита или ошибки контрольной суммы устанавливаются соответствующие биты регистра состояния (Status: r20). После считывания эти биты должны быть сброшены. Основная программа должна непрерывно опрашивать флаг дежурного режима. Когда обнаруживается, что этот флаг установлен, то микроконтроллер AT90S1200 может быть введен в режим сна при помощи следующей последовательности команд:

    ldi r23, (1 <<SE) + (1 <<ISC01)
    MCUCR, r23;     выбор режима Idle и активизация сна
    sleep;          выход из дежурного режима по спадающему фронту сигнала на выводе INT0
    

При обнаружении активности шины микроконтроллер выходит из дежурного режима и запускает подпрограмму ext_int0. Подпрограмма LIN интерфейса имеет размер 181 слово, поэтому размер пользовательской программы может достигнуть 331 слова (662 байта). В сумме получается 512 слов (1 Кбайт).

Подпрограмма обслуживания нулевого внешнего прерывания: ext_int0

Эта подпрограмма выполняет все функции по формированию подчиненного LIN интерфейса. Нулевое внешнее прерывание формируется по спадающему фронту сигнала на второй линии порта D. Подпрограмма запускается по первому фронту секции разрыва синхронизации и по стартовому байту идентификатора. Для отслеживания передаваемых данных определены три режима:

  • Режим 1: программа ожидает принятие секции разрыва синхронизации.
  • Режим 2: программа ожидает принятия синхронизирующего байта.
  • Режим 4: программа ожидает принятия идентификатора.

На рисунке 12 показана блок-схема программы ext_int0.

В режиме 1 подпрограмма отслеживает последующие 11 бит. Длительность бита принимается такой же, как и при последней передаче. После принятии 11 битов устанавливается режим 2.

В режиме 2 по первому срезу сигнала запускается таймер. Программа отслеживает пять спадающих фронтов и после этого останавливает таймер (см. рисунок 5). Содержимое таймера делится на 8 и таким образом вычисляется длительность импульса.

В режиме 4 считывается принятый идентификатор. Сначала проверяется, не является ли принятый идентификатор командой активизации режима сна. Если же принятая секция не является такой командой, то идентификатор сравнивается с внутренним шаблоном. Если переданный идентификатор принадлежит устройству, то выполняется проверка на четность. После этого формируется контрольная сумма и пересылается вместе с данными.

Блок-схема подпрограммы обработки прерывания ext_int0
Рисунок 12. Блок-схема подпрограммы обработки прерывания ext_int0

check_parity

Эта подпрограмма считает количество принятых бит во внутреннюю переменную. Если количество четное, то МЗБ переменной количества битов будет равно 0. Если количество нечетное, то МЗБ переменной будет равняться 1. Этот бит используется для формирования бита контроля на четность.

Подпрограмма обработки переполнения нулевого таймера: tim0_ovf

Нулевой таймер/счетчик, используемый в данном примере применения является восьмибитным. Для обеспечения возможности отслеживания восьми длительностей бита эта подпрограмма, вызываемая при переполнении нулевого таймера, увеличивает значение вспомогательной переменной. Объединение вспомогательной переменной с содержимым первого таймера/счетчика дает 16 битное число, используемое для формирования длительности восьми бит. Деление этого значения на восемь формирует длительность бита. AVR микроконтроллер работает на частоте 1 МГц, и его счетчик увеличивает каждый тактовый цикл. Таким образом, длительность бита формируется непосредственно в микросекундах.

putchar

Подпрограмма putchar используется для передачи данных по LIN шине. При передаче нуля в регистре Port Register вывод PIND2 устанавливается на работу в режиме выхода. При передаче единицы линия порта устанавливается на работу в режиме входа, и встроенный подтягивающий резистор подтягивает линию к положительной шине питания. Это эквивалентно закрытому выходу каскада с открытым коллектором. Передаваемые и принимаемые данные накапливаются в регистрах data1 - datan и rx - rx+n. В зависимости от того, какое количество определено в идентификационном поле, подчиненное устройство передает два, четыре или восемь байт. Константа data_addr определяет адрес первого передаваемого регистра.

delay

Эта подпрограмма формирует задержку в циклах, определяемую выражением [temp2] +- 1. Используется она для формирования задержки между выбираемыми битами.

wake-up

Вызвав эту подпрограмму из основной программы, можно сформировать сигнал пробуждения шины. Программа не используется подпрограммой ext_int0.

Размышления по поводу аппаратной части

Стандарт LIN определяет диапазон уровня доминантного сигнала от 9 В до 18 В (40 В в нерабочем состоянии). Описываемое устройство предназначено для работы на 5 В LIN шине. Так как AVR микроконтроллер, используемый в этом применении, работает от 5 В источника питания, то самым разумным было бы использовать 5 В LIN шину. Если же такая шина не может быть использована, то необходимо обеспечить преобразование уровней LIN шины. Существует два простейших метода обеспечения такого преобразования

Метод 1

В нем используется один полевой транзистор. Схема включения его показана на рисунке 13.

Преобразование 5 В интерфейса в 12 В при помощи одного полевого транзистора
Рисунок 13. Преобразование 5 В интерфейса в 12 В при помощи одного полевого транзистора

Метод 2

На рисунке 14 показано, как можно обеспечить преобразование уровней при помощи двух биполярных транзисторов. Следует заметить, что при этом у микроконтроллера разделяются линии приема и передачи.

Преобразование 5 В интерфейса в 12 В при помощи двух биполярных транзисторов
Рисунок 14. Преобразование 5 В интерфейса в 12 В при помощи двух биполярных транзисторов

Если использовать такой преобразователь уровней, то программу надо исправить. Необходимо внести следующие изменения:

  • Подпрограмма putchar должна формировать передаваемые данные на выводе Tx, а не на выводе PIND2 (Rx).
  • Данные на вывод Tx должны поступать без инверсии.
  • Вывод Tx должен быть установлен на работу в режиме выхода.
  • Принятые данные должны быть инвертированы.

Связанные документы

Руководства по применению
Application Note (141 Кб), 11.12.2009
AVR308: Программа подчиненного устройства LIN
AVR308 (5.3 Кб), 11.12.2009
Пример программы
 
Автор документа: Жанна Свирина , http://www.gaw.ru"
Дата публикации: 11.12.2009
Дата редактирования: 11.12.2009
Кол-во просмотров 4203
 
 Все новости одной лентой