Пятница, 04 мая 2012 03:44

1-Wire эмулятор Featured

Written by
Rate this item
(0 votes)

 
alt    Уникальность микросхем Dallas с интерфейсом 1-Wire заключается в необходимости использования для связи с ними только одной сигнальной линии и общего проводника. Питание и связь могут осуществляться через одно соединение. Режим связи – асинхронный, полудуплексный, который строго следует схеме ведущий-подчиненный. К одной и той же шине могут быть одновременно подключено одно или несколько подчиненных устройств.

 

 

 

 

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

Ведущий инициирует каждую связь на битном уровне. Это означает, что передача каждого бита, независимо от направления, должна быть инициирована ведущим. Это достигается установкой низкого уровня на шине, который синхронизирует логику всех остальных устройств. Существует 5 основных команд для связи по шине 1-Wire: “Запись лог. 1”, “Запись лог. 0”, “Чтение”, “Сброс” и “Присутствие”. Теперь давайте рассмотрим все сигналы более подробно.  Весь процесс обмена, как уже говорилось, инициирует ведущий (Master), в роли которого может выступать микроконтроллер или персональный компьютер (ПК). В нашем случае «Ведущим» будет ПК, а ведомым (Slave), микроконтроллер. Попробуем проанализировать весь процесс обмена данными между устройствами. Для этого нам понадобится ПК с установленным ПО «Temp.Keeper», преобразователь DS9490R или аналогичный для Com порта, микроконтроллер PIC18F452, кварц на 16 МГц, логический анализатор Logic-U и термодатчик DS18B20.

    Припаиваем термодатчик к кабелю, как показано на рис.1. Чёрный провод – GND, розовый – Data. К этим проводам и будем подключать Logic-U. Серый провод (GND) анализатора подключаем к чёрному проводу DS18B20, красный провод (channel2) анализатора подключаем к розовому проводу DS18B20. Цвет проводов преобразователя может отличаться.

 

alt

Рис.1. Подключение термодатчика DS18B20 к преобразователю DS9490R.

    Собираем схему как показано на рис.2, подключаем к ПК, запускаем программы Temp.Keeper (далее TK) и Logic 1.1.15 (версия на момент написания статьи), (далее LU). В LU выставляем, слева вверху, 1 М Samples, 24 MHz. Справа, где Analyzers выбираем (+), 1-Wire, 2-‘Channel 2’ и нажимаем “Save”, далее программа предложит переименовать канал, что не обязательно. Теперь под Analizers появилось 1-Wire, надо ещё выставить в настройках систему отображения данных в hex. Теперь необходимо настроить триггер срабатывания записи анализатора на 2м канале, чтобы отлавливать начало пакета (низкий уровень). Для этого надо нажать на 2м канале стрелочку «вниз», теперь у нас запись начнётся при импульсе нулевого уровня. На этом можно считать, что анализатор настроен и готов к отслеживанию сигналов 1-Wire.

 

alt

Рис.2. Схема для регистрации протокола обмена по 1-Wire.

 

    Нажимаем “Start” и идём к программе ТК. В ТК нажимаем  поиск устройств, появится ещё одно окно, здесь просто нажимаем «Ок», с этого момента LU и начнёт запись сигнала. Если всё сделано правильно, то появится окно с количеством найденных устройств (Рис.3), а в окне LU будут записаны данные обмена.

 

alt

Рис.3. Регистрация обмена данными 1-Wire.

 

    Теперь будем разбираться, что отправлял ПК термодатчику и что тот отвечал. Сжатие и растягивание графика LU можно производить при помощи колёсика мышки. Итак, смотрим на график и первое, что попадается – это сигнал “Reset” и “Presence condition”. ПК формирует импульс Reset, у меня он 509 микросекунд, переводя в низкий логический уровень шину 1-Wire и удерживая её не менее 480 микросекунд (8 временных слотов ). Затем ПК "отпускает” шину и напряжение возвращается к высокому логическому уровню (время зависит от ёмкости линии и сопротивления подтягивающего резистора). Протокол 1-Wire ограничивает это время диапазоном от 15 до 60 микросекунд, что и влияет на выбор подтягивающего резистора (в нашем случае пауза равна 28 микросекунд). Обнаружив и распознав импульс Reset, термодатчик формирует ответный импульс Presence, длительностью 162 микросекунды (Рис.4).

 

alt

Рис.4. Инициализация устройств 1-Wire на шине.

 

    Для этого устройство прижимает линию DQ к земле и удерживает  её от 60 до 240 микросекунд. Затем устройство так же "отпускает” шину (Рис.5). Из этого следует, что эмулятор должен отслеживать и распознавать сигнал Reset, а при его появлении выждать паузу 15-60 микросекунд и выдать в линию сигнал Presence, длительностью 60-240 микросекунд.

 

alt

Рис.5. График инициализации с временными метками.

 

    Проматываем наш график влево и смотрим, что там следующее. Далее, примерно через 8 миллисекунд идёт команда 0xF0 (SEARCH ROM, поиск адресов - используется при универсальном алгоритме определения количества и адресов подключенных устройств). На графике у нас сначала идут нули, так как биты передаются начиная с младшего (Рис.6).

 

alt

Рис.6. Передача “Мастером” команды F0.

 

    Проведём маленький анализ передачи команды. После того как подчинённое устройство передало команду Presence оно настраивается на приём команды от «Мастера», «Мастер» начинает передавать команду, сообщая об этом устройству, прижиманием линии в низкий логический уровень и далее, если необходимо передать ноль, то уровень остаётся прижатым, как в случае указанном на графике (первые четыре бита). Если необходимо передать единицу, то «Мастер» после прижимания уровня к нулю, отпускает его через 1-15 микросекунды (видно на последних четырёх битах команды 0хF0). В то время, как подчинённое устройство отследило низкий уровень в линии, оно выполняет согласно заложенному алгоритму определённые действия (приёма или передачи). Повторю, что подчинённое устройство пока не получит от «Мастера» команды (низкий уровень 1-15 микросекунд), ничего не будет делать и эта команда действительна только на период одного тайм- слота (один бит). Тайм-слоты передачи отличаются от тайм-слотов приема поведением ПК: при передаче он только формирует сигналы, при приеме, кроме того, еще и опрашивает (т.е. принимает) уровень сигнала в линии 1-Wire. Рис. 7 демонстрирует временные диаграммы тайм-слотов всех 4-х типов: вверху показаны тайм-слоты передачи от ПК, внизу - приема от устройства.

 

alt

 

Рис.7. Диаграммы тайм-слотов при обмене данными.

 

    Тайм-слот передачи "0" заключается просто в удержании шины 1-Wire в низком уровне в течение всей длительности тайм-слота. Передача "1" осуществляется путем "отпускания" шины 1-Wire со стороны ПК не ранее чем через 1 микросекунду после начала тайм-слота, но не позже чем через 15 микросекунд. Ведомое устройство опрашивает уровень в шине 1-Wire в течение временного интервала, условно показанного в виде серого прямоугольника, т.е. начиная с 15-й микросекунды от начала тайм-слота и заканчивая 60-й микросекундой от начала. Типичный момент ввода уровня в устройство (т.е. характерный для большинства устройств) - около 30-й микросекунды от начала тайм-слота.

    Заштрихованная область - это область "нарастания" уровня в шине 1-Wire, которая зависит от емкости линии и сопротивления подтягивающего резистора, она приведена для справки.

Тайм-слоты приема информации отличаются тем, что ПК формирует только начало тайм-слота (абсолютно так же, как при передаче "1"), а затем управление уровнем шины 1-Wire берет на себя устройство, а ПК осуществляет ввод этого уровня так же в определенной зоне временных интервалов. Зона эта, как видно из Рис. 7, довольно мала. Как и раньше, заштрихованная область - область неопределенности, поэтому для ввода, собственно говоря, контроллеру остается даже не промежуток, а скорее конкретный момент, когда он должен ввести уровень сигнала из линии. Этот момент времени - 14-я или 15-я микросекунда от начала тайм-слота. Разумеется, если линия имеет малую емкость, а подтягивающий резистор мал, зона опроса несколько расширяется, однако рекомендуется ориентироваться на худший вариант, чтобы всегда обеспечить надежный обмен данными.

    Итак, подведем итоги. ПК начинает тайм слот с выдачи в шину 1-Wire "0" в течение не менее 1 микросекунды. Последующий уровень зависит от типа тайм слота: для приема и передачи "1" уровень должен стать высоким, а для передачи "0" - оставаться низким вплоть до конца тайм-слота, т.е. не менее 60 и не более 120 микросекунд. Если ПК принимает данные, то опрос уровня в шине он должен сделать на промежутке от 13-й до 15-й микросекунды тайм-слота. ПК должен обеспечить интервал между отдельными тайм-слотами не менее 1 микросекунды.

 

alt

 

Рис.8. Передача “Подчинённым” битов-идентификаторов.

 

    Теперь смотрим дальше. Команда от ПК получена, далее за командой 0xF0 идёт ответ от подчинённого устройства (ПУ). Что он должен ответить на команду F0 ? Он должен сейчас передать имя устройства, идентификационный код и контрольную сумму, всего 8 байт. В нашем случае датчик должен передать: 0X27,0X00,0X00,0X01,0X27,0X20,0X56,0X28 , начиная с младшего бита 0х28 (00101000). 0х28 – это у нас идентификатор семейства устройства, к которым относится DS18B20. Да устройство должно передать не просто биты, но ещё и комплементарные (инверсные). Как это делается? Посмотрим, что у нас на диаграмме (Рис.8). Здесь толкового на начале передачи ничего не видно, сразу начинается путаница. По условию ПУ должно выставить младший бит (у нас он 0), потом инверсный (1). ПК должен их принять и сделать свои выводы, выдав в шину результат (по графику ПК выдал 0). Но на графике первые три бита все нули, получается, что ПК выставил в момент передачи ПУ свою информацию. И доминирующий 0 ПК перекрыл 1 ПУ. Я так и не понял для чего это, скорее всего этот бит не несёт важной информации и ПК решил что то перепроверить. В следующей триаде у нас всё нормально, ПУ выставил 0, потом 1, ПК выставил 0, что означает, что ПУ может дальше выдавать свой код. А если бы ПК в этом случае выставил бы 1, то ПУ должно было отключится (это в случае, если много устройств на шине). В итоге, чтобы передать 0х28 ПУ должно выставить 16 бит и принять 8, всего 24 бита. Вся процедура передачи кода занимает 192 тайм-слота. В подробности распознавания устройства не будем, здесь этой задачей занимается ПК. Для поиска на шине 1-Wire устройств для МК есть статья Поиск ROM на шине 1-Wire

    Из сказанного значит, что всё это необходимо реализовать в эмуляторе, и без этого никак. Вообщем обучить для начала контроллер командеF0, тогда эмулятор научится работать в команде устройств 1-Wire. Ну надо, так надо, особых проблем здесь нет. Выдать два бита, один послушать, сравнить, принять решение (дальше передавать или молчать) и так 64 раза. Саму диаграмму обмена можно посмотреть в Saleae Logic, загрузив файл f0.logicdataДопустим, что эмулятор это уже умеет и программа может его распознать. Теперь надо обучить его ещё парочке команд, чтобы данные передавал. Этим и займёмся, исследуя график эталонного датчика.

   Снимаем диаграмму аналогичным способом во время работы программы ТК, только выставляем в Logic-U 25 Samples, увеличивая тем самым время регистрации сигнала. Смотрим на график. В начале, как всегда идёт команда инициализации Reset, через 10 миллисекунд команда игнорирования адреса (Skip ROM) 0xCC , т.е. обращение ко всем приборам (все приборы ожидают следующую команду на выполнение). Следом, через 1,2 миллисекунды идёт команда запуска конвертирования температуры (Convert T) 0x44, после которой приборы начинают конвертацию замера и подготовки данных для вывода в шину (Рис.9). 

 

alt

Рис.9. График передачи команд 0хСС и 0х44.

    Время конвертации занимает приблизительно 750 миллисекунд, в зависимости от настройки программы и датчиков. ПК посылает проверочный байт, для определения окончания конвертации. Если прибор подтвердил о готовности данных для вывода, то ПК посылает опять Reset, следом команду выбора прибора по адресу (Match ROM) 0x55 и адрес прибора, к которому идёт обращение. Этим самым на шине выделяется только один прибор, с которым ПК и будет общаться (Рис.10).

 

alt

 

Рис.10. График обращения к конкретному устройству командой 0x55.

 

    ПК подаёт команду чтения памяти (Read Scratchpad) 0xBE, после чего прибор отправляет в ПК 8 байт данных и один байт CRC (Рис.11). Обмен происходит по требованию ПК, который запрашивает каждый бит информации, пауза между байтами составляет примерно 1,5 миллисекунды. Саму диаграмму обмена можно посмотреть в Saleae Logic, загрузив файл be.logicdata .  Более подробный список команд приведён в таблице 1.

 

 

Алгоритм обмена данными между устройствами.

Reset Pulse ------------------------------- отправляет ПК;

Presence Pulse -------------------------- отправляет ПУ;

Skip Rom Command, 0xCC ---------- отправляет ПК;

Data, 0x44 -------------------------------- отправляет ПК;

Reset Pulse ------------------------------ отправляет ПК;

Presence Pulse ------------------------- отправляет ПУ;

Match Rom Command, 0x55 -------- отправляет ПК;

ROM Family Code, 0x28 ------------- отправляет ПК;

ROM Code, 0x000001272056 ------ отправляет ПК;

ROM CRC, 0x27 ----------------------- отправляет ПК;

Data, 0xBE ------------------------------ отправляет ПК;

Data, 0x7E ------------------------------ отправляет ПУ;

Data, 0x01 ------------------------------ отправляет ПУ;

Data, 0x7D ------------------------------ отправляет ПУ;

Data, 0xC9 ------------------------------ отправляет ПУ;

Data, 0x7F ------------------------------ отправляет ПУ;

Data, 0xFF ------------------------------ отправляет ПУ;

Data, 0x02 ------------------------------ отправляет ПУ;

Data, 0x10 ------------------------------ отправляет ПУ;

Data, 0xDE ----------------------------- отправляет ПУ;

 

alt

 

Рис.11. Оперативная память датчика DS18B20.

    Само устройство я собирал на монтажной плате (Рис.12), в контроллере используется только первый вывод порта B. Кварц на 16 МГц, потом буду понижать частоту до 4 МГц. В устройство можно заливать прошивку и проверять программами Temp.Keeper или Benuks. Устройство находится в сети и выдаёт данные по запросу 0x55.   

 

alt

 

Рис.12. Монтажная плата устройства.

 

alt

Табл.1. Таблица команд 1-Wire устройств.

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

 

alt

Табл.2. Таблица кодов семейства 1-Wire устройств.

Файлы для скачивания:

 

Ссылка для скачивания доступна только авторизованным пользователям сайта !

Ссылка для скачивания доступна только авторизованным пользователям сайта !

 

 

Список использованных ресурсов:

 

http://we.easyelectronics.ru/STM32/stm32-1-wire-poisk-ustroystv.html

http://arv.radioliga.com/content/view/39/43/

http://eldigi.ru/site/guard/5.php

http://isens.ru/

 

 

Обсудить на форуме

Read 9713 times Last modified on Среда, 03 сентября 2014 14:01

Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru