Ведущий однопроводной интерфейс 1-Wire компании Dallas
Отличительные особенности:
- Поддержка стандартной скорости протокола Dallas 1-Wire.
- Совместимость со всеми микроконтроллерами AVR.
- Реализация с управлением по прерываниям или по опросу.
- Реализация на основе опроса не требует внешней схемы.
Введение
Уникальность микросхем Dallas с интерфейсом 1-Wire заключается в необходимости использования для связи с ними только одной сигнальной линии и общего проводника. Питание и связь осуществляются через одно соединение. Для связи с такой микросхемой требуется задействовать только одну линию ввода-вывода. В данных «Рекомендациях» показывается, как с помощью AVR-микроконтроллера реализовать ведущий интерфейс 1-Wire программным способом или с задействованием модуля У(С)АПП.
Принцип действия протокола Dallas 1-Wire
Шина 1-Wire использует только один проводник для связи и питания. Режим связи – асинхронный и полудуплексный, который строго следует схеме ведущий-подчиненный. К одной и той же шине могут быть одновременно подключено одно или несколько подчиненных устройств. К одной шине может быть подключено только одно ведущее устройство.
Незанятому состоянию шины соответствует высокий уровень, который формируется подтягивающим резистором. Номинал подтягивающего резистора приводится в документации на подчиненную ИМС. Все микросхемы, подключенные к шине, должны быть способны создавать низкий уровень. Если выход микроконтроллера не поддерживает тристабильность, то необходимо предусмотреть драйвер, у которого выход с открытым коллектором или открытым стоком
Передача сигналов по шине 1-Wire разделена на временные слоты длительностью 60 мкс. Одним временным слотом передается только один бит данных. Подчиненным устройствам допускается иметь существенные отличия от номинальных выдержек времени. Однако это требует более точного отсчета времени ведущим, чтобы гарантировать корректность связи с подчиненными, у которых различаются временные базисы. Таким образом, следует в точности выдерживать временные границы, рассматриваемые в следующих разделах.
Основные сигналы шины
Ведущий инициирует каждую связь на битном уровне. Это означает, что передача каждого бита, независимо от направления, должна быть инициирована ведущим. Это достигается установкой низкого уровня на шине, который синхронизирует логику всех остальных устройств. Существует 5 основных команд для связи по шине 1-Wire: “Запись лог. 1”, “Запись лог. 0”, “Чтение”, “Сброс” и “Присутствие”.
Сигнал “Запись лог. 1”
Сигнал “Запись лог. 1” показан на рисунке 1. Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого, в течение оставшейся части временного слота он освобождает шину.
Рисунок 1 – Сигнал «Запись лог. 1»
Сигнал “Запись лог. 0”
Сигнал “Запись лог. 0” показан на рисунке 2. Ведущий формирует низкий уровень в течение не менее 60 мкс, но не дольше 120 мкс.
Рисунок 2 – Сигнал «Запись лог. 0»
Сигнал “Чтение”
Сигнал “Чтение” показан на рисунке 3. Ведущий устанавливает низкий уровень в течение 1…15 мкс. После этого подчиненный удерживает шину в низком состоянии, если желает передать лог. 0. Если необходимо передать лог. 1, то он просто освобождает линию. Сканирование шины необходимо выполнять по истечении 15 мкс после установки низкого уровня на шине. Если смотреть со стороны ведущего, сигнал “Чтение” является в сущности сигналом «Запись лог. 1». Собственно внутреннее состояние подчиненного будет определять это сигнал «Запись лог. 1» или «Чтение».
Рисунок 3 – Сигнал «Чтение»
Сигнал “Сброс/присутствие”
Сигналы “Сброс” и “Присутствие” показаны на рисунке 4. Обратите внимание, что временные интервалы импульсов отличаются. Ведущий устанавливает низкий уровень в течение 8 временных слотов (480 мкс), а затем освобождает шину. Данный длительный период низкого состояния называется сигнал «Сброс».
Если на шине присутствует подчиненный, то он должен в течение 60 мкс после освобождения ведущим шины установить низкий уровень длительностью не менее 60 мкс. Данный отклик носит название «Присутствие». Если такой сигнал не обнаруживается, то ведущий должен полагать, что нет подключенных устройств к шине и дальнейшая связь невозможна.
Рисунок 4 – Сигналы «Сброс» и «Присутствие»
Программная генерация сигналов
Программная генерация сигналов 1-Wire является наиболее очевидным решением. При этом необходимо манипулировать над изменением направления и состояния линии ввода-вывода, а также генерировать требуемые временные задержки. Подробное описание данного метода приведено в разделе реализации.
Генерация сигналов с помощью УАПП
Основные сигналы 1-Wire также можно генерировать с помощью УАПП. Для этого необходимо связать с шиной выводы TXD и RXD с помощью несложной схемы представленной на рисунке 5. Приведенные номиналы резисторов носят рекомендательный характер. Более подробные рекомендации по выбору подтягивающего резистора следует искать в документации на подчиненную ИМС.
Рисунок 5 – Схемотехника драйвера шины с открытым коллектором
Формат данных УАПП, который используется для генерации сигналов 1-Wire, - 8 бит данных без бита паритета и 1 стоп-бит. Одна посылка данных УАПП используется для генерации нужной формы прямоугольного импульса или последовательности СБРОС/ПРИСУТСТВИЕ. В таблице 1 показано, как настроить УАПП для генерации прямоугольного импульса и как интерпретировать принятые данные. Соответствующие структуры посылок УАПП показаны на рисунках 6…10.
Таблица 1 – Передача сигналов с помощью УАПП
Сигнал |
Скорость связи |
Передаваемое значение |
Принимаемое значение |
«Запись лог. 1» |
115200 |
FFh |
FFh |
«Запись лог. 0» |
115200 |
00h |
00h |
Чтение |
115200 |
FFh |
Если принято FFh, то это эквивалентно приему лог. 1; прием любого другого значения эквивалентен приему лог. 0 |
Сброс/Присутствие |
9600 |
F0h |
Если принято F0h, то это означает нет подтверждения «присутствия», иначе «присутствие» принято. |
Рисунок 6-Сигнал «Запись лог. 1» и структура посылки УАПП.
Рисунок 7- Сигнал «Запись лог. 0» и структура посылки УАПП.
Рисунок 8 – Сигнал «Чтение лог. 0» и структура посылки УАПП.
Рисунок 9 – Сигнал «Чтение лог. 1» и структура посылки УАПП.
Рисунок 10 – Сигнал «Сброс/Присутствие» и структура посылки УАПП.
Команды функций ПЗУ
Каждая ИС из семейства 1-Wire содержит ПЗУ, в котором хранится уникальный 64-разрядный идентификационный код (ИК). Данный код может использоваться для адресации или идентификации конкретной ИС на шине. Идентификатор состоит из трех частей: 8 бит кода семейства, 48 бит серийного номера и 8 бит CRC-кода, вычисленного от первых 56 бит. Имеется небольшой набор команд, который работает совместно с 64-разр. ИК. Эти команды называются команды функций ПЗУ. В таблице 2 приведен перечень шести команду ПЗУ.
Таблица 2 – Команды ПЗУ
Команда |
Код |
Назначение |
READ ROM (ЧТЕНИЕ ПЗУ) |
33H |
Идентификация |
SKIP ROM (ПРОПУСК ПЗУ) |
CCH |
Пропуск адресации |
MATCH ROM (СОВПАДЕНИЕ ПЗУ) |
55H |
Адресация подчиненного устройства |
SEARCH ROM (ПОИСК ПЗУ) |
F0H |
Получение идентификационных данных о всех устройствах на шине |
OVERDRIVE SKIP ROM |
3CH |
Ускоренная версия SKIP ROM |
OVERDRIVE MATCH ROM |
69H |
Ускоренная версия MATCH ROM |
Описание команд
Команда «Чтение ПЗУ»
Команда “Чтение ПЗУ” может использоваться на шине с одним подчиненным для чтения 64-разр. индивидуального ИК. Если имеется несколько подчиненных устройств, подключенных к шине, то результатом выполнения этой команды будет прием значения, эквивалентного логическому И между всеми ИК. При этом полагается, что связь безупречная, а наличие нескольких подчиненных индицируется ошибочным CRC.
Команда «Пропуск ПЗУ»
Команда «Пропуск ПЗУ» может использоваться, если нет необходимости адресоваться к конкретному подчиненному устройству по его специфическому адресу. На шине с одним подчиненным команда “Пропуск ПЗУ” прекрасно подходит для его адресации. На шине с несколькими подчиненными команда “Пропуск ПЗУ” может использоваться для адресации всех устройств одновременно.
Это удобно, если требуется отправить общую команду нескольким подчиненным устройствам, например, одновременный запуск преобразования температуры в нескольких датчиках температуры. Команду “Пропуск ПЗУ” бессмысленно использовать при чтении шины с несколькими подчиненными устройствами.
Команда «Совпадение ПЗУ»
Команда “Совпадение ПЗУ” используется для адресации конкретного подчиненного устройства на шине.
После выполнения команды “Совпадение ПЗУ” передается 64-разрядный ИК. По завершении, только тому подчиненному устройству, который принял свой ИК, разрешается отвечать после приема следующего импульса сброса.
Команда «Поиск ПЗУ»
Команда “Поиск ПЗУ” может использоваться, если идентификаторы подчиненных устройств неизвестны заранее. Это делает возможным обнаружить идентификаторы всех подчиненных устройств, подключенных к шине. Для этого, вначале передается команда “Пропуск ПЗУ”. Каждый подчиненный размещает первый бит своего идентификатора на шине. Ведущий считывает результат, как логическое И над всеми первыми битами идентификаторов всех подчиненных устройств. Затем подчиненные размещают на шине двоичное дополнение к первому биту своего идентификатора. Ведущий считывает состояние шины, которое есть результат логического «И» над всеми дополнениями к первому биту идентификатора всех подчиненных устройств. Если все устройства в первом разряде ИК содержат 1, то ведущий считает 10b. Аналогично, если значения 1 разряда всех устройств равно 0, то ведущий примет 01b. В этих случаях, бит может быть сохранен как значение первого бита всех адресов. После этого ведущий снова выполняет размещение этого бита на шине, чем сигнализирует подчиненным о необходимости дальнейшего продолжения передачи разрядов ИК. Если на шине будут присутствовать устройства, как с лог. 0, так и с лог. 1 в первом бите идентификатора, то ведущий примет 00. В этом случае, ведущий должен выбрать с какими адресами продолжать работу, с лог. 0 или 1 в первом разряде. Выбор передается по шине, указывая выбранным подчиненным о необходимости дальнейшей передачи ИК, а остальные подчиненные переходят в режим ожидания.
Затем ведущий переходит к считыванию следующих бит и этот процесс повторяется до считывания всех 64 бит. В результате ведущий обнаруживает полный 64-разрядный идентификатор. Для поиска других идентификаторов необходимо снова инициировать команду «Поиск ПЗУ», но в этом случае при возникновении несоответствий сделать другой выбор. Если придерживаться данной последовательности, то в конечном счете можно обнаружить все подчиненные устройства. Обратите внимание, что после выполнения первого поиска все подчиненные, кроме одного, переходят в режим ожидания. Таким образом, в этом состоянии связаться с активным подчиненным можно с помощью команды «Совпадение ПЗУ».
Ускоренные команды ПЗУ
Ускоренные команды ПЗУ не рассматриваются здесь, т.к. в данном документе рассматривается только режим стандартной скорости.
Команды памяти/функций
Команды памяти/функций – команды, которые специфичны для конкретного типа ИС или их класса. Обычно эти команды относятся к чтению или записи внутренней памяти и регистров подчиненных ИС. Количество таких команд фиксировано, но все они поддерживаются конкретным видом подчиненного устройства. Последовательность чтения и записи определена для каждой ИС.
В связи с этим команды памяти здесь в подробностях не рассматриваются.
Типичная последовательность сеанса связи
Все однопроводные устройства придерживаются основной последовательности связи:
- Ведущий отправляет импульс “Сброс”.
- Подчиненный (ые) отвечает (ют) импульсом «Присутствие».
- Ведущий отправляет команду ПЗУ, адресуя одно или несколько подчиненных устройств.
- Ведущий отправляет команду памяти.
Обратите внимание, что для перехода к новому шагу, последний шаг должен быть завершен. Однако, не всегда необходимо завершать всю последовательность. Например, после завершения команды ПЗУ можно отправить новую команду «Сброс» и тем самым инициировать новый сеанс связи.
Проверка циклическим избыточным кодом
Кодирование циклическим избыточным кодом (CRC) используется для гарантирования целостности принятых данных через 1-Wire.
Подробности по теории CRC в этом документе не приводятся и в дальнейшем не обсуждаются. Если необходима информация по CRC, то рекомендуется использовать [2].
Среди семейства 1-Wire обычно используются две различные схемы CRC. Одна из них – 8-разрядная CRC (CRC8), другая – 16-разрядная CRC (CRC16). CRC8 используется в секторе ПЗУ всех микросхем. CRC8 также используется в некоторых ИС для проверки других данных, например, вводимых через шину команд. CRC16 используется некоторыми ИС для проверки на наличие ошибок в больших наборах данных.
Аппаратный эквивалент 8-разрядного CRC используется 64-разрядным идентификатором и показан на рисунке 11. Блоки представляют индивидуальные биты в 8-разрядном сдвиговом регистре. Эквивалентное полиноминальное выражение для CRC: X8 + X5 + X4 + 1.
Рисунок 11 – Аппаратный эквивалент 8-разр. CRC, используемого в микросхемах 1-Wire
Аппаратный эквивалент 16-разрядного CRC используется некоторыми ИС и показан на рисунке 12. Блоки представляют индивидуальные биты в 16-разрядном сдвиговом регистре. Эквивалентное полиноминальное выражение для CRC: X16 + X15 + X2 + 1.
Рисунок 12 - Аппаратный эквивалент 16-разр. CRC, используемого в микросхемах 1-Wire
Реализация
Далее рассматриваются три различных способа реализации протокола 1-Wire: полностью программная (по опросу), на основе УАПП с опросом флагов состояния и на основе УАПП с управлением по прерываниям. Короткое описание каждого дается ниже. Подробное описание по использованию каждого драйвера не входит в данный документ. Если необходимо более подробная информация по работе каждого драйвера, то необходимо ознакомится с исходным кодом интересующего драйвера, который входит в состав данных «Рекомендаций»
Рассмотрим программный подход к реализации протокола 1-Wire без задействования специальных аппаратных блоков микроконтроллера. Преимуществом данного подхода является то, что из аппаратных затрат потребуется только одна линия ввода-вывода общего назначения (GPIO). Поскольку все линии ввода-вывода у AVR-микроконтроллеров двунаправленные и содержат опциональные подтягивающие резисторы, то AVR-микроконтроллер может управлять шиной 1-Wire без какой-либо внешней схемы. В случае, если номинал внутреннего подтягивающего резистора не соответствует текущей конфигурации подчиненных устройств, то понадобиться только один внешний резистор. Недостатком данного подхода является возникновение задержек в процессе генерации “Сброс/Присутствие” и передачи бит. Чтобы гарантировать корректность временных интервалов на шине 1-Wire, прерывания должны быть отключены на время передачи бит. Длительность интервала между передачами двух бит никак не ограничивается. Таким образом, после передачи каждого бита можно смело активизировать прерывания. В этом случае генерация прерывания может возникать с задержкой, но ее наихудшее значение не превысит длительности генерации сигнала “Сброс/Присутствие” (менее 1 мс).
Драйвер УАПП с управлением по опросу использует модуль УАПП, который входит в состав многих микроконтроллеров AVR. Он используется для генерации сигнала необходимой формы на битном уровне. Остальная часть драйвера эквивалентна программному. Основными преимуществами данного драйвера по сравнению с программным – компактность программного кода и отсутствие необходимости манипулировать прерываниями во время передачи сигналов, т.к. УАПП выполняет это автономно. Недостатки: требует двух линий ввода-вывода и несложную внешнюю схему.
Драйвер УАПП с управлением по прерываниям использует УАПП для генерации сигналов необходимой формы тем же способом, что и драйвер УАПП с управлением по опросу. Дополнительным преимуществом данного подхода является возможность автоматического приема-передачи до 255 бит данных.
Драйверы с опросом состояния
Драйверы с опросом состояния разделены на две части: генерация сигналов битового уровня и команды высокого уровня для передачи байт и реализации команд ПЗУ. Отличие между двумя версиями состоит только в процедурах битного уровня, но они реализованы с общим интерфейсом, что позволяет использовать команды высокого уровня с любым драйвером.
Программная реализация
С помощью рассматриваемой программной реализации имеется возможность манипулировать с несколькими шинами 1-Wire, подключенных к одному микроконтроллеру AVR. Однако все шины должны быть подключены к одному и тому же порту ввода-вывода, а на какой именно порт необходимо определится во время проектирования.
Количество подключаемых шин ограничивается восемью, а перенос шины в пределах порта может конфигурироваться. Выводы, которые не задействованы шинами 1-Wire, остаются незатронутыми. Поскольку все шины 1-Wire подключены к одному и тому же порту, то несколько операций может быть выполнено на одной или более шинах одновременно. Это стало возможным благодаря аргументу pin или pins, которые входит в интерфейс каждой функции. Данный аргумент должен содержать маску для выводов, которые задействованы для работы. Например, имеется возможность отправить сигнал СБРОС восьми шинам одновременно, указав в качестве аргумента 0xff. Значение, возвращаемое этой функцией будет битовой маской всех шин, где один или более подчиненных устройств сгенерировали сигнал «присутствие». Данная битовая маска может подставляться в качестве аргумента pins в функцию, которая вводит команду «Пропуск ПЗУ». Все функции в этой реализации поддерживают возможность выбора вывода (pin). Следует руководствоваться общим правилом: все команды записи могут адресовать несколько шин одновременно. Команды чтения могут адресоваться только к одной шине.
Инициализация
Процедура инициализации интерфейса 1-Wire предельно проста. Она заключается в установке выводов 1-Wire на ввод и, при необходимости, активизации встроенного подтягивающего резистора для перевода шины в неактивное состояние. Некоторые микросхемы отреагируют на этот нарастающий фронт на шине, как на окончание сигнала «Сброс» и ответят сигналом «Присутствие». Для гарантирования, что этот сигнал не вызовет какого-либо сеанса связи, предусмотрена длительная выдержка времени.
Функции битового уровня
Функции битового уровня реализованы в соответствии с рекомендациями по применению AN126 компании Dallas Semiconductors. Все параметры временной диаграммы выдержаны в соответствии с рекомендованными значениями в этом документе. Значения приведены в таблице 3.
Таблица 3 – Значения используемых задержек времени
Параметр |
Рекомендованная задержка, мс |
A |
6 |
B |
64 |
C |
60 |
D |
10 |
E |
9 |
F |
55 |
G |
0 |
H |
480 |
I |
70 |
J |
410 |
Обратите внимание, что в стандартном режиме задержка G равна 0.
Поскольку все операции ввода-вывода реализованы на Си без использования Ассемблера, то оптимизации компилятора и другие факторы могут нарушить временные характеристики. В связи с этим, рекомендуется следить за фактическими параметрами генерируемых импульсов каждой функцией битового уровня с помощью осциллографа и при необходимости отрегулировать задержки.
Функции уровня передачи бит реализованы так, как показано на рисунке 13. Обратите внимание, что функция “Определение присутствия” отправляет сигнал «Сброс» и считывает “Сигнал присутствие”. Также следует учесть, что все функции уровня передачи бит могут адресоваться к нескольким шинам одновременно.
Рисунок 13 – Функции слоя передачи бит
Для установки низкого уровня на шине и ее освобождения реализовано два макроса. Реализация этих функций в виде макроса обосновано высокой частотой их использования и тем, что использование команд вызова (call) может ухудшить временные характеристики.
Реализация на УАПП с опросом
При использовании данного подхода за параметры всех временных диаграмм отвечает модуль УАПП. Для отправки бита устанавливается соответствующая скорость связи УАПП, а затем в регистр данных записывается значение, которое вызовет генерацию сигнала желаемой формы (см. «Генерация сигналов с помощью УАПП”).
Инициализация
Для инициализации интерфейса 1-Wire при использовании рассматриваемого драйвера, первоначально необходимо инициализировать модуль УАПП с корректными параметрами: разрешить передачу и прием, установить формат данных 8 бит, отключить паритет, установить генерацию одного стоп-бита и задать скорость связи до 115,2 кбод.
Установка данных параметров приведет к переходу вывода TXD в неактивное состояние УАПП, которое равно лог. 1. Подчиненные устройства воспримут, возникающий при этом, нарастающий фронт, как сигнал «Сброс» и ответят на него сигналом «Присутствие».
Функции битового уровня
Все функции битового уровня рассматриваемого драйвера реализованы с помощью одной общей функции, именуемой OWI_TouchBit. Данная функция загружает данные в модуль УАПП для передачи, ожидает завершения приема УАПП, а затем возвращает принятое значение. Каждая из функций битового уровня вызывается с помощью OWI_TouchBit с указанием соответствующего значения, которое приводит к генерации желаемого сигнала на шине.
Интерфейс с данными функциями такой же, как и у драйвера с программной реализацией. Однако, аргумент ‘pins’ в данном случае опускается. Набор макросов делает возможным вызвать данные функции с или без аргумента pins. Если же аргумент pins будет указан, то макрос его исключит.
Функции высокого уровня
Обратите внимание, что многие функции в этом слое получают аргумент с типом «unsigned char pointer» (символьный указатель без знака). Данный указатель адресует массив из 8 байт памяти, который может использоваться функцией. Расположение, а также редкая инициализация, этих массивов должна выполняться пользователем. В данном документе полагается, что перед вызовом функции была выполнена инициализация памяти каким-либо методом.
Функции передачи байта
Рисунок 14 – Функции передачи байта
Команды ПЗУ
Реализованы все команды ПЗУ для стандартной скорости связи.
Самой простой командой ПЗУ является команда «Пропуск ПЗУ». Ее инициирует функция SendByte с указанием в качестве аргумента командного байта SKIP ROM.
Блок-схемы команд Чтение ПЗУ (READ ROM) и Совпадение ПЗУ (MATCH ROM) показаны на рисунке 15.
Рисунок 15 – Блок-схема команды Чтение ПЗУ
Блок-схема команды Поиск ПЗУ (SEARCH ROM) показана на рисунке 16. При каждом вызове данная функция ищет одно подчиненное устройство и так до тех пор, пока не будут найдены все устройства на шине. Подтверждением последнего запуска этой функции служит возвращаемое значение OWI_ROM_SEARCH_FINISHED. Кроме этого, параметр ‘pin’ указывает на какой шине необходимо вести поиск и еще два параметра должны быть указаны в интерфейсе функции: ‘lastDeviation’ и ‘bitPattern’. Эти параметры управляют поиском подчиненного устройства. В таблице 4 приведена информация по тому, как использовать данные параметры для завершения полного поиска всех подчиненных устройств.
Таблица 4 – Использование аргументов bitPattern и lastDeviation
|
BitPattern |
lastDeviation |
Первый раз |
Обнуление 8-байтного массива |
0 |
Последующие разы |
Копирование 8-байтного массива возвращается через указатель bitPattern при последнем запуске. |
Значение, возвращаемое SearchRom при последнем запуске. |
Функция реализована с учетом предоставления пользователю максимальной гибкости. Пример программы с использованием данного драйвера показывает, как выполнить полный поиск.
Рисунок 16 – Команда поиск ПЗУ
Замечания относительно параметров временной диаграммы
Важно, чтобы временные характеристики генерируемых сигналов соблюдались как можно более точно. Для этого необходима точная генерация временных задержек. Количество тактовых импульсов, необходимое для задержки в некоторое количество микросекунд вычисляется во время компиляции. Во время генерации импульсов некоторые такты теряются, когда происходит установка низкого уровня или освобождение шины. Данные такты вычитаются из общего количества тактов, необходимых для генерации задержки. При чрезмерно низкой тактовой частоте может генерироваться некорректная задержка. Для генерации коротких задержек тактовая частота должна быть не менее 2,17 МГц.
Реализация на УАПП с управлением по прерываниям
При использовании данного драйвера внешняя схемотехника должна быть такой же, как и при использовании драйвера УАПП с опросом флагов состояния.
Дополнительной функцией данного подхода является автоматическая передача и прием больших пакетов данных по шине, что выполняется с помощью двух процедур обслуживания прерываний (ISR). Набор вспомогательных функций может вызываться для установки всех необходимых параметров, а вызов ISR завершит трансакцию автоматически. С помощью данных функций имеется возможность без всякого вмешательства отработать последовательность «Сброс/присутствие» или передать от 1 до 255 бит данных в одном направлении.
Для максимального упрощения ISR они не должны различаться для приема и передачи. При каждом запуске функции UDRE ISR отправляется один бит из буфера данных. RXC ISR принимает тот же бит и помещает его назад в буфер данных независимо от того, в каком направлении данные были отправлены. В процессе передачи отправленные данные будут идентичны принятым данным и буфер данных остается неизменным. В процессе приема передаваться должны только ‘1’, т.к. сигнал ‘Запись лог.1’ эквивалентен сигналу чтение. Для нахождения значения, записанного подчиненным, осуществляется выборка сигнала. После этого, значение размещается в буфере данных.
Три глобальных флага индицируют состояние драйвера 1-Wire: занят, присутствие и ошибка. Флаг «занят» устанавливается, если имеются данные для передачи. Флаг «присутствие» устанавливается, если во время отправки сигнала «Сброс» обнаруживается сигнал «Присутствие». Данный флаг остается установленным до следующего сигнала «Сброс», на который не будет отклика сигналом «Подтверждение». Флаг «Ошибка» устанавливается, когда приемник УАПП определяет ошибку кадра. В этой ситуации необходимо передать новый сигнал «Сброс». Этим осуществляется сброс всех подчиненных устройств на шине, а также внутреннего состояния процедур UDRE и RXC ISR.
Все процедуры ISR должны выполняться как можно более быстро. Более сложные функции, например, команды ПЗУ, не реализуются данными ISR. Вложенные примеры кодов программы показывают, как данное поведение реализуется в виде цифрового автомата.
Процедуры обработки прерываний
Блок-схемы процедур ISR показаны на рисунках 17 и 18. Процедура UDRE ISR обрабатывает прерывание по освобождению регистра данных УАПП и выполняется всякий раз, когда освобождается место для данных в передающем буфере УАПП. Процедура RXC ISR отвечает за обработку прерывания по завершению приема УАПП и выполняется всякий раз, когда завершен прием и данные размешаются в приемном буфере УАПП.
Рисунок 17 – Процедура обслуживания прерывания UDRE
Рисунок 18 – Процедура обслуживания прерывания RXC
Вспомогательные функции
Вспомогательные функции устанавливают некоторые параметры, которые необходимы для выполнения автоматической управляемой прерываниями передачи. После отправки всех необходимых параметров инициируется передача путем разрешения прерывания UDRE.
Блок-схемы вспомогательных функций приведены на рисунке 19.
Обратите внимание, что функция ReceiveData (прием данных) заполняет буфер данных логическими 1 и вызывает функцию TransmitData (передача данных). Функция RXC ISR осуществляет выборку сигнала и размещает считанное значение из подчиненного устройства в буфере данных.
Рисунок 19 – Вспомогательные функции
Вычисление CRC-кода
Описанный ниже алгоритм используется для вычисления двух разных CRC-кодов.
Результатом вычисления CRC может быть значение 0 или “seed”. Последовательность вычислений следующая:
- Нахождение логического исключающего ИЛИ между младшим битом CRC и младшим битом данных.
- Если результат равен 0, то:
a. Сдвиг вправо CRC.
- Если результат равен 1:
a. Поиск нового значения CRC путем вычисления логического исключающего ИЛИ между CRC и полиномом CRC.
b. Сдвиг вправо CRC.
c. Установка старшего бита CRC к 1.
- Сдвиг вправо данных.
- Повтор данной последовательности 8 раз.
Данный алгоритм может использоваться для вычисления, как CRC8, так и CRC16. Отличие состоит только в разрядности сдвигового регистра (8 разрядов для CRC8, 16 разрядов для CRC16) и значении полинома. Данное значение моделируется схемой из логических элементов исключающее ИЛИ. Значение полинома равно 18h для CRC8 и 4002h для CRC16.
Алгоритмы реализованы для поиска значения CRC для одного байта при однократном выполнении, но CRC “seed” размещается в качестве аргумента в процедуры CRC. Таким образом, результат одной операции CRC может быть указан в следующий раз вместе со следующим байтом и в результате вычисляется CRC от произвольного количества байт.
Проверка CRC для 64-разрядного идентификатора реализуется OWI_CheckRomCRC. Она вычисляет значение CRC8 первых 56 бит, а затем сравнивает его с последними 8 битами идентификатора.
Примеры кодов программ
В состав «Рекомендаций» входят два примера, которые показывают, как использовать различные реализации драйвера 1-Wire.
Пример с опросом
Пример кода с опросом выполняет поиск шин, определенных значением “BUSES” для устройств. Устройства запоминаются в массиве с типом OWI_device. OWI_device – структура, содержащая информацию о том, какая шина устройства подключена и какой у него 64-разрядный идентификатор. Затем драйвер выполняет поиск доступных подчиненных устройств, а именно датчика температуры DS1820 и цифрового потенциометра DS2890. Если один или более этих устройств обнаружены на шине, то с ними будет установлена постоянная связь по замкнутому циклу. При каждой итерации считывается значение температуры и увеличивается положение «движка» потенциометра DS2890. Температура выводится на порт В (PORTB), что можно наблюдать с помощью светодиодов, если использовать плату STK500.
Данный пример реализован для демонстрации, как использовать различные части драйвера. Код носит достаточно общий характер и не оптимизирован под конечное использование. С учетом этого, обратите внимание, что данный пример не подходит для микроконтроллеров с размером памяти программ менее 4 кбайт. Однако сам драйвер подходит для всех микроконтроллеров AVR, в т.ч. с памятью программ 1 кбайт.
Пример с управлением по прерываниям
Данный пример реализован как цифровой автомат. Если драйвер не занят, то данные передаются по шине. Если драйвер занят, цифровой автомат обходится для выполнения других задач. При составлении программы, полагалось, что к шине подключен один единственный датчик температуры DS1820. Программа выполняет считывание текущей температуры и вычисляет CRC, чтобы гарантировать корректность считывания. После этого значение температуры помещается в глобальную переменную. Всякий раз, когда драйвер занят, во внутреннем цикле температура выводится на порт PORTB. При использовании платы STK500 состояние данного порта можно наблюдать по свечению светодиодов.
Начало работы
Далее рассматриваются рекомендации по началу работы с примерами кодов.
Исходный код
Исходный код может быть загружен в zip-архиве с сайта www.atmel.com. Распакуйте исходный код в директорию по собственному усмотрению. При этом необходимо сохранить структуру директорий внутри архива. Внутри архива имеется три поддиректории: “polled”, “interrupt_driven” и “common_files”. “common_files” содержит CRC-функции, общие определения и определения для специфических устройств, используемые в драйверах УАПП. “polled” и “interrupt_driven” содержат драйверы и примеры кодов.
В каждой директории имеется файл “source.doc”. В данных файлах содержится документация на исходный код. Если необходимо изучить подробности по использованию различных драйверов, то необходимо ознакомиться с данной документацией.
Драйвер с опросом
Короткое описание каждого файла данного драйвера представлено в таблице 5.
Таблица 5 – Файлы драйвера с опросом
Файл |
Содержимое |
main.c |
Пример кода программы с использованием драйвера с опросом. |
OWISWBitFunctions.c |
Реализация функции битового уровня программным способом. |
OWIUARTBitFunctions.c |
Реализация функций битового уровня на УАПП. |
OWIBitFunctions.h |
Общий файл-заголовок для OWISWBitFunctions.c и OWIUARTBitfunctions.c. |
OWIHighLevelFunctions.c |
Функции высокого уровня. |
OWIHighLevelFunctions.h |
Файл-заголовок для OWIHighLevelFunctions.c. |
OWIPolled.h |
Конфигурационный файл-заголовок для драйверов с опросом. |
source.doc |
Документация на исходный код в данной папке. |
Для начала работы с данным драйвером рекомендуется придерживаться следующей последовательности:
- Создайте новый проект в <IAR embedded workbench>.
- Добавить все файлы *.c из директорий "polled" и "common_files".
- Выполните команду меню project -> options: При этом появляется диалоговое окно.
- В категории "General/Target" убедитесь, что выбрано корректное устройство и модель памяти.
- В категории "General/Library configuration" выберите опцию "Enable bit definitions in I/O include files".
- В категории "General/System" установите значение Data stack (CSTACK) равным 0x40, а Return stack (RSTACK) - 0x10. Это необходимо для работы примера программы с интенсивным использованием памяти. Меньшие значения стека могут быть приемлемы для других приложений, использующих этот драйвер.
- Если для отладки используется AVRStudio, то необходимо изменить формат выходных данных. В категории XLINK/Output выберите Format/Other, а затем установите "ubrof 8 (forced)" из ниспадающего списка "Output format".
- Откройте файл "OWIPolled.h" для редактирования и найдите раздел "User defines".
- Выберите какой тип драйвера Вас интересует, программный или УАПП, путем удалении символов комментария (//) перед нужной строкой и, наоборот, добавления символов комментария в начало ненужной строки.
- Перемещайтесь вниз к разделу с выбранным драйвером.
- Настройте определения в этом разделе в соответствии с аппаратными настройками, как описано в файле.
- Проект готов для компиляции.
Драйвер с управлением по прерываниям
В таблице 6 представлено короткое описание каждого файла данного драйвера.
аблица 6 - Файлы драйверов с управлением по прерываниям
Файл |
Описание |
main.c |
Пример кода для драйвера с управлением по прерыванию. |
OWIInterruptDriven.h |
Конфигурационный файл-заголовок для драйвера с управлением по прерываниям. |
OWIIntFunctions.c |
Реализация функций обработки прерываний и вспомогательных функций. |
OWIIntFunctions.h |
Файл-заголовок для OWIIntFunctions.c. |
source.doc |
Документация на исходный код в данной папке. |
Для начала работы с данным драйвером рекомендуется придерживаться следующей последовательности:
- Создайте новый проект в <IAR embedded workbench>.
- Добавить все файлы *.c из директорий "polled" и "common_files".
- Выполните команду меню project -> options: При этом появляется диалоговое окно.
- В категории "General/Target" убедитесь, что выбрано корректное устройство и модель памяти.
- В категории "General/Library configuration" выберите опцию "Enable bit definitions in I/O include files".
- В категории "General/System" установите значение Data stack (CSTACK) равным 0x40, а Return stack (RSTACK) - 0x10. Это необходимо для работы примера программы с интенсивным использованием памяти. Меньшие значения стека могут быть приемлемы для других приложений, использующих этот драйвер.
- Если для отладки используется AVRStudio, то необходимо изменить формат выходных данных. В категории XLINK/Output выберите Format/Other, а затем установите "ubrof 8 (forced)" из ниспадающего списка "Output format".
- Откройте файл "OWIInterruptDriven.h" для редактирования и найдите раздел "User defines".
- Измените определения в разделе "User defines" в соответствии с аппаратными установками.
- Проект готов для компиляции.
Ссылки по теме:
|
|
133 Kb Engl Исходный фаил |
|
|
225 Kb Engl Програмное обеспечение |
Частные объявления аренда спецтехники
|