Интерфейс 1-Wire
Введение
Интерфейс 1-Wire разработан фирмой Dallas Semiconductor®,
все права на этот интерфейс принадлежат исключительно этой фирме (которая, впрочем уже давно
прекратила свое самостоятельное сущестование и перешла под крыло корпорации MAXIM Inc.).
Фирменная документация по указанному интерфейсу и устройствах, его поддерживающих,
находится здесь.
Чем привлекателен этот интерфейс? Разумеется, малым количеством выводов МК,
требующихся для подключения практически неограниченного количества микросхем.
В самом деле, двусторонний обмен требует всего 1 линию! Кроме того, ассортимент устройств
с этим интерфейсом весьма широк. Наконец, протокол обмена по этому интерфейсу очень прост
и легко реализуется программно практически на любых микроконтроллерах (МК).
На рисунке показана упрощённая схема аппаратной реализации интерфейса 1-Wire. Вывод DQ
устройства представляет собой вход КМОП-логического элемента, который может быть зашунтирован
(замкнут на общий провод) полевым транзистором. Сопротивление канала этого транзистора в
открытом состоянии – около 100 Ом. Когда транзистор заперт – имеется небольшой
ток утечки (примерно 5 мкА) на общий провод.
Шина 1-Wire должна быть подтянута отдельным резистором к напряжению питания устройств
(которое, кстати, может быть от 3 до 5В – уточняется по характеристикам конкретного
устройства). Сопротивление этого резистора 4.7 К, однако, это значение рекомендовано только
для достаточно коротких линий. Если шина 1-Wire используется для подключения удалённых на
большое расстояние устройств, то сопротивление этого резистора следует уменьшить.
Ниже будут описаны причины необходимости такого уменьшения сопротивления.
Минимально допустимое сопротивление этого резистора – около 300 Ом, а максимальное – около
30 кОм. Данные величины – ориентировочные, точные значения следует уточнить
по характеристикам конкретного устройства 1-Wire (по его максимальному втекающему току линии
DQ, который, собственно, и определяет минимум внешнего сопротивления).
Подключение шины 1-Wire к МК показано условно в двух вариантах: с использованием двух отдельных выводов МК
(один в качестве выхода, а другой в качестве входа), так и одного, работающего и на ввод и на вывод.
Разделение этих способов показано пунктирной линией, условно обозначающей границу корпуса МК.
Логическое строение шины 1-Wire как можно рассматривать как соединение выводов микросхем с
открытым коллектором по схеме "монтажное И". Передача данных при этом возможна только выдачей
низкого логического уровня в линию (замыканием её на общий провод), а высокий логический уровень
формируется благодаря наличию внешнего подтягивающего резистора.
Рассмотрим обмен информацией по шине 1-Wire:
- Обмен всегда ведется по инициативе одного ведущего устройства, которое в большинстве случаев
является микроконтроллером (МК)
- Любой обмен информацией начинается с подачи импульса сброса ("Reset Pulse" или просто RESET) в
линию 1-Wire ведущим устройством
- Для интерфейса 1-Wire в общем случае предусматривается "горячее" подключение и отключение устройств
- Любое устройство, подключенное к 1-Wire после получения питания выдает в линию DQ импульс
присутствия ("Presence pulse" или просто PRESENCE). Этот же импульс устройство всегда выдает в
линию, если обнаружит сигнал RESET
- Появление в шине 1-Wire импульса PRESENCE после выдачи RESET однозначно свидетельствует о
наличии хотя бы одного подключенного устройства
- Обмен информацией ведётся так называемыми тайм-слотами: один тайм-слот служит для обмена одним
битом информации
- Данные передаются побайтно, бит за битом, начиная с младшего бита. Достоверность переданных/принятых
данных проверяется контрольной суммой CRC
На нижеприведённом рисунке показана диаграмма сигналов RESET и PRESENCE, с которых всегда начинается
любой обмен данными.
Выдача импульса RESET в процессе обмена служит для досрочного завершения процедуры обмена информацией.
Длительность большинства временных интервалов очень приблизительная и имеет ограничение только по
минимуму.
Импульс RESET формирует ведущий МК, переводя в низкий логический уровень шину 1-Wire и удерживая её в
этом состоянии минимум 480 микросекунд. Затем МК должен "отпустить" шину. Через некоторое время,
зависящее от ёмкости линии и сопротивления подтягивающего резистора, в линии установится высокий
логический уровень.
Протокол 1-Wire ограничивает это время "релаксации" диапазоном от 15 до 60 мкс, что и
является определяющим для выбора подтягивающего резистора (как правило, ёмкость линии существенно
изменить сложно, а именно она оказывает наибольшее влияние на время возврата линии к высокому
логическому уровню).
Обнаружив импульс RESET, ведомое устройство приводит свои внутренние узлы в исходное состояние
и формирует ответный импульс PRESENCE, как следует из рисунка – не позже 60 микросекунд после
завершения импульса RESET. Для этого устройство переводит в низкий уровень линию DQ и удерживает её
в этом состоянии от 60 до 240 мкс. Конкретное время удержания зависит от многих параметров,
но всегда находится в указанном диапазоне. После этого устройство так же "отпускает" шину.
После завершения импульса PRESENCE устройству даётся ещё некоторое время для завершения внутренних
процедур инициализации, таким образом, МК должен приступить к любому обмену с устройством не ранее,
чем через 480 микросекунд после завершения импульса RESET.
Таким образом процедура инициализации интерфейса 1-Wire, с которой начинается любой обмен данными
между устройствами, длится минимум 960 микросекунд и состоит из передачи от МК сигнала RESET и приёма
от устройства сигнала PRESENCE. Если сигнал PRESENCE не обнаружен – значит на шине 1-Wire нет
готовых к обмену устройств.
Теперь рассмотрим процедуры обмена битами информации, которые осуществляются определёнными тайм-слотами.
Тайм-слот – это определённая, довольно жёстко лимитированная по времени последовательность смены
уровней сигнала в линии 1-Wire. Различают 4 типа тайм-слотов:
- Передача "1" от МК
- Передача "0" от МК
- Приём "1" от устройства
- Приём "0" от устройства
Любой тайм-слот всегда начинает МК путём перевода шины 1-Wire в низкий логический уровень.
Длительность любого тайм-слота должна находиться в пределах от 60 до 120 микросекунд.
Между отдельными тайм-слотами всегда должен предусматриваться интервал не менее 1 микросекунды
(конкретное значение определяется параметрами ведомого устройства). Тайм-слоты передачи отличаются
от тайм-слотов приёма поведением МК: при передаче он только формирует сигналы, при приёме ещё и
опрашивает уровень сигнала в линии 1-Wire.
Следующй рисунок демонстрирует временные диаграммы тайм-слотов всех четырёх типов: вверху показаны
тайм-слоты передачи от МК, внизу – приёма от устройства.
Тайм-слот передачи "0" заключается просто в удержании шины 1-Wire в низком уровне в течение всей
длительности тайм-слота. Передача "1" осуществляется путём "отпускания" шины 1-Wire со стороны МК не
ранее, чем через 1 мкс после начала тайм-слота, но не позже чем через 15 мкс.
Ведомое устройство опрашивает уровень в шине 1-Wire в течение временного интервала, условно
показанного в виде серого прямоугольника, то есть, начиная с 15-ой микросекундой от начала тайм-слота и
заканчивая 60-ой микросекундой от начала. Типичный момент ввода уровня в устройство – около 30-ой
микросекунды от начала тайм-слота.
Заштрихованная область – это область "нарастания" уровня в шине 1-Wire, которая зависит от
ёмкости линии и сопротивления подтягивающего резистора, она приведена для справки.
Тайм-слоты приёма информации отличаются тем, что МК формирует только начало тайм-слота
(абсолютно так же, как при передаче "1"), а затем управление уровнем шины 1-Wire берёт на себя устройство,
а МК осуществляет ввод этого уровня так же в определённой зоне временных интервалов.
Эта зона, как видно из рисунка, довольно мала. Как и раньше, заштрихованная область – область
неопределённости, поэтому для ввода МК остаётся даже не промежуток, а скорее конкретный момент,
когда он должен ввести уровень сигнала из линии. Этот момент времени – 14-ая или 15-ая микросекунда
от начала тайм-слота. Разумеется, если линия имеет малую ёмкость, а подтягивающий резистор мал,
зона опроса несколько расширяется, однако рекомендуетя ориентироваться на худший вариант, чтобы
всегда обеспечить надёжный обмен данными.
Таким образом МК начинает тайм-слот с выдачи в шину 1-Wire "0" в течение 1 мкс. Последующий уровень
зависит от типа тайм-слота: для приёма и передачи "1" уровень должен стать высоким, а для передачи "0" –
оставаться низким вплоть до конца тайм-слота, то есть не менее 60 и не более 120 мкс. Если МК принимает
данные, то опрос уровня в шине он должен сделать на промежутке от 13-jй до 15-jй микросекунде тайм-слота.
МК должен обеспечить интервал между отдельными тайм-слотами не менее 1 мкc.
Следует очень тщательно подходить к обеспечению в шине 1-Wire требуемых временных интервалов, так как,
например, увеличение длительности тайм-слота вывода "0" свыше рекомендованного значения может привести к
ошибочному восприятию этого тайм-слота, как сигнала RESET, и, разумеется, после этого вся процедура
обмена пойдёт неверно. Так же следует учитывать влияние самой линии на длительность фронтов импульсов.
Поэтому в общем случае, это не простая задача, но выполнение несложных рекомендаций позволит её решить
достаточно простыми средствами.
Во-первых, все сигналы, которые должен формировать МК, следует формировать по принципу необходимого
минимума длительности (то есть немного больше, чем указанная минимальная длительность), а от
устройства следует ожидать сигналов по принципу наихудшего (то есть ориентироваться на самые
худшие варианты временных параметров сигнала).
Если разрабатывается схема, которая целиком умещается на одной плате вместе со всеми устройствами на
шине 1-Wire, то в результате получается практически идеальная линия. Фронты нарастания высокого уровня
в шине будут минимальными, а это избавит от большинства проблем.
Но если несколько устройств подключается через длинный соединительный шлейф – придётся бороться с
погонной ёмкостью линии. При это следует учитывать, что соединение по свитым вручную обычным монтажным
проводам при типовом подтягивающем резисторе возможно на расстоянии до 10 м, а для соединения по
очень длинной телефонной "лапше" может потребовать уменьшения подтягивающего резистора до 510 ом и даже менее.
Разобравшись с процедурами обмена битами можно приступать к более высокому уровню протокола обмена
информацией,а для этого необходимо рассмотреть принципы адресации устройств и управления ими.
Каждое устройство 1-Wire обладает уникальным идентификационным 64-битным номером, программируемым
на этапе изготовления микросхемы. Фирма-производитель гарантирует, что не найдется двух микросхем с
одинаковым идентификационным номером.
При рассмотрении протокола обмена будем считать, что на шине 1-Wire имеется более одного устройства.
В этом случае перед МК встают две проблемы – определение количества имеющихся устройств
и выбор (адресация) одного из них для обмена данными.
Решение первой проблемы осуществляется двумя путями:
- Автоматическое определение адресов всех подключенных устройств
- Ручное заданите адреса
Первый способ требует довольно сложного программно-реализуемого алгоритма поиска адресов.
Здесь он рассматриваться не будет, так как это потребовало бы отдельной статьи. Более подробно
можно почитать о нем в документе
Application Note 162.
Второй способ заключается в том, что номера всех используемых 1-Wire-устройств необходимо
определить заранее, а потом просто использовать их как константы в программе МК. Номера некоторых
устройств нанесены прямо на корпусе микросхем (например, для устройств iButton –
всем известных ключей-таблеток), а номера других можно определить при помощи специальных программ
или устройств (о них в конце статьи).
iButton - зарегистрированная торговая марка, права на которую принадлежат Dallas Semiconductor®,
дополнительная информация об этом семействе изделий находится
здесь.
Итак, после того, как стали известны номера всех устройств 1-Wire на шине, работа с ними
ведётся следующим образом. МК посылает импульс RESET, и все имеющиеся устройства выдают PRESENCE.
Затем МК посылает команду, которую принимают все устройства. Определено несколько общих команд для
всех типов 1-Wire-устройств, остальные команды уникальны для отдельных типов.
Наибольшую важность среди общих команд имеют следующие:
Команда
|
Значение байта
|
Описание
|
READ ROM
|
0x33
|
Чтение адреса устройства – используется для определения адреса единственного
устройства на шине
|
MATCH ROM
|
0x55
|
Выбор адреса – используется для обращения к конкретному адресу устройства из
многих подключенных
|
SKIP ROM
|
0xCC
|
Игнорировать адрес – используется для обращения к единственному устройству на шине,
при этом адрес устройства игнорируется (можно обращаться к неизвестному устройству)
|
Команда READ ROM позволяет определить адрес имеющегося устройства перед его установкой в готовое изделие.
После того, как МК выдаст команду READ ROM, от устройства поступит 8 байт его собственного уникального
адреса – МК должен их принять.
Если отправлена команда MATCH ROM, то после неё МК должен передать так же и 8 байт конкретного адреса
устройства, с которым будет осуществляться последующий обмен данными. Это равносильно выставлению
адреса на параллельной шине в микропроцессорных устройствах. Приняв эту команду, каждое устройство
сравнивает передаваемый адрес со своим собственным. Все устройства, адрес которых не совпал, прекращают
анализ и выдачу сигналов в линии 1-Wire, а опознавшее адрес устройство продолжает работу.
Теперь все данные, передаваемые МК будут попадать только к этому "адресованному" устройству.
Если устройство одно на шине, можно ускорить процесс взаимодействия с ним при помощи команды SKIP ROM.
Получив эту команду, устройство сразу считает адрес совпавшим, хотя никакого адреса за этой командой не
следует. Некоторые процедуры не требуют приёма от устройства никаких данных, в этом случае команду
SKIP ROM можно использовать для передачи какой-то информации сразу всем устройствам. Это можно использовать,
например, для одновременного запуска цикла измерения температуры несколькими датчиками-термостатами
типа DS18S20.
Приём и передача байтов всегда начинается с младшего бита. Порядок следования байтов при передаче
и приёме адреса устройства так же ведётся от младшего к старшему. Порядок передачи другой информации
зависит от конкретного устройства, поэтому следует обращаться к его документации.
Структура уникального 64-битного номера
Уникальный номер любого устройства 1-Wire состоит из восьми байт – одного байта идентификатора
семейства (8 бит), шести байт (48 бит) собственно уникального адреса и одного байта (8 бит)
контрольной суммы CRC всех предыдущих байтов.
Контрольная сумма CRC – это байт, значение которого передается самым последним и вычисляется
по специальному алгоритму на основе значения всех семи предыдущих байтов. Алгоритм подсчёта таков,
что если все байты переданы-приняты без искажений, принятый байт контрольной суммы обязательно
совпадет с рассчитанным в МК значением. То есть при реализации программного алгоритма обмена информацией
необходимо при передаче и приёме байтов подсчитывать их контрольную сумму по строго определённому алгоритму,
а затем либо передать полученное значение (если велась передача адреса/данных), либо сравнить расчётное
значение с принятым значением CRC. Только при совпадении обоих CRC МК и устройство считают принятые
данные достоверными. В противном случае продолжение обмена невозможно.
Алгоритм расчёта CRC стандартизирован и описан в документе
Application Note 27
Код семейства определяет номер группы, к которой принадлежит конкретное устройство и для микросхем
одного семейства будет одинаковым. Зная код семейства из неизвестного устройства можно довольно точно
определить его функциональное назначение и даже некоторые параметры.
Список некоторых кодов семейств 1-Wire-устройств приведён ниже:
Код семейства (HEX)
|
Устройство iButton
|
Описание
|
01
|
DS1990A, DS2401
|
Уникальный серийный номер-ключ
|
04 |
DS1994, DS2404 |
4 КБ NV RAM + часы, таймер и будильник |
05 |
DS2405 |
Одиночный адресуемый ключ |
06 |
DS1993 |
4 КБ NV RAM* |
08 |
DS1992 |
1 КБ NV RAM |
09 |
DS1982, DS2502 |
1 КБ PROM** |
0A |
DS1995 |
16 КБ NV RAM |
0B |
DS1985, DS2505 |
16 КБ EEPROM*** |
0F |
DS1986, DS2506 |
64 КБ EEPROM |
10 |
DS1920, DS1820, DS18S20, DS18B20 |
Датчик температуры |
12 |
DS2406, DS2407 |
1 КБ EEPROM + двухканальный адресуемый ключ |
14 |
DS1971, DS2430A |
256 бит EEPROM и 64 бита PROM |
1A |
DS1963L |
4 КБ NV RAM + счётчик циклов записи |
1D |
DS2423 |
4 КБ NV RAM + внешний счётчик |
20 |
DS2450 |
Четырёхканальный АЦП |
24 |
DS1904, DS2415 |
Часы реального времени |
26 |
DS2438 |
Датчик температуры, АЦП |
2C |
DS2890 |
Цифровой потенциометр |
30 |
DS2760 |
Датчик температуры, тока, АЦП |
* NV RAM – Non-Volatile Random-Access Memory (энергонезависимое ОЗУ)
** PROM – Programmable Read-Only Memory (однократно программируемое ПЗУ)
*** EEPROM – Electrically Erasable Programmable Random-Access Memory (электрически стираемое перепрограммируемое ПЗУ)
В этой таблице, содержащей неполный перечень семейств 1-Wire-устройств, во втором столбце в скобках
указаны типы микросхем в корпусах-таблетках iButton, а без скобок – в различных корпусах
для монтажа на плату.
Паразитное питание устройств 1-Wire
Спецификация этих устройств допускает их питание от самой линии данных, то есть микросхема может
получать питание по собственной (и единственной) линии данных. Не все устройства поддерживают такой
режим питания, но очень многие, например, термометр-термостат DS18B20 или ключ-таблетка DS1990A.
Теперь ясно почему низкий уровень сигнала в шине 1-Wire имеет такие жёсткие временные рамки –
десятки микросекунд. Это связано с необходимостью обеспечивать питанием те устройства, которые получают
его от шины. Потребление тока всех устройств 1-Wire очень малое, поэтому ёмкости встроенных конденсаторов
достаточно для поддержания в рабочем состоянии схемы устройства в течение небольшого интервала,
когда на шине 1-Wire установлен низкий логический уровень.
При паразитном питании возможности устройств несколько уменьшаются, что проявляется в ухудшении работы
на линию с большой собственной ёмкостью (то есть линию большой протяжённости). Поэтому связь с устройствами,
использующими паразитное питание, возможна на относительно небольших расстояниях. Кроме того,
паразитное питание часто сопровождается дополнительными побочными эффектами, которые описываются в
документации на конкретные изделия.
Подытожим основные шаги по его успешной реализации:
- Любой обмен информацией начинается с передачи импульса RESET и приёма имульса PRESENCE
- Если импульса PRESENCE не обнаружено – на шине нет устройств
- МК всегда инициирует обмен, начиная каждый тайм-слот обмена битом информации
- Временные параметры каждого тайм-слота следует соблюдать с максимально возможной точностью
- Для выбора одного из нескольких устройств на шине 1-Wire МК должен передать в шину команду MATCH ROM,
а затем 8 байт адреса устройства, последний байт – контрольная сумма предыдущих семи
- Если устройство на шине одно – МК может узнать его адрес путём посылки команды READ ROM,
после чего принять от устройства 8 байтов адреса, последний из которых также будет контрольной суммой
- Для работы с единственным устройством на шине можно отказаться от указания его адреса,
для этого МК должен передать устройству команду SKIP ROM, после чего можно начинать обычный обмен данными
- Любая начатая процедура обмена может длиться сколь угодно долго за счёт пауз между отдельными тайм-слотами,
но всегда должна быть завершена полностью
- Прервать начатый обмен можно в любой момент путём выдачи импульса RESET в шину 1-Wire