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.