Программатор 1 wire своими руками

101 применение шлюза UART-to-I2C/SPI/1W (RH-0004). Часть 8. USB программатор микросхем с интерфейсом 1-Wire

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

У такого решения было несколько причин:

  • Во-первых, устройства 1-Wire гораздо сильнее отличаются друг от друга по функционалу и набору команд, чем устройства SPI и I2C.
  • Во-вторых, изначально я полагал, что люди сами будут писать программы для работы со шлюзом, а я только покажу пару примеров. Для этого я полностью открыл API, написал DLL-ку, однако… почему-то не все вокруг оказались программистами (хм, неожиданно).

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

С точки зрения железа всё стандартно и аналогично USB-программаторам I2C и SPI. Нам понадобится сам шлюз RH-0004 + конвертер USB-to-UART RH-0003. UART-разъём конвертера — это ответная часть UART-разъёма шлюза, поэтому для их соединения вам не придётся ничего изобретать. Конвертер позволяет не только организовать обмен данными между шлюзом и компьютером, но и запитать шлюз (причём любым напряжением: +3,3В или +5В, оба они присутствуют на разъёме конвертера как раз в нужных местах). Всё вместе это выглядит вот так:

Теперь переходим к программной части.

Во-первых, нужно установить на компьютер драйвера для USB-to-UART конвертера. Конвертер сделан на базе чипа cp2102 фирмы silabs, дрова для него (VCP Drivers) можно скачать на их официальном сайте, вот по этой ссылке.

После установки драйверов на USB-to-UART конвертер у вас на компьютере появляется виртуальный com-порт, через который специально написанная программа может общаться со шлюзом. Эта программа сама устанавливает нужный для данного чипа режим 1-Wire и реализует нужные для работы с чипом алгоритмы. Ссылки для скачивания смотрите в конце статьи).

Окно программы показано на картинках ниже.


Работать с программой достаточно просто, — выбираем com-порт, выбираем чип, вводим ROM, подключаемся и можем c этим чипом работать. Либо просто запускаем поиск, который найдёт и отобразит в специальном окне все подключенные к шлюзу устройства 1-Wire, а нам останется только выбрать нужное устройство, щёлкнув по нему правой кнопкой мыши и подтвердив выбор во всплывающем контекстном меню. Для удобства в правом верхнем углу программы отображается схема подключения шлюза к выбранному чипу (к каким ногам что подключать).

Через верхнее меню доступны сохранение / загрузка данных памяти в файлы форматов bin и hex, сохранение логов работы в текстовые файлы, выбор языка (пока только английский и русский). Кроме того, специально добавил возможность ручного ввода ROM, на случай, если вдруг у чипа он окажется нестандартным (я такого ни разу не видел, но пользователи писали, что такое бывает).

Если нужного чипа нет в списке — можно написать на форум или в личку админу (rhf-admin) письмо с указанием того, какой чип вы хотели бы добавить. Если интересно — можете попробовать добавить нужный чип сами, программа выложена с исходниками на C++ Builder.

Протокол 1-Wire подробно описан вот здесь.

Список функций и регистров шлюза можно посмотреть здесь.

Программа Исходники Описание (поддерживаемые чипы, изменения в коде и т.д.) Поддержи- ваемые ОС
1-Wire Programmer v.3.0 v.3.0 sources DS1425, DS1427, DS18B20, DS18S20, DS1822, DS1963L, DS1991, DS1992, DS1993, DS1994, DS1995, DS1996, DS2405, DS2415, DS2417, DS2423, DS2430A, DS2431, DS24B33, DS2890 Windows XP, Windows Vista, Windows 7, Windows 8
1-Wire Programmer v.3.1 v.3.1 sources Update 14.05.2020
  • Добавлена возможность работы с ключами RW1990
  • Добавлена кнопка расчёта CRC для произвольного ROM
  • -/-
    1-Wire Programmer v.3.2 v.3.2 sources Update 29.06.2020
  • Добавлены чипы: DS1920, DS1961S, DS1971, DS2404, DS2432, DS28E05, DS28E07, DS1982*, DS2502*
  • Добавлены ключи: AN1990*, TM2004*
  • Добавлена документация (pdf) на большинство чипов
  • -/-
    1-Wire Programmer v.3.3 v.3.3 sources Update 14.11.2020

    Исправлена ошибка при работе с чипами DS1982*, DS2502* (Ошибка в алгоритмах записи приводила тому, что при нажатии на кнопки Write Data*, Write Status Bytes* производилась запись только младших байт соответствующих областей данных).

    -/-
    1-Wire Programmer v.3.4 v.3.4 sources Update 27.11.2020

    Исправлена ошибка при работе с чипами DS1994, DS2404, DS1427, DS2404S, DS1963L, DS2423, DS1993, DS1995, DS1996, DS24B33 (Ошибка в алгоритмах приводила к некорректной работе с областями, имеющими адреса старше 0x100, адрес при записи сдвигался на 1).

    -/-
    1-Wire Programmer v.3.5 v.3.5 sources Update 20.08.2021

  • Исправлена ошибка при определении типа питания (внешнее / паразитное). (Ошибка в обработке результатов команды 0xB4 для поддерживающих эту команду чипов приводила к неверному определению типа питания)
  • Добавлены чипы: MAX31826 (подробности — на форуме, вот в этой теме).
  • -/-

    Для полнофункциональной работы через шлюз RH-0004 с чипами и ключами, помеченными в программе знаком *, нужно использовать специальную дополнительную схему формирователя импульсов повышенного напряжения, например вот такую.

    Архив документации на поддерживаемые программой чипы можно скачать здесь. Для того, чтобы документация на нужный чип открывалась прямо из программы — распакуйте этот архив и поместите папку с документацией (она обязательно должна называться pdf) в папку с программой.

    Источник

    FT232: Как подружить 1-wire с компом

    Устройств, работающих на шине 1-wire великое множество: ключи-таблетки, датчики температуры, память, RTC, АЦП…
    Некоторые из них хочется подключить к компу. Но как? Неужели придется делать какой-то преобразователь на МК, или ставить специальную микросхему?!

    Нет, все гораздо проще. Передавая через UART байты с разным коэфф. заполнения можно получить нужные по длительности импульсы. Таким образом можно эмулировать 1-wire. Идея в общем-то довольно известная, но я о ней узнал недавно, и думаю, что не только я один 🙂

    Для того, чтобы UART порт мог работать как 1-wire, нужно прицепить пару деталей:

    С RX мы будем принимать данные, которые сами передаем + изменения, вносимые слейвом. TX подключен так, чтобы не было конфликтов уровней на линии (когда TX в лог единице, а слейв тянет линию вниз). Плату под такое делать рука не поднимается, поэтому я применил скилл говноляпства:

    Чтобы UART мог генерировать импульсы нужной длины, нам придется хитро переключать скорости:

    RESET передаем так: бодрейт — 9600, предаем 0xF0. В случае если слейв сказал «привет», получим не то, что отправили.

    Единичка (или чтение): бодрейт 115200, передаем 0xFF. Если слейв потянул линию вниз — получим что-то меньшее.

    Ноль: бодрейт 115200, передаем 0x00.

    —Все картинки я нагло скопипастил из аппноута от Максима.

    Теперь, попробуем реализовать это на практике. Для примера я написал программу, которая опрашивает датчик DS18b20 и выдает на экран температуру:

    Весь код приводить не буду, покажу лишь то, что связано с обменом данными.

    Генерация RESET. Если кто-то откликнулся — функция возвращает true, иначе false.

    Источник

    Программатор 1 wire своими руками

    Автор: ARV
    Опубликовано 28.02.2007

    Стимулом к написанию данной статьи стало участие в обсуждении на форуме РадиоКот проблем, связанных с использованием широкоизвестного датчика температуры DS18S20. Недостаток понимания принципов работы этого интерфейса многие пытаются скомпенсировать применением различных автоматических кодгенераторов, однако это дает скорее отрицательный эффект. Хотя информация по самому интерфейсу уже неоднократно публиковалась в различных журналах на русском языке, а так же имеется огромное количество документации на английском, проблемы у начинающих все еще возникают. Поэтому было решено попытаться изложить материал снова, но, возможно, более просто и доступно. Что вышло — вам судить.

    Интерфейс 1-Wire разработан фирмой Dallas Semiconductor, все права на этот интерфейс принадлежат исключительно этой фирме(Которая, впрочем уже давно прекратила свое самостоятельное сущестование и перешла под крыло корпорации MAXIM Inc. Прим. Кота.). Фирменная документация по указанному интерфейсу и устройствах, его поддерживающих, находится по адресу https://www.maxim-ic.com/1-Wire.cfm.
    Чем привлекателен этот интерфейс? Разумеется, малым количеством выводов МК, требующихся для подключения практически неограниченного количества микросхем. В самом деле, двусторонний обмен требует всего 1 линию! Кроме того, ассортимент устройств с этим интерфейсом весьма широк. Наконец, протокол обмена по этому интерфейсу очень прост и легко реализуется программно практически на любых МК (хотя есть и специальные микросхемы-адаптеры, но их стоимость вынуждает исключить их из рассмотрения в данной статье).

    На рисунке показана упрощенная схема аппаратной реализации интерфейса 1-Wire. Вывод DQ устройства представляет собой вход КМОП-логического элемента, который может быть зашунтирован (замкнут на общий провод) полевым транзистором. Сопротивление канала этого транзистора в открытом состоянии — около 100 Ом. Когда транзистор заперт — имеется небольшой ток утечки (примерно 5 мкА) на общий провод.
    Шина 1-Wire должна быть подтянута отдельным резистором к напряжению питания устройств (которое, кстати, может быть от 3 до 5В — уточняется по характеристикам конкретного устройства). Сопротивление этого резистора 4.7 К, однако, это значение рекомендовано только для достаточно коротких линий. Если шина 1-Wire используется для подключения удаленных на большое расстояние устройств, то сопротивление этого резистора следует уменьшить. Чуть позже я коснусь этой проблемы и поясню причины необходимости такого уменьшения сопротивления, а пока скажу, что минимально допустимое его сопротивление — около 300 Ом, а максимальное — около пары-тройки десятков килоом. Данные величины — ориентировочные, вы всегда должны уточнить по характеристикам конкретного устройства 1-Wire его максимальный втекающий ток линии DQ, который, собственно, и определяет минимум внешнего сопротивления.
    Подключение шины 1-Wire к МК показано условно в двух вариантах: с использованием 2 отдельных выводов МК (один в качестве выхода, а другой в качестве входа), так и одного, работающего и на ввод и на вывод. Разделение этих способов показано пунктирной линией, условно обозначающей границу корпуса МК. С некоторой натяжкой можно представить себе логическое строение шины 1-Wire как всем известное соединение выводов микросхем с открытым коллектором по схеме «монтажное ИЛИ». Очевидно, что передача какой-либо информации при этом возможна только выдачей низкого уровня в линию, т.е. замыканием ее на общий провод, а в высокий логический уровень линия вернется сама, благодаря наличию внешнего подтягивающего резистора. Так же очевидно, что одновременная передача нескольких устройств обречена на неудачу из-за полного искажения информации (все передаваемые единицы одного устройства будут подавлены передаваемыми нулями от другого устройства).

    А теперь о том, как происходит обмен информацией по шине 1-Wire. Основные постулаты.
    1. Обмен всегда ведется по инициативе одного ведущего устройства, которое в большинстве случаев является микроконтроллером (МК).
    2. Любой обмен информацией начинается с подачи импульса сброса («Reset Pulse» или просто RESET) в линию 1-Wire ведущим устройством.
    3. Для интерфейса 1-Wire в общем случае предусматривается «горячее» подключение и отключение устройств.
    4. Любое устройство, подключенное к 1-Wire после получения питания выдает в линию DQ импульс присутствия, называемый «Presence pulse» (далее я буду использовать термин PRESENCE). Этот же импульс устройство всегда выдает в линию, если обнаружит сигнал RESET.
    5. Появление в шине 1-Wire импульса PRESENCE после выдачи RESET однозначно свидетельствует о наличии хотя бы одного подключенного устройства.
    6. Обмен информации ведется так называемыми тайм-слотами: один тайм-слот служит для обмена одним битом информации.
    7. Данные передаются побайтно, бит за битом, начиная с младшего бита. Достоверность переданных/принятых данных (проверка отсутствия искажений) гарантируется путем подсчета циклической контрольной суммы.
    Основные постулаты определяют логический низкоуровневый протокол обмена данными.
    На следующем рисунке показана диаграмма сигналов RESET и PRESENCE, с которых всегда начинается любой обмен данными. Кстати, выдача импульса RESET в процессе обмена служит для досрочного завершения процедуры обмена информацией.

    Как видим, длительность большинства временных интервалов очень приблизительная и имеет только ограничение только по минимуму (не меньше указанного). Условные обозначения линий, показанные на Рис. 2, будут использоваться и далее.
    Импульс RESET формирует ведущий МК, переводя в низкий логический уровень шину 1-Wire и удерживая ее в этом состоянии минимум 480 микросекунд. Затем МК должен «отпустить» шину. Через некоторое время, зависящее от емкости линии и сопротивления подтягивающего резистора, в линии установится высокий логический уровень. Протокол 1-Wire ограничивает это время «релаксации» диапазоном от 15 до 60 микросекунд, что и является определяющим для выбора подтягивающего резистора (как правило, емкость линии мы менять существенно не можем, а именно она оказывает существенное влияние на время возврата линии к высокому уровню).
    Обнаружив импульс RESET, ведомое устройство приводит свои внутренние узлы в исходное состояние и формирует ответный импульс PRESENCE, как следует из рисунка — не позже 60 микросекунд после завершения импульса RESET. Для этого устройство переводит в низкий уровень линию DQ и удерживает ее в этом состоянии от 60 до 240 микросекунд. Конкретное время удержания зависит от многих параметров, но всегда находится в указанном диапазоне. После этого устройство так же «отпускает» шину.
    Но после завершения импульса PRESENCE устройству дается еще некоторое время для завершения внутренних процедур инициализации, таким образом, МК должен приступить к любому обмену с устройством не ранее, чем через 480 микросекунд после завершения импульса RESET.
    Итак, процедура инициализации интерфейса, с которой начинается любой обмен данными между устройствами, длится минимум 960 микросекунд, состоит из передачи от МК сигнала RESET и приему от устройства сигнала PRESENCE. Если сигнал PRESENCE не обнаружен — значит на шине 1-Wire нет готовых к обмену устройств.

    Теперь рассмотрим процедуры обмена битами информации, которые, как вы помните, осуществляются определенными тайм-слотами. Тайм-слот — это по существу определенная, довольно жестко лимитированная по времени последовательность смены уровней сигнала в линии 1-Wire. Различают 4 типа тайм-слотов (я буду использовать термин МК, как синоним «ведущего устройства» и просто «устройство», как синоним «ведомого»): передача «1» от МК, передача «0» от МК, прием «1» от устройства и прием «0» от устройства.
    Любой тайм-слот всегда начинает МК путем перевода шины 1-Wire в низкий логический уровень. Длительность любого тайм-слота должна находиться в пределах от 60 до 120 микросекунд. Между отдельными тайм-слотами всегда должен предусматриваться интервал не менее 1 микросекунды (конкретное значение определяется параметрами ведомого устройства).
    Тайм-слоты передачи отличаются от тайм-слотов приема поведением МК: при передаче он только формирует сигналы, при приеме, кроме того, еще и опрашивает (т.е. принимает) уровень сигнала в линии 1-Wire. Следующй рисунок демонстрирует временные диаграммы тайм-слотов всех 4-х типов: вверху показаны тайм-слоты передачи от МК, внизу — приема от устройства.

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

    Итак, подведем итоги. МК начинает тайм слот с выдачи в шину 1-Wire «0» в течение 1 микросекунды. Последующий уровень зависит от типа тайм слота: для приема и передачи «1» уровень должен стать высоким, а для передачи «0» — оставаться низким вплоть до конца тайм-слота, т.е. не менее 60 и не более 120 микросекунд. Если МК принимает данные, то опрос уровня в шине он должен сделать на промежутке от 13-й до 15-й микросекунде тайм-слота. МК должен обеспечить интервал между отдельными тайм-слотами не менее 1 микросекунды (лучше — больше, максимальное значение не ограничено).
    Важно понимать, что следует очень тщательно подходить к обеспечению в шине 1-Wire требуемых временных интервалов, т.к., например, увеличение длительности тайм-слота вывода «0» свыше рекомендованного значения может привести к ошибочному восприятию этого тайм-слота, как сигнала RESET, и, разумеется, после этого вся процедура обмена пойдет насмарку. Но так же следует учитывать влияние самой линии на длительность фронтов импульсов. Поэтому в общем случае, это не простая задача. Но выполнение несложных рекомендаций позволит ее решить достаточно простыми средствами: во-первых, все сигналы, которые должен формировать МК, следует формировать по принципу необходимого минимума длительности (т.е. немного больше, чем указанная минимальная длительность), а от устройства следует ожидать сигналов по принципу наихудшего (т.е. ориентироваться на самые худшие варианты временных параметров сигнала).
    Если вы разрабатываете схему, которая целиком умещается на одной плате вместе со всеми устройствами на шине 1-Wire, то, ориентируясь на самый первый рисунок, вы получите практически идеальную линию: фронты нарастания высокого уровня в шине будут минимальными — это избавит вас от большинства проблем. Но если Вы подключаете несколько устройств через длинный соединительный шлейф — придется бороться с погонной емкостью линии.
    Мною проверено, что соединение по свитым вручную обычным монтажным проводам при типовом подтягивающем резисторе однозначно возможно на расстоянии до 9 м, а для соединения по очень длинной телефонной «лапше» может потребовать уменьшения подтягивающего резистора до 510 ом и даже менее.

    Разобравшись с процедурами обмена битами, пора приступать к более высокому уровню протокола обмена информацией, и для этого необходимо рассмотреть принципы адресации устройств и управления ими.
    Каждое устройство 1-Wire обладает уникальным идентификационным 64-битным номером, программируемым на этапе производства микросхемы. Уникальным — это значит, что фирма-производитель гарантирует, что не найдется двух микросхем с одинаковым идентификационным номером (по крайней мере в течении нескольких десятков лет при существующих темпах производства).
    При рассмотрении протокола обмена мы будем исходить из принципа, что на шине 1-Wire имеется более одного устройства. В этом случае перед МК встают 2 проблемы: определение количества имеющихся устройств и выбор (адресация) одного конкретного из них для обмена данными. Решение первой проблемы осуществляется двумя путями: универсальным и гибким, но требующим довольно сложного программно-реализуемого алгоритма, и простым, но с большими ограничениями. Универсальный алгоритм мы рассматривать не будем, т.к. это требует отдельной статьи. А более простой заключается в том, что номера всех используемых в вашей схеме 1-Wire-устройств вы должны знать заранее, и просто использовать их как константы в вашей программе. Номера некоторых устройств нанесены прямо на корпусе микросхем (например, для устройств iButton — всем известных ключей-таблеток), а номера других можно определить при помощи специальных программ или устройств (о них в конце статьи). iButton — зарегистрированная торговая марка, права на которую принадлежат Dallas Semiconductor, дополнительная информация об этом семействе изделий на есть на сайте.
    Итак, предположим, что мы знаем номера всех устройств 1-Wire на шине. Как же ведется работа с ними? Алгоритм тут следующий. МК посылает, как обычно, импульс RESET, и все имеющиеся устройства выдают PRESENCE. Затем МК посылает в шину команду, которую принимают все устройства. Команд определено несколько общих для всех типов 1-Wire-устройств, а так же могут быть команды, уникальные для отдельных типов. Среди общих команд нас в первую очередь могут заинтересовать следующие (см. табли-цу).

    Источник

    Читайте также:  Лесные птицы своими руками
    Оцените статью
    Своими руками