STM32 → 1-Wire

1-Wire — самый низкоскоростной и малораспространённый интерфейс, который тем не менее обладает замечательной особенностью — всего одна линия данных. Разработан компанией Dallas и применяется только в их продуктах: датчиках температуры, часах точного времени, энергонезависимой памяти в формате iButton.

Топология: Шина, одна двунаправленная линия DQ, подтянутая к + через резистор. Допускается до 256 девайсов на линии.

Кодирование: биты 0 и 1 кодируются как «0» импульсы разной длительности (0 — 90 мкс, 1 — 5 мкс) и «1» до конца тайм-слота — 400-500 мкс. Перед началом передачи в линию выдаётся сигнал «старт» (мастер притягивает шину к земле на 400 мкс, после этого девайс притягивает шину к земле на 100мкс).

Фичи: Благодаря тому, что в состоянии покоя и в паузах между битами линия принимает состояние «1» (т.е. +) и малому потреблению микросхем на шине 1-wire, становится возможным питать слейвы от линии данных через диод и конденсатор — весь канал связи сокращается до 2 линий, DQ и GND. В некоторых 1-Wire устройствах эта цепь уже встроена внутрь микросхемы, они имеют суффикс -PAR (паразитное питание).

Плюсы и минусы

Плюсы:

  • из-за низкой скорости интерфейс неприхотлив — устойчив к помехам, нет ЭМИ
  • встроенный CRC
  • Простота реализации — достаточно всего одной ножки ввода-вывода STM32, программа довольно проста (хотя и сложнее, чем реализация SPI)

Минусы:

  • Нет аппаратных модулей в МК, нужно реализовывать протокол обмена вручную
  • Очень низкая скорость
  • Поддержка только одним производителем.

Довольно часто интерфейс 1-Wire эмулируют с помощью UART, но мне это кажется плохой идеей.

Применение

Без преувеличения, самое частое применение в хобби-электронике — это подключение цифровых термометров DS18B20. У меня есть статья о подключении DS18B20 к STM32, и серия статей о создании на базе этого термометра и других датчиков домашней метеостанции.

На больших расстояниях и в условиях помех иногда общение по шине 1-Wire сбивается, чтобы этого не произошло — моя подборка улучшений для шины 1-Wire.