[Home] [Donate!] [Контакты]

1-Wire интерфейс

Интерфейс 1-Wire хорошо подходит в тех случаях, когда требуется с минимальными затратами подключить несколько простых устройств с малым энергопотреблением к общей шине для обмена данными с ведущим устройством (мастером). При этом предполагается передача небольших объёмов информации и невысокая скорость обмена (16.4 кбит/с - теоретический предел для 1-Wire).

Оглавление
1-Wire интерфейс
Введение
Основные особенности 1-Wire
1-Wire vs UART
Реализация интерфейса 1-Wire на микроконтроллере
Сигналы 1-Wire
Сигнал сброса/присутствия
Запись бита
Запись бита 0
Запись бита 1
Чтение бита
Использование UART для реализации 1-Wire
Пример программной реализации 1-Wire с использованием UART
Смотрите также
Измерение температуры. Аналоговые и цифровые датчики. Цифровой датчик DS18B20
UART и USART. COM-порт

Введение

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

Основные особенности 1-Wire

Перечислим некоторые важные особенности интерфейса 1-Wire:

1-Wire vs UART

Может показаться, что 1-Wire интерфейс не даёт ничего нового по сравнению с классическим, всем известным и повсеместно используемым UART. Действительно, интерфейс UART достаточно гибок и предоставляет массу возможностей. Как и в 1-Wire, в UART возможна связь по одной линии и подключение к одной линии нескольких устройств. Техника паразитного питания от сигнальной линии также хорошо известна и давно применяется (пример из истории: питание COM-мышей от сигнальных линий COM-порта компьютера; COM-порт является вариантом реализации UART).

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

Серьёзной проблемой в случае UART может стать необходимость в довольно высокой точности согласования скоростей у обменивающихся информацией устройств. Дело в том, что UART-приёмнику для определения моментов, когда он должен считывать биты приходящих данных, получаемых от передатчика другого UART, требуется тактовый сигнал. Считывание оптимально производить в момент, приходящийся на середину импульса, соответствующего данному биту. Но поскольку UART не предусматривает передачу тактового сигнала, приёмник должен его формировать самостоятельно, основываясь на знании используемой скорости передачи и синхронизируясь с передатчиком по старт-битам. Расхождение между частотами тактового сигнала передатчика и приёмника приводит к смещению момента считывания бита относительно середины принимаемого импульса (бита). И если смещение превысит половину времени, отводимого на передачу бита (в реальности даже меньше в связи с наличием переходных процессов при переключении уровней сигнала), то вместо чтения очередного бита данных, произойдёт чтение соседнего, т.е. искажение принимаемых данных.

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

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

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

Именно такой фрейм с одним битом данных используется в 1-Wire (в терминологии 1-Wire фрейм называется слотом чтения/записи).

Но различия заключаются не только в размере фрейма, из 1-Wire исключены все "излишества" интерфейса UART. Исключена возможность настраивать скорость передачи (но зато снижены требования к точности длительностей импульсов; максимально допустимое значение может отличаться от минимального значения в разы). Однобитовость фрейма исключает возможность передачи бита чётности, но предусмотрена возможность контролировать целостность целых блоков данных с помощью CRC кодов. Ещё одна важная особенность 1-Wire, максимально упрощающая интерфейс - это полная пассивность ведомых устройств, инициатором любого обмена данными является ведущее устройство. Ведомые устройства лишены возможности передавать данные по своему желанию (тогда как в случае UART устройства равноправны), зато исключается возможность возникновения коллизий при передаче и упрощается применение "сильного подтягивания" для паразитного питания устройств со значительным потребляемым током.

В 1-Wire есть не только упрощения по сравнению с UART, но и нововведения. Например, наличие сигнала, обеспечивающего аппаратный сброс устройств; наличие у каждого устройства уникального кода и продуманная система адресации и перечисления устройств на шине.

Обобщая, можно сказать, что UART более универсален, но 1-Wire оказывается оптимальным в своей особой области применения. Окончательно проблема выбора решается тем, что существует множество полезных устройств, доступ к которым осуществляется по 1-Wire. И если мы хотим использовать эти устройства, то просто вынуждены использовать интерфейс 1-Wire.

Реализация интерфейса 1-Wire на микроконтроллере

Если очень постараться, можно найти микроконтроллер с аппаратной поддержкой 1-Wire. Таковыми являются, например, ARM Cortex-M4 микроконтроллеры MAX32620/MAX32621. Хотя, наверное, наличие данного интерфейса не является основным критерием выбора MCU и обычно в выбранном для использования микроконтроллере нет аппаратной поддержки 1-Wire.

Тогда для подключения датчиков или иных устройств с данным интерфейсом есть два пути. Можно воспользоваться одним из существующих готовых мостов для преобразования интерфейса 1-Wire в другой, более распространённый (например, DS2482-100 - мост I2C <-> 1-Wire; DS2480B - мост UART <-> 1-Wire). Или выполнить программную реализацию интерфейса, задействовав имеющиеся возможности микроконтроллера. Последний вариант по понятным причинам представляется довольно привлекательным.

Простейший вариант программной реализации 1-Wire рассматривается в статье "Пример использования цифрового датчика температуры DS18B20". Там приводится тривиальное решение: сигнал формируется/захватывается низкоуровневыми средствами ввода-вывода с помощью GPIO, моменты переключения состояния выхода и захвата данных на входе определяются по системному таймеру.

Другая, более интересная реализация рассматривается в статье "Использование UART для реализации 1-Wire". Как уже было отмечено, 1-Wire и UART имеют много сходного, в каком-то смысле 1-Wire является предельно упрощённым вариантом UART. Оказывается, сходство настолько велико, что можно непосредственно с помощью UART взаимодействовать с 1-Wire шиной. Благодаря поддержке UART множеством микроконтроллеров, отсутствию необходимости во внешних аппаратных средствах и простоте программного решения, этот метод реализации интерфейса 1-Wire оказался довольно популярным.

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

Сигналы 1-Wire

Протокол 1-Wire включает четыре вида сигналов в линии: импульс сброса/присутствия; запись нуля; запись единицы; чтение данных. Начинает формирование всех сигналов ведущее устройство (мастер). Ведомое устройство проявляет активность на шине только в ответ на сигналы сброса (сигналом присутствия) и на слоты чтения (если текущее состояние ведомого устройства предполагает необходимости ответить нулевым битом). Всё остальное время ведомое устройство только слушает шину.

В состоянии ожидания, когда все устройства освобождают шину и никакие данные по ней не передаются, за счёт подтягивающего резистора в шине устанавливается высокий уровень (с напряжением VPUP, рис. %img:signaling).

Переходные процессы при переключениях в шине 1-Wire.
Рис. %img:signaling

На входах устройств 1-Wire в целях увеличения помехозащищённости имеются триггеры Шмитта, обеспечивающие гистерезис при переключении. Так, переключение шины с высокого уровня на низкий будет зафиксировано при падении напряжения на сигнальной линии с VPUP до значения ниже VILMAX. После чего, для переключения обратно, с низкого на высокий уровень, требуется рост напряжения до значения выше VIHMIN.

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

В качестве примера, на рис. %img:signaling рассматривается процесс формирования на шине импульса низкого уровня длительностью tL. Изменение напряжения во время переходных процессов условно показано линейным, что в действительности не так, но точный характер изменений в данном случае непринципиален. На диаграмме промежуток времени от начала спада сигнала до переключения в состояние с низким уровнем (напряжение ниже VIHMIN) обозначено как tF. Время на переключение с низкого уровня на высокий обозначено ε. Как видим, в данном случае эффективное время пребывания шины в состоянии с низким уровнем tL по отношению к длительности импульса T, формирующего этот уровень, с одной стороны, уменьшается на tF, но с другой - увеличивается на ε; причём, вторая величина обычно существенно больше первой.

Далее подробнее рассмотрим каждый вид сигналов шины 1-Wire.

Сигнал сброса/присутствия

Для формирования сигнала сброса, ведущее устройство (мастер) устанавливает на шине сигнал низкого уровня на время tRSTL (не менее 480 мкс), после чего освобождает шину на время tRSTH (также не менее чем на 480 мкс) в ожидании ответного сигнала от ведущих устройств. После освобождения шины, за счёт подтягивающего резистора на ней устанавливается высокий уровень. Обнаружив установку высокого уровня в шине следом за сигналом сброса, ведомое устройство выжидает время tPDH (15..60 мкс) и формирует сигнал присутствия - устанавливает на шине низкий уровень на время tPDL (60..240 мкс).

Мастер, освободив шину после формирования сигнала сброса, переходит в режим приёма (Rx). Обнаружив сигнал присутствия, он делает вывод о наличии ведомых устройств на шине. Если сигнала нет, значит, нет ведомых устройств на шине и следует ждать их подключения.

Сигнал сброса в 1-Wire.
Рис. %img:reset

О выборе наилучшего момента для проверки шины на наличие импульса сброса. После освобождения шины мастером может пройти до 60 мкс до начала ответного сигнала от ведомого устройства, поэтому этот момент - самый ранний, когда мастер может проверять шину. С другой стороны, сигнал присутствия может начаться уже через 15 мкс и длиться всего лишь 60 мкс, поэтому не позже чем через 75 мкс от момента освобождения шины, мастер должен завершить проверку наличия сигнала. Таким образом, доступное для проверки окно, в которое гарантированно попадает сигнал присутствия - это 60..75 мкс от момента освобождения шины мастером (от конца импульса сброса). Минимальную границу лучше сместить примерно на 5 мкс, так как установка высокого уровня в шине при неблагоприятных условиях может быть достаточно длительной и растянуться до нескольких микросекунд (смотрите далее). Тогда получаем окно для проверки 65..75 мкс; оптимальный момент - середина окна, т.е. 70 мкс от конца импульса сброса.

Сигнал сброса/присутствия изображён на диаграмме, рис. %img:reset. На рисунке участки графика, выделенные серым цветом, соответствуют тем моментам, когда на шине устанавливается сигнал высокого уровня за счёт подтягивающего резистора; коричневым - низкий уровень в шине устанавливается мастером; лиловым - низкий уровень в шине устанавливается ведомым (ведомыми) устройствами.

Сигнал сброса является довольно длительным, его продолжительность многократно превышает максимально возможную длительность сигналов низкого уровня в процессе передачи данных. Поэтому для ведомого устройства не составляет труда распознать данный сигнал. Жёстких требований к продолжительности сигнала нет, важно лишь, чтобы она превышала указанное минимальное значение 480 мкс. В то же время, ничего не следует доводить до крайности. Если установить на шине низкий уровень слишком надолго, получающие паразитное питание устройства окажутся обесточенными, так как не хватит заряда встроенного накопительного конденсатора. И после восстановления высокого уровня, произойдёт сброс по включению питания, а не по сигналу сброса. А это уже совсем другое дело. Например, для датчика температуры DS18B20, при паразитном питании, длительность сигнала сброса не должна превышать 960 мкс, иначе может произойти сброс по включению питания с потерей данных в RAM, где хранится результат последнего измерения температуры.

На рис. %img:reset_d изображена более детализированная диаграмма сигнала сброса/присутствия, учитывающая длительность переходных процессов.

Детализированная диаграмма сигнала сброса в 1-Wire.
Рис. %img:reset_d

На рис. %img:reset_d длительность процесса переключения шины к низкому уровню обозначена как tF; переключение с низкого уровня на высокий происходит за время ε.

Как видно из диаграммы, эффективная длительность формируемого мастером сигнала сброса уменьшается на tF, что может потребовать учёта. С другой стороны, данная величина обычно невелика, не превышает долей микросекунд, а кроме того, tRSTL продлевается на время ε за счёт процесса нарастания сигнала, длительность которого превышает длительность спада.

После того, как формирование импульса сброса мастером завершается и на шине устанавливается сигнал высокого уровня, ведомые устройства ждут tPDH и отвечают сигналом присутствия длительностью tPDL. Как видим, момент установки низкого уровня в шине смещён относительно начала формирования импульса присутствия из-за переходных процессов, что нужно учитывать, выбирая момент tMSP, когда мастер проверяет состояние шины для обнаружения сигнала присутствия (или отсутствия сигнала присутствия :)

Между сигналом сброса/присутствия и слотами чтения/записи (и между самими слотами) должен выдерживаться интервал, когда на шине установлен высокий уровень. Это так называемое время восстановления tREC, которое должно быть не менее 1 мкс (и до бесконечности, максимальное значение не ограничено). Время восстановления не только разделяет соседние слоты, но и даёт возможность зарядить ведомым устройствам с паразитным питанием свои накопительные конденсаторы. Минимальная величина 1 мкс берётся в расчёте на одно ведомое устройство на шине, при большем количестве устройств, время восстановления должно быть увеличено.

Запись бита

Передача бита данных от ведущего устройства (мастера) к ведомым осуществляется путём формирования слота записи (рис. %img:wr). Для передачи нулевого бита (слот записи 0), мастер устанавливает на шине сигнал низкого уровня на время от 15 до 60 мкс, затем шина освобождается, в результате чего на ней устанавливается высокий уровень за счёт подтягивающего резистора. Для передачи единичного бита (слот записи 1), мастер устанавливает на шине сигнал низкого уровня на время от 1 до 15 мкс, после чего освобождает шину и на ней устанавливается высокий уровень.

Слот записи в 1-Wire.
Рис. %img:wr

Далее приведены более детализированные диаграммы слотов записи с учётом переходных процессов.

Запись бита 0

На рис. %img:wr0 приведена детализированная, с учётом переходных процессов, диаграмма слота записи 0. На диаграмме длительность процесса переключения шины к низкому уровню обозначена как tF. После освобождения шины мастером, она возвращается к состоянию с высоким уровнем, длительность этого процесса обозначена ε. Время пребывания шины в состоянии с низким уровнем обозначено как tW0L. Как было указано выше, это время должно составлять 15..60 мкс.

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

Слот записи 0 в 1-Wire с учётом переходных процессов (детализированная диаграмма).
Рис. %img:wr0

Запись бита 1

Слот записи 1 (рис. %img:wr1) отличается от слота записи 0 существенно меньшей продолжительностью установки низкого уровня на шине, здесь она составляет tW1L и должна находиться в пределах 1..15 мкс.

Слот записи 1 в 1-Wire с учётом переходных процессов (детализированная диаграмма).
Рис. %img:wr1

Чтение бита

Для получения мастером бита данных от ведомого устройства служит слот чтения (рис. %img:r). В его формировании участвуют и мастер и ведомое устройство. Как известно, в 1-Wire ведомое устройство пассивно, не может передавать данные по своей инициативе. Инициатором любого обмена данными является мастер. В данном случае мастер кратковременно (от 1 мкс, но менее 15 мкс) устанавливает на шине низкий уровень, после чего освобождает шину, контролируя её состояние. Ведомое устройство, которому в соответствии с его внутренним состоянием надлежит передавать данные, обнаружив переключение шины в состояние с низким уровнем, также устанавливает на своём выходе низкий уровень на время не менее 15 мкс (15..60 мкс) для передачи нулевого бита или просто оставляет шину свободной (ничего не делает) для передачи бита 1. Мастер же, освободив шину, считывает её состояние до истечения интервала в 15 мкс. И если он считывает 0, значит, ведомое устройство передаёт нулевой бит, а если считывается 1, то передан единичный бит.

Кстати, если мастер будет ошибочно формировать слоты чтения, когда ни одно из ведомых устройств не предполагает передачу данных, он будет всегда получать единичные биты (ведомые устройства будут рассматривать такие слоты как слоты записи 1).

Слот чтения в 1-Wire.
Рис. %img:r

На следующем рисунке (рис. %img:rd) изображена детализированная диаграмма слота чтения.

Слот чтения в 1-Wire с учётом переходных процессов (детализированная диаграмма).
Рис. %img:rd

author: hamper; date: 2020-04-17
  Рейтинг@Mail.ru