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

Использование UART для реализации 1-Wire

Метод реализации 1-Wire интерфейса средствами UART известен давно и широко используется. Он описан в Application Notes (замечаниях по применению) у многих производителей микроконтроллеров, и, что немаловажно, в документации Dallas Semiconductor (сейчас Maxim Integrated), т.е. самого разработчика интерфейса 1-Wire (смотрите Maxim Integrated, Appnote 214). Возможно, такая реализация не идеальна, не лишена некоторых недостатков, но она достаточно проста и эффективна.

Здесь подробно (возможно, излишне подробно) описываются теоретические основы реализации 1-Wire на основе UART. Краткое описание метода и пример программы для MCU STM32F100xx смотрите в статье "Пример программной реализации 1-Wire с использованием UART".

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


Введение

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

В то же время, микроконтроллеры с аппаратной поддержкой 1-Wire - большая редкость. Они существуют (например, ARM Cortex-M4 микроконтроллеры MAX32620/MAX32621), но их очень мало. Поэтому для взаимодействия микроконтроллера с устройствами по 1-Wire, скорее всего, потребуется самостоятельно решать задачу реализации данного интерфейса.

Способы реализации 1-Wire Master в микроконтроллере

Реализация интерфейса может быть аппаратной и программной.

Аппаратная реализация в микроконтроллерах встречается крайне редко, но зато существуют преобразователи интерфейса в виде отдельных микросхем, например:
DS2482-100 - мост I2C - 1-Wire;
DS2480B - мост UART - 1-Wire.

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

Существует множество путей для программной реализации 1-Wire. Можно, как в рассмотренном ранее примере ("Пример использования цифрового датчика температуры DS18B20"), ограничится минимальным применением периферии (в примере используется системный таймер и низкоуровневый ввод-вывод с помощью GPIO). Однако такой подход может быть оправдан только в случае применения совсем простых микроконтроллеров с крайне бедной периферией; в обычных ситуациях он не имеет особой практической ценности. Ведь задействовав дополнительные периферийные устройства, можно упростить код и снизить бесполезную вычислительную нагрузку на микроконтроллер в процессе передачи данных.

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

Оно основано на использовании значительного сходства между интерфейсами 1-Wire и UART. В самом деле, 1-Wire можно рассматривать как предельно упрощённый вариант UART: с объединением двух линий в одну, сокращением фрейма до одного бита и фиксацией скорости обмена данными. Рассмотрим подробнее метод реализации 1-Wire на основе UART.

1-Wire на основе UART

Подключение

Интерфейс 1-Wire предполагает, что выходы подключаемых к шине устройств выполнены по схеме с открытым стоком (коллектором). Напряжение, соответствующее высокому уровню должно находиться в пределах 2..5.5 В. При паразитном питании, обычно должно быть не менее 2.8 В. Значения уровней следует уточнять в документации на подключаемые устройства, но в общем случае можно ориентироваться на указанные величины.

К шине 1-Wire может быть подключено одно ведущее устройство и несколько ведомых (рис. %img:bus). Сигнальная линия должна быть подтянута к высокому уровню с помощью резистора, сопротивление которого обычно выбирается около 5 кОм (типичное значение 4.7 кОм); иногда его уменьшают до 2..3 кОм для получения более крутого нарастающего фронта и уменьшения падения напряжения на резисторе из-за потребляемого устройствами тока при большом их количестве.

Подключение устройств к шине 1-Wire. Рис. %img:bus

Проще всего, когда выход микроконтроллера (или другого устройства с UART) может быть сконфигурирован для работы в режиме с открытым стоком, тогда для организации 1-Wire шины нам достаточно соединить вместе выводы микроконтроллера, соответствующие выводам Tx и Rx его UART и добавить подтягивающий резистор, рис. %img:st_conn.

Использование UART в STM32 микроконтроллере для реализации 1-Wire. Рис. %img:st_conn

В тех редких случаях, когда нет возможности для работы выхода Tx нашего устройства в режиме с открытым стоком, нужно просто подключить к выходу Tx буфер, имеющий выход с открытым стоком (или с открытым коллектором). Буфер нетрудно собрать на дискретных элементах (рис. %img:bbjt, рис. %img:bnmos) или можно использовать интегральную микросхему с готовым буфером (рис. %img:bbuf). Последний вариант оптимален, поскольку обеспечивает малый ток потребления в состоянии покоя и крутые фронты сигнала при переключении.

Буфер с выходом по схеме с общим коллектором на биполярных транзисторах. Рис. %img:bbjt

Буфер с выходом по схеме с общим стоком на MOS транзисторах. Рис. %img:bnmos

Буфер с выходом по схеме с общим стоком в интегральном исполнении. Рис. %img:bbuf

Настройка UART

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

Используется обычная длина фрейма 8 бит, без бита чётности. Количество стоп-битов не имеет значения, но для определённости будем использовать 1 стоп-бит.

Чтобы формируемые импульсы по временным характеристикам соответствовали требованиям 1-Wire, для UART хорошо подходят следующие скорости передачи: 9600 бит/с для формирования сигнала сброса и 115200 бит/с для передачи данных. Как известно, 1-Wire допускает вариации длительности импульсов в очень широких пределах и возможны значительные отклонения от предложенных величин. Указанные выше конкретные значения выбраны из ряда стандартных скоростей для UART в целях максимальной совместимости (на случай, если используемый UART не поддерживает нестандартных скоростей).

Сущность метода

UART-интерфейс является последовательным, т.е. данные передаются по одному биту; на передачу каждого бита отводится одинаковое время, равное 1/S, где S - скорость передачи. При пересылке данных используется объединение несколько битов (8 - типичное значение), которые группируются в пакет и дополняются служебными битами, образуя так называемый фрейм. Пересылка данных в виде фреймов повышает эффективность передачи данных - уменьшается доля времени, отводимого на передачу служебных сигналов.

Формат UART-фрейма. Рис. %img:frame

Напомним формат UART-фрейма (рис. %img:frame). Когда передачи данных не происходит (пауза между фреймами, idle), на выходе UART установлен высокий уровень. Начинается фрейм всегда с передачи нулевого старт-бита. Затем передаются биты данных, начиная с младшего. Завершается фрейм единичным стоп-битом, который в зависимости от настроек UART может иметь обычную или увеличенную длительность - в 1.5 или 2 раза больше длительности бита данных, тогда говорят, что стоп-бит имеет длину 1.5 и 2 бита соответственно. Наличие стоп-бита гарантирует, что даже при непрерывном потоке данных, без пауз между передачей фреймов, в начале каждого фрейма (на границе между стоп-битом предыдущего фрейма и старт-битом следующего) будет обязательно происходить переключение линии данных с высокого уровня на низкий. Это важно для сохранения синхронизации между передатчиком и приёмником UART с учётом отсутствия выделенного синхронизирующего тактового сигнала. Если бы стоп-бит отсутствовал, мы могли бы получить слишком длинную монотонную последовательность из нулевых битов, например, при передаче нескольких нулевых байтов подряд, что привело бы к потере синхронизации.

Дальше всё просто. В 1-Wire данные передаются в виде слотов записи (от мастера к ведомым устройствам) или слотов чтения (от ведомых к мастеру). Каждый слот содержит один бит данных.

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

Для эмуляции передачи слота 1-Wire с помощью UART, будем передавать байт, состоящий из одинаковых битов данных. Байт 0xFF, состоящий из единичных битов соответствует слоту записи 1; байт 0x00 из нулевых битов соответствует слоту записи 0. Следует лишь должным образом подобрать скорость передачи, чтобы параметры получаемого сигнала соответствовали требованиям 1-Wire.

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

По сути, слоты чтения формируются мастером точно так же, как слоты записи 1. Отличие состоит в том, что отвечающее ведомое устройство проявляет активность на шине.

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

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

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

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

Сигнал сброса/присутствия в интерфейсе 1-Wire. Рис. %img:reset

Начнём с очень важного для 1-Wire сигнала - сигнала сброса/присутствия (первая диаграмма на рис. %img:reset). Сброс производится следующим образом. Сначала мастер (ведущее устройство) устанавливает на шине низкий уровень на время не менее 480 мкс (может быть ограничено сверху; например, для датчика температуры DS18B20 - это не более 960 мкс при паразитном питании, иначе устройство может воспринять сигнал как отключение питания и значение измеренной температуры будет потеряно). Затем мастер освобождает шину и за счёт подтягивающего резистора на ней устанавливается высокий уровень. Мастер должен оставить шину свободной на время не менее 480 мкс (ограничений сверху на это значение нет), т.е. всего процесс сброса занимает не менее 960 мкс. Освободив шину, мастер начинает ждать отклика от ведомых устройств.

Ведомое устройство распознаёт длительное пребывание шины в состоянии с низким уровнем как сигнал сброса, в ответ на который оно, во-первых, переходит в соответствующее начальное состояние. Во-вторых, формирует на шине сигнал присутствия: после завершения импульса сброса и возвращения шины в состояние с высоким уровнем, устройство ждёт от 15 до 60 мкс и затем устанавливает на шине низкий уровень на время от 60 до 240 мкс.

Мастер, обнаружив ответный сигнал присутствия, делает вывод, что на шине имеется хотя бы одно ведомое устройство. Если сигнала присутствия нет, значит, на шине нет ни одного ведомого устройства, готового к работе.

С помощью UART сигнал сброса может быть получен следующим образом. На скорости 9600 (примерно 104.2 мкс на один бит) передаём байт 0xF0, в двоичном виде это 11110000. В UART передача происходит в порядке от младшего бита к старшему, в результате, в процессе передачи фрейма, на выходе UART сначала установится низкий уровень на время, равное длительности 5 битов (1 старт-бит и 4 нулевых бита данных), что составляет примерно 521 мкс. Затем на выходе UART устанавливается высокий уровень, что при использовании схемы с открытым стоком эквивалентно освобождению шины. Время, на которое освобождается шина, также соответствует пяти битам (4 единичных бита данных и 1 стоп-бит), т.е. 521 мкс или больше - если будет пауза перед началом передачи следующего фрейма.

Итак, UART при передаче байта 0xF0 на скорости 9600 бит/с, сначала устанавливает на выходе низкий уровень на время примерно 521 мкс, затем освобождает шину на такое же время (или большее). Это прекрасно соответствует требованиям к сигналу сброса для интерфейса 1-Wire.

Через 512 мкс от начала сброса, шина за счёт подтягивающего резистора вернётся в состояние с высоким уровнем, после чего ведомое устройство, подождав 15..60 мкс, устанавливает на шине низкий уровень на время 60..240 мкс.

Получаемый UART-приёмником в процессе сброса фрейм будет следующим. Сначала идёт старт-бит и 4 нулевых бита данных. Затем на шине устанавливается высокий уровень на время 15..60 мкс (0.14..0.58 "бита"), после чего ведомое устройство устанавливает снова низкий уровень на шине на время 60..240 мкс(0.58..2.3 "бита"). Это означает, что в полученном байте 1..2 бита в районе 4..5 бита окажутся нулевыми (индексация с 0), последующие - единичными, т.е. полученный байт не будет равен переданному байту 0xF0. Если же нет ведомых устройств на шине, сигнал присутствия сформирован не будет и передаваемый UART фрейм не будет искажён, т.е. будет получен байт 0xF0.

Заметим, что стоп-бит не искажается ведомыми устройствами, так как уже к моменту, соответствующему 7-му биту данных, завершается формирование сигнала присутствия даже у самых "задумчивых" устройств (60 мкс (max) ожидания + 240 мкс (max) формирования сигнала составляет 300 мкс максимум, это меньше длительности 3 битов).

Обобщая: для формирования сигнала сброса и получения сигнала присутствия от ведомых устройств с помощью UART, на скорости 9600 бит/с передаём байт 0xF0; если полученный эхо-байт отличается от переданного, значит, есть ведомые устройства, готовые к дальнейшему общению; если полученный байт совпадает с переданным 0xF0, то на шине нет ведомых устройств.

Слоты записи

Для формирования с помощью UART слота записи 0 следует передать байт 0x00 на скорости 115200 бит/с. На рис. %img:slot_w0 на верхней диаграмме изображён слот записи 0 в соответствии с требованиями 1-Wire, а на диаграмме внизу - то, что мы получаем на выходе UART при передаче байта 0x00.

Формирование 1-Wire слота записи 0 с помощью UART. Рис. %img:slot_w0

Длительность одного бита на скорости 115200 составляет примерно 8.7 мкс. Фрейм при передаче 0x00 будет иметь вид импульса с низким уровнем длительностью около 78 мкс (1 старт-бит и 8 нулевых битов данных), что полностью соответствует требованиям к слоту записи 0 в 1-Wire (требуется установить низкий уровень на шине на время от 60 до 120 мкс). Затем следует стоп-бит, которому соответствует высокий уровень в шине; длительность примерно 8.7 мкс, что также соответствует требованиям 1-Wire (интервал между слотами с высоким уровнем на шине не менее 1 мкс).

Для формирования с помощью UART слота записи 1, передаём на скорости 115200 бит/с байт 0xFF, рис. %img:slot_w1.

Формирование с помощью UART слота записи 1 в 1-Wire. Рис. %img:slot_w1

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

Слоты чтения

Интересной особенностью 1-Wire является то, что инициатором передачи данных от ведомого устройства к мастеру является мастер. Данные передаются в виде так называемых слотов чтения, каждый слот содержит один бит данных.

Для формирования слота чтения с помощью UART, следует отправить байт 0xFF на скорости 115200 бит/с (рис. %img:slot_r0, рис. %img:slot_r1). Нетрудно заметить, что то же самое мы делали для формирования слота записи 1. Но, в дополнение к этому, здесь мы анализируем принятый через UART байт, и если он не отличается от отправленного, делаем вывод о получении слота чтения 1 по 1-Wire. А если отличается, значит, был получен слот чтения 0.

Использование UART для формирования/получения 1-Wire слота чтения 0. Рис. %img:slot_r0. Слот чтения 0

Использование UART для формирования/получения 1-Wire слота чтения 1. Рис. %img:slot_r1. Слот чтения 1

Отправляя по UART байт 0xFF, мы формируем на шине импульс низкого уровня (старт-бит фрейма UART), который является сигналом начала слота для ведомых 1-Wire устройств. После этого на выходе UART устанавливается высокий уровень (передача единичных битов данных и единичного стоп-бита фрейма), что равнозначно освобождение шины, так как выход UART в нашем случае настроен для работы в режиме с открытым стоком. Это означает, что теперь состояние шины определяется ведомыми устройствами. Если ведомое устройство хочет передать нулевой бит данных, оно продолжает удерживать низкий уровень на шине ещё некоторое время, так формируется слот чтения 0. Для формирования слота чтения 1, ведомое устройство просто оставляет шину свободной (т.е. от него ничего не требуется делать) и тогда, благодаря наличию подтягивающего резистора, на шине устанавливается высокий уровень сразу после её освобождения мастером.

За счёт того, что у нас вход и выход UART соединены вместе, в ответ на каждый отправленный фрейм, будет получен некоторый входящий фрейм. Если никакое ведомое устройство не проявляло активности на шине, полученный байт данных будет совпадать с отправленным. Так происходит при получении слота чтения 1. А если в процессе того, как UART выполняет передачу/приём фрейма, ведомое устройство устанавливает на некоторое время низкий уровень на шине, происходит искажение некоторых битов данных фрейма (так как подключённые к одной линии выходы, выполненные по схеме с открытым стоком, образуют "проводное" И). В результате полученный через UART байт будет отличаться от отправленного. Это происходит при получении слота чтения 0.

Нетрудно убедиться, что формируемый с помощью UART сигнал соответствуют требованиям к слотам чтения в интерфейсе 1-Wire и, наоборот, параметры слота чтения делают возможным его приём с помощью UART. Длительность старт-бита UART при скорости 115200 бит/с, во время передачи которого на шине устанавливается низкий уровень, составляет около 8.7 мкс, т.е. находится в допустимом диапазоне 1..15 мкс. Затем шина освобождается мастером минимум на 78 мкс (8 единичных битов данных и единичный стоп-бит), что согласуется с требованиями к слоту чтения (ведомое устройство должно освободить шину не позже 60 мкс от начала слота, т.е. мастер должен быть готов принять слот длительностью не менее 60 мкс). Как уже было сказано, при передаче единичного бита, ведомое устройство не занимает шину, и мастер через UART получает тот же байт, который был отправлен, т.е. 0xFF. При передаче нулевого бита, ведомое устройство устанавливает на шине низкий уровень на время от 15 до 60 мкс (от начала слота), что соответствует установке в 0 от одного до шести битов (не считая стартового) в отправляемом/принимаемом UART фрейме и в любом случае гарантирует, что принятый по UART байт будет отличаться от отправленного (и в то же время стоп-бит не искажается - к моменту его прохождения ведомое устройство уже освобождает шину).

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

Недостатки метода

Метод при всей своей привлекательности не лишён некоторых недостатков.

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

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

Возможные проблемы с сигналом сброса/присутствия при реализации 1-Wire средствами UART. Рис. %img:rpt

Ещё одна проблема связана с сигналом сброса/присутствия. В соответствии с требованиями интерфейса 1-Wire допускается, чтобы импульс присутствия от ведомых устройств был достаточно коротким, минимально допустимая его длительность составляет 60 мкс (рис. %img:rpt). Но это очень мало, чуть более половины длительности бита в UART на скорости 9600 бит/с, используемой для формирования сигнала сброса. Кроме того, начало импульса находится в пределах 4-го бита принимаемого UART фрейма, а сам импульс располагается между 4-м и 5-м битами - частично в одном бите, частично в другом, занимая менее половины каждого из них. В таком случае UART может вполне правомерно пропустить этот короткий импульс присутствия, в результате чего будет сделан ошибочный вывод об отсутствии ведомых устройств на шине, несмотря на то, что сброс был успешно выполнен, а ответный сигнал сформирован в соответствии с требованиями 1-Wire.

А вот со слотами чтения (и тем более записи) проблем возникнуть не должно. Рассмотрим самый "проблемный" - слот чтения 1, в котором сразу после завершения старт-бита, на шине должен установиться высокий уровень за счёт подтягивающего резистора. Чтобы была прочитана 1, получаемый UART фрейм должен совпасть с отправляемым. Для этого время установления высокого уровня в шине не должно превышать половины (а лучше четверти) длительности бита на используемой скорости 115200 бит/с, чтобы самый первый бит данных, следующий после стартового, был принят через UART без искажений. Время установления определяется величиной подтягивающего резистора R и паразитной ёмкостью C шины и всех подключённых к ней устройств, это время может быть оценено как R*C. Максимальная паразитная ёмкость тогда не должна превышать величины 1/(4*S*R), где S - скорость передачи UART, т.е. 115200 в нашем случае:
C < 1/(4*S*R).
Для типичного значения R=4.7 кОм получаем C < 460 пФ. Это очень неплохой результат, без учёта ёмкости шины соответствует примерно 20 устройствам DS18B20.

Пример программной реализации 1-Wire с использованием UART

Данная статья перегружена теорией, поэтому пример вынесен в отдельный документ. Смотрите "Пример программной реализации 1-Wire с использованием UART".

Источники информации

  1. "Using a UART to Implement a 1-Wire Bus Master", Maxim Integrated, Appnote 214 (TUTORIAL 214)
  2. "Using a Z8051 UART to Implement a 1-Wire Master with Multiple Slaves", Zilog, AN034601-1012
  3. "Dallas 1-Wire Master on tinyAVR and megaAVR", Atmel AVR318 APPLICATION NOTE
author: hamper; date: 2020-04-17
  @Mail.ru