Датчики температуры DS18B20. Часть 2, запись и чтение информации

Обмен данными ведется по интерфейсу 1-Wire, а это полностью синхронный интерфейс. Сейчас объясню, что это значит. Все датчики температуры DS18B20 – это ведомые устройства, а наш микроконтроллер — ведущее устройство. Чтобы записать или прочитать бит, ведущее устройство подает импульс каждый раз, на каждый бит. Допустим, например, читаем мы 8 бит из датчика, микроконтроллер даёт импульсы на чтение 4 битов, отвлекаемся на время, потом дочитываем оставшиеся 4 бита. Без внешнего тактирования не происходит ничего, датчики молчат до тех пор пока их никто не спросит. Таким образом, ведущее устройство — дирижер в этом оркестре. 
Далее я буду называть ведущее устройство (микроконтроллер) мастером, а ведомое устройство (датчик(-и)) слэйвом.

Кроме того, я буду использовать такие определения:
Просадить шину — это значит опустить напряжение линии данных DQ (I/O) до нуля, замыкать на землю.
Отпустить шину — это значит переставать замыкать на землю и позволить подтягивающему резистору поднять напряжение на шине до напряжения питания (Vpu).

Всякий раз сеанс связи с датчиками начинается с инициализации. Инициализация — это некий ритуал проверки связи и он обязателен. Инициализация происходит так:

Мастер просаживает шину на 483 микросекунды и отпускает ее. Сразу же после отпускания, по моим наблюдениям, через 30 микросекунд, происходит импульс представления (presence) – это слэйв просаживает шину, будто бы говорит, «я здесь, всё ок». И этот импульс Presence длится 120 мкс. Так что есть достаточно времени, чтобы его «поймать». После появления импульса Presence, отпустите шину хотя бы на 247 мкс или дольше (по даташиту дольше 480 мкс).
Посмотрим реальные импульсы на логическом анализаторе

По этому импульсу представления можно понять, что на шине присутствует хотя бы один датчик и можно начинать обмен.
Мы можем отправлять (записывать) биты устройству или читать биты из устройства. Данные идут всегда младшим битом вперед, и младшим байтом вперед.
Запись битов происходит так:

В теории (по иллюстрациям из даташита):
Чтобы записать «0», мастер просаживает шину на время от 60 до 120 мкс, затем отпускает ее на время Trec (время восстановления) и это время от 1 мкс до бесконечности.
Чтобы записать «1». мастер просаживает шину на время от 1 до 15 мкс и отпускает ее на время от 60 мкс до бесконечности.
Датчики очень капризны ко времени импульсов просадки. А время Trec при паразитном питании гораздо больше, чем 1 мкс.
На практике (отточено на кабеле длиной до 100 метров):
Чтобы записать «0», мастер просаживает шину на 60 мкс, затем отпускает ее на 180 мкс.
Чтобы записать «1», мастер просаживает шину на 12 мкс, затем отпускает ее на 244 мкс.
Вы возможно спросите, критично ли парой микросекунд туда сюда пренебречь? На коротком проводе — нет. А на длинном, к сожалению, да.
На логическом анализаторе, в живую, выглядит запись лог 0 (слева) и лог 1 (справа), так:

Инициализация и запись байта 0x55

Вы без труда сможете по длительности импульсов отличить 0 от 1.

Чтение битов:

В теории, по тем же иллюстрациям, мастер просаживает шину на время от 1 до 15 мкс (даёт синхроимпульс). Затем мастер отпускает шину на время от 60 мкс. Если сразу же после отпускания напряжение поднялось, значит слэйв передает логическую «1», а если напряжение не поднялось, значит слэйв держит шину опущенной, а это логический «0».

На практике, для чтения очередного бита мы подаем синхроимпульс (просаживаем шину) на 12 мкс, а затем отпускаем ее, как минимум на 177 мкс. Сразу же, после отпускания, мы не читаем логический уровень шины, так как процессор очень быстрый, а скорость восстановления уровня не мгновенная (емкость витой пары, емкость датчика не дают мгновенно восстановиться). Между отпусканием шины и чтением логического уровня подождите совсем немного, хотя бы 1 мкс (я жду 1.3 мкс). Если слэйв просадит шину, то он ее будет держать около 16 мкс.
Посмотрим реальные импульсы в логическом анализаторе:

При чтении данные идут всегда младшим битом вперед, и младшим байтом вперед. Это нужно просто запомнить.

Продолжение по этой ссылке (клик)

Обсудить в нашем Telegram канале (клик)

Перейти к части 1 (клик)