В этой статье я попытаюсь рассказать о потрясающей вещи — интерфейсе 1-Wire. Что в нем потрясающего? В нем данные передаются всего по одному проводу! Только вдумайтесь, куча датчиков может быть подключена к однопроводной шине.
Интерфейс One-Wire (встречается и такая нотация) был разработан компанией Dallas Semiconductor и применен в виде огромного количества устройств изготовленной данной компанией. Думаю практически все знают температурные датчики c 1-Wire интерфейсом — DS18B20.
Каждое устройство 1-Wire имеет собственный уникальный идентификатор, что обуславливает применение данных устройств в качестве устройств идентификации личности, маркировки оборудования и пр.
Как же передаются данные по однопроводной шине в обе стороны?
Данный вопрос очень удобно (и практично) рассмотреть на примере работы с датчиком температуры DS18B20.
Вот так выглядит схема его подключения:
Есть еще вариант с питанием датчика от линии данных, в таком случае вы получаете рабочий датчик температуры подключенный всего при помощи двух проводов!
Первым делом при работе с шиной 1-Wire необходимо её инициализировать, послать сигнал сброса.
Как видно из временной диаграммы (я позаимствовал её из даташита на датчик), мастер (т.е. контроллер устанавливает на шине нулевой потенциал на временя не менее 480 мкс, после чего устанавливает её в единичный потенциал. После чего необходимо подождать 15-60мкс, чтобы датчик получил передний фронт и отправил импульс присутствия (presence pulse) длиной 60-240мкс. Если данный импульс не получен, значит на шине нет датчиков готовых к обмену данными.
Теперь рассмотрим процедуру отправки и приема бита.
Опять рассматриваем диаграммы из даташита.
При операции посылки (записи) бита мы должны установить шину в нулевой потенциал. Если мы хотим отправить «0», то удерживаем нулевой потенциал по крайней мере 60мкс, если же необходимо отправить «1», то после задержки в 1мкс, необходимо установить шину в единичный потенциал.
Операция чтения бита очень похожа на операцию записи. Мы также должны установить шину в низкий потенциал, по крайней мере на 1мкс. После чего переводим ножку микроконтроллера в режим приема данных и ожидаем 14мкс. После этого можно считать состояние линии. Она будет в высоком состоянии если передается «1» и в никзом, если «0». Наконец мы должны подождать ещё 45мкс до окончания периода в 60мкс.
Операция отправки/приема байта производиться в цикле, путем отправки/приема бита и сдвигов операнда.
При работе с данным датчиком методом «дергания ноги» очень важным является еще и точная работа функции задержки. И если с контроллерами AVR тут в принципе все нормально, то для stm32 придется пошаманить.
Также существует режим работы с шиной 1-Wire при помощи USART:
Такой режим намного удобнее для stm32 контроллеров. Там проблем с нехваткой USART’ов нет, да ножек хоть отбавляй.