1-Wire slave на МК. Часть 1: Железо
Для одного из проектов по автоматизации потребовалось сделать устройство, которое является подчинённым 1-Wire устройством, принимает команды от мастера и выставляет на своих выходах значение аналогового сигнала в диапазоне от 0 до 10В.
Проанализировав линейку стандартных микросхем 1-Wire от Maxim, стало ясно, что нет микросхемы, которая позволит реализовать подобный функционал.
Потому было принято решение реализовывать 1-Wire slave на микроконтроллере. Надеюсь, данный материал будет интересен и полезен людям, которые делают «умный дом» своими руками, т.к. 1-Wire достаточно популярная шина в подобных проектах. В качестве камня был выбран МК Cortex M0+ ATSAMD20G16 от Atmel, но о реализации в коде расскажем во второй части. Забегая немного вперед, скажу что в третьей части цикла пойдет речь о реализации собственного семейства устройств для линуксовой библиотеки OWFS (One Wire File System). А сегодня расскажем о некоторых аппаратных решениях, к которым мы пришли в процессе разработки.
Речь в основном пойдет о том как подключить ногу микроконтроллера к 1-Wire шине с минимальным вредом для здоровья. Будем двигаться от простого к сложному.
Ничего не делать
Первая проблема, с которой сталкиваешься при попытке собрать 1-Wire устройство на микроконтроллере с ядром Cortex — это уровень питания микроконтроллера 3.3В, в то время как на шине 1-Wire имеем 5В. Можно использовать толерантность ног микроконтроллера к 5В и подключать как есть, прямо к шине. К сожалению, ноги SAM D20 не толерантны к 5-ти вольтам, потому нам этот вариант не подошел, но отметить его, справедливости ради, стоит. Хотя, сажать внешнюю шину напрямую на ногу 3.3В камня идея не самая удачная. Во-первых, есть вероятность нестабильной работы других устройств на шине с паразитным питанием, во-вторых на длинном проводе можно «словить» наводку.
Преобразование уровней
Самый простой вариант — двунаправленный преобразователь уровня на транзисторе. Для него потребуется где-то брать 5В со стороны шины 1-Wire.
Первый вариант — делать 5В на своем устройстве (помимо 3.3В) для «запитки» шины. Как следствие, усложнение схемотехники.
Второй вариант — прокладывать шину 1-Wire в три провода. Третьим проводом идёт линия питания +5В. Из проблем — лишний провод, просадка напряжения на длинном проводе.
Согласование уровней
Если очень не хочется использовать +5В можно разделить сигнальную линию на 2 составляющих (вход и выход)
Важно учесть, что при такой схеме линии со стороны контроллера получаются инверсными.
В качестве бонуса, разделение линии данных на 2 части позволяет несколько упростить дальнейшую отладку софта, т.к. позволяет видеть осциллографом отдельно выходящие от нас сигналы (линия 1-Wire Tx), не смешанные с сигналами других устройств на шине.
Повышаем устойчивость
Для того что бы сделать прием данных по 1-Wire более уверенным необходимо сделать крутые фронты импульсов со стороны микроконтроллера. Для этого воспользуемся компаратором от TI LMV331, который обеспечит более точный и резкий переход между логическими »0» и »1», а так же гистерезис 160mV. Еще заменим выходной би-полярный транзистор BC547 на полевой IRLML6346 и поставим защитный TVS диод ESD5Z6 на 6В.
Для данной схемы компаратор потребуется запитать от 5В. Где их можно взять было сказано выше.
Развязанный 1-Wire
Для обеспечения электрической развязки шины 1-Wire и внутренней электроники устройства воспользуемся изолированным транслятором уровней ADuM1201, и изолированным DC/DC конвертор TES 1–1211. Как и в предыдущем случае, линию данных 1-Wire делим на 2 линии: 1W_Rx и 1W_Tx.
DC/DC конвертор с 12 на 5 вольт взят для примера, можно использовать аналогичный 3.3/5.
Остальная схемотехника
Для полноты картины покажем схемотехнику подключения микроконтроллера, а так же выходных аналоговых каналов 0–10В.
Т.к. протокол 1-Wire требует наличие уникального адреса для каждого устройства на шине, на плату ставим 1-Wire UID от Maxim DS2411. Будучи для неё мастером шины будем считывать её UID и использовать его в качестве собственного адреса. У DS2411 код семейства 0×01 (family code — старший байт UID«а). Мы же на сайте OWFS выберем незанятый код семейства для нашего нового устройства и будем подменять первый байт.
Как уже было сказано, во второй части приступим к программной реализации протокола 1-Wire Slave.