Вы находитесь на странице: 1из 11

ИНТЕРФЕЙС 1-WIRE

1-Wire – протокол передачи данных в обе стороны по одному проводу.

Данный протокол разработан корпорацией DallasSemiconductor (сейчас


MaximIntegrated) в далёких 90-х, но активно используется и сейчас: именно
на 1-Wire работает большинство "таблеток" - домофонных чипов (DS1990A),
карточек доступа, а также через 1-Wire общаются популярные датчики
температуры (DS18S20 и DS18B20),

Режим связи в этом протоколе – асинхронный и полудуплексный, а


также "остроконечный" (при отсылке многобайтовых целых передача идёт от
младшего байта к старшему).

При этом всегда есть ведущий – одно устройство на шине, которое


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

Ещё раз подчеркнём – на шине может быть только ОДИН ведущий –


иначе возникнут конфликты, когда оба ведущих будут тянуть одеяло на себя
(на самом деле, есть некоторые приёмы организации сетей 1-Wire в режиме
мультимастера – например, с помощью ветвителя сети DS2409 – но в
"обычной" жизни все-таки предпочтительней иметь только одного ведущего
на шине).

Протокол 1-Wire хорош тем, что не сложен в реализации и требует для


связи всего два-три провода (шина данных, земля и при необходимости
питание); однако при этом он не лишён и недостатков – этот протокол весьма
чувствителен ко времени и к помехам. Также 1-Wire не предназначена для
передачи больших объёмов информации и для скоростного обмена данными
– максимальная скорость 9600 Бод/с.

1
Протокол 1-Wire описывает физический, канальный, сетевой и
транспортный уровни взаимодействия.

На физическом уровне даются описания способов подключения,


требования к шине данных и питанию и т.д.

Канальный уровень описывает способы чтения и передачи битов по


протоколу.

Сетевой уровень описывает способы адресации к различным


устройствам на линии.

Наконец, транспортный уровень описывает функциональные


команды, используемые устройствами 1-Wire.

ФИЗИЧЕСКИЙ УРОВЕНЬ ПРОТОКОЛА

Физически для организации интерфейса необходимы как минимум


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

2
Рисунок 1. Пример подключения ведущего и ведомых устройств по
протоколу 1-Wire.

Упрощенный пример подключения шины представлен на рисунке 1:


так, у нас есть ведущее устройство и три ведомых, Slave1, Slave2 и Slave3.
Шина данных (data) подтянута резистором к питанию и к ней присоединены
все четыре устройства; также каждое из устройств подсоединено к земле.
Master, Slave2 и Slave3 подключены к питанию (от 3 до 5 В, в зависимости от
требований устройств), а устройство Slave1 питается паразитно через шину
данных (об этом подробнее ниже).

К слову, о питании – согласно даташиту, шина данных должна быть


подтянута к питанию резистором 4.7 кОм, однако данный номинал
используется при относительно коротких линиях; если же расстояние между
устройствами достаточно велико, то сопротивление резистора можно
уменьшить.

КАНАЛЬНЫЙ УРОВЕНЬ ПРОТОКОЛА

Обмен информацией ведётся так называемыми временными, или тайм-


слотами (60 мкс): один тайм-слот служит для обмена одним битом
информации. Данные передаются бит за битом, начиная с младшего бита
младшего байта – это, кстати, достаточно часто приводит к ошибкам у

3
новичков – кажется, что нужно передавать данные слева направо, так, как
они хранятся в памяти (то есть, следите за словами: кажется, что нужно
начинать со старшего бита младшего байта (вы уже запутались, да?) – но нет!
При передаче по 1-Wire, например, двухбайтового числа порядок передачи
будет таким:

Имеем число 10234 – в двоичном виде выглядит так:

0010 0111 1111 10102


В памяти (так как у нас "остроконечный" порядок хранения данных)
выглядит так: 11111010 00100111. А передача по 1-Wire будет выглядеть
так:

0→1→0→1→1→1→1→1→1→1→1→0→0→1→0→0
Идём дальше. При обмене информацией ведущий инициирует каждую
связь на битном уровне. Это означает, что передача каждого бита,
независимо от направления (передача или приём), должна быть
инициирована ведущим. Шина данных по умолчанию подтягивается к
"единице", поэтому для начала как приёма, так и для передачи ведущий
опускает линию в "ноль" на некоторое время.

Внимание: ни ведущий, ни ведомые не выставляют на шине


"единицу" - это чревато коротким замыканием: если одно устройство
выставит на шине "1", а другое – "0"; поэтому как ведущий, так и ведомый
могут использовать только два состояния: "на выход в ноль" и "z-
состояние" (на вход без подтяжки). Подтяжка к питанию осуществляется
резистором (!).

4
Рассмотрим 5 основных команд для связи по шине 1-Wire: "Запись 1",
"Запись 0", "Чтение", "Сброс" и "Присутствие". При этом на
рисунках красным выделено управление линией от ведущего, синим –
управление линией от ведомого, черным – освобожденная линия (с
помощью подтяжки шина автоматически переходит в "единицу").

Сигнал "Запись 1". Ведущий устанавливает низкий уровень в течение


1…15 мкс. После этого, в течение оставшейся части временного слота он
освобождает шину.

Сигнал "Запись 0". Ведущий формирует низкий уровень в течение не менее


60 мкс, но не дольше 120 мкс.

Сигнал "Чтение". Ведущий устанавливает низкий уровень в течение 1…15


мкс. После этого подчинённый, если хочет передать 0, удерживает шину в
низком состоянии до 60 мкс; если же подчинённый хочет передать 1, то он
просто освобождает линию. Ведущий обычно сканирует состояние шины по
истечении 15 мкс после установки низкого уровня на шине.

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

5
Сигнал "Чтение при получении 1":

Сигнал "Чтение при получении 0":

Основные проблемы, которые возникают при реализации чтения-


записи – это проблемы со временем, то есть "невыдерживание", или
наоборот, "передерживание" временных задержек при чтении линии.
Возникают эти проблемы из-за того, что часто не делают поправку на
медленность языков программирования высокого уровня. Особенно это
касается различных "дополнительных" функций.

Сигнал "Сброс/присутствие". Здесь временные интервалы импульсов


отличаются. Ведущий устанавливает низкий уровень в течение 8 временных
слотов (480 мкс), а затем освобождает шину. Данный длительный период
низкого состояния называется сигнал "Сброс".

Если на шине присутствует подчинённый, то он должен в течение 60


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

Данная связка сигналов всегда начинает любой обмен информацией


между устройствами.

6
Помимо этого, нужно учитывать, что любое ведомое устройство после
получения питания сразу же выдаёт сигнал присутствия.

Сигнал "Сброс" позволяет ведущему досрочно завершить обмен


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

О реализации: обычно необходимо запрограммировать


микроконтроллер как ведущее устройство, поэтому есть несколько советов:
микроконтроллеру стоит генерировать сигналы (опускание шины к земле)
чуть больше необходимого минимума по времени, а ответы от ведомых
устройств ждать по наихудшим прогнозам – тогда взаимодействие по
протоколу будет оптимальным.

При этом ведущему нужно не забывать периодически проверять


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

7
АЛГОРИТМ ВЗАИМОДЕЙСТВИЯ:

1. Ведущий посылает на линию сигнал reset ("Сброс"). После линия


освобождается для "ответных действий". Если на шине присутствует
ведомый, то в течение 60 мкс он сообщает о "присутствии".
Если же ведущий не получает отклика-"присутствия", то он считает, что
подключённых к шине устройств нет.
2. Далее следует сетевой уровень протокола: ведущий должен определить, к
какому из устройств на шине данных он будет дальше обращаться. Данный
выбор обеспечивается отсылкой одной из ROM-команд (длиной в 1 байт),
которые работают с уникальными кодами устройств:

8
Search ROM ($F0) – "поиск ROM". Если коды подключённых
устройств не известны, то эта команда позволяет ведущему определить
их. Подробное описание данной команды представлено ниже.
Read ROM ($33) – "чтение ROM" – команда используется, если мы
точно знаем, что у нас только одно подчинённое устройство (например,
только один датчик температуры или один домофонный ключ), тогда
для считывания его кода можно не париться с поиском ROM. При
получении данной команды все ведомые устройства на шине отсылают
свой уникальный код.
Skip ROM ($CC) – "пропуск ROM". Это команда используется, когда
необходимо дать команду всем устройствам на шине – например,
нужно, чтобы все подключённые датчики одновременно считали
температуру.
Match ROM ($55) – "совпадение ROM". Используется для выбора
конкретного подчинённого устройства на шине. После отсылки
команды ведущий передаёт 64-разрядный код. По завершении только
тому подчинённому устройству, которое приняло свой идентификатор,
разрешается отвечать после приёма следующего импульса сброса –
остальные же молча ждут импульса сброса.

Естественно, для отдельных устройств какие-то ROM-команды могут


добавляться.

3. Если были отправлены команды "Match ROM" или "Skip ROM", то далее
ведущий отправляет какую-либо функциональную команду – это уже
транспортный уровень протокола; при этом набор функциональных команд
и дальнейшее поведение (должен ли ведущий быть готов принимать данные
от выбранного ведомого устройства, например) зависит от конкретного
устройства 1-Wire.

9
Так, например, если у нас есть микроконтроллер и DS18S20 – датчик
температуры, и мы хотим получить от этого датчика значение температуры,
то алгоритм работы будет следующим:

1. МК отсылает импульс сброса


2. Датчик отвечает импульсом приветствия
3. МК отсылает адресную команду "Skip ROM" - так как датчик у нас на
линии один, то нам нет необходимости работать с "адресами"
4. МК отсылает функциональную команду "Convert T" - по этой команде
датчик температуры начнёт однократное температурное преобразование;
результат же этого преобразования будет записан в память датчика
5. МК ждёт, пока датчик закончит преобразование (ведомое устройство
никоим образом не может само сообщить, что оно "освободилось", поэтому
микроконтроллер просто ждёт время, указанное в даташите)
6. МК отсылает импульс сброса
7. Датчик отвечает импульсом приветствия
8. МК отсылает адресную команду "Skip ROM"
9. МК отсылает функциональную команду "ReadScratchpad" - по этой команде
датчик отсылает 9 байт своей памяти
10. МК считывает нужное количество байт (значение температуры содержится
в первых двух)
11. При необходимости МК завершает сеанс связи, отсылая импульс сброса

ПАРАЗИТНОЕ ПИТАНИЕ

Протокол 1-Wire позволяет ведомым устройствам при необходимости


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

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

УНИКАЛЬНЫЕ КОДЫ УСТРОЙСТВ 1-WIRE

Пару слов об уникальных кодах устройств, с которыми и работают ROM-


команды. Каждое "одноварное" устройство имеет свой 64-хбитный код,
состоящий из трёх частей:

Младший байт – это код семейства, к которому относится устройство, 6


следующих байт – уникальный в семействе серийный номер, ну и наконец,
старший байт – это CRC (Циклический избыточный код (англ. Cyclic
redundancy check)), который служит для проверки правильности приёма всего
кода. Так, например, на родных даллосовских (сейчас максимовских)
"таблетках" часть уникального кода – а именно, 48-битный серийный номер –
пишется на металле в шестнадцатиричном виде (все дружно посмотрели на
свои домофонные ключи).

11