Интерфейс 1-wire

1-Wire

1-Wire – разработан фирмой Dallas Semiconductor (ныне MAXIM) в конце 90-х годов.
Фирменная документация .

Этот интерфейс интересен тем, что для двустороннего обмена требуется всего одна линия! (отсюда и название 🙂

Причём, на эту одну линию можно повесить несколько устройств, а ассортимент таких устройств очень широк (от датчиков температуры до широко распространённых ключей-таблеток iButton).

Кроме того – протокол очень прост и легко реализуется на МК программно.

Ниже представлена блок-схема аппаратной реализации 1-Wire:

Обратите внимание, что шина 1-Wire должна быть подтянута отдельным резистором к напряжению питания (может быть от 3V до 5V — нужно уточнять по характеристикам подключаемого устройства).

Сопротивление этого резистора 4.7k, однако, это значение подходит только для достаточно коротких линий. Если шина используется для подключения устройств на большее расстояние, то сопротивление подтягивающего резистора необходимо уменьшить (сопротивление зависит от величины максимального втекающего тока линии DQ конкретного устройства 1-Wire).

Примечательный момент – некоторые устройства 1-Wire могут использовать т.н. «паразитное питание»/фантомное питание (Parasite power) – т.е. питание устройства осуществляется от линии данных

Электропитание осуществляется за счёт заряда встроенного конденсатора, который заряжается во время наличия высокого уровня напряжения на линии данных. Опять же, следует учитывать, что связь с устройствами, использующими паразитное питание возможно только на коротких линиях. На длинных линиях возможны непонятные побочные эффекты.

Переходим к тому, как собственно происходит обмен информацией по 1-Wire.

Основные положения:

0. передача информации возможна только выдачей низкого уровня в линию, т.е. замыканием ее на общий провод. В высокий логический уровень линия вернется сама, из-за наличия подтягивающего резистора. (теперь становится понятно, что наличие внешнего подтягивающего резистора – обязательное условие работы 1-Wire)
1. обмен происходит по инициативе ведущего устройства (обычно — микроконтроллера)
2. обмен информацией начинается с подачи импульса сброса (RESET pulse) на линию
3. 1-wire устройства предусматривают «горячее» подключение (мы ведь втыкаем наши ключи-таблетки в в домофон, верно?)
4. при подключении, 1-wire устройство выдаёт в линию DQ импульс присутствия (PRESENCE pulse). Этот же импульс выдаётся при обнаружении сигнала RESET. (при втыкании ключа в домофон — ключ как-бы говорит ему – «вот он я!»)
5. обмен информации ведётся так называемыми тайм-слотами – один слот содержит один бит информации.
6. данные передаются побайтно – бит за битом, начиная с младшего байта. Достоверность данных (проверка отсутствия искажений) гарантируется путем подсчета циклической контрольной суммы (CRC).

алгоритм подсчета CRC должен быть одинаковым как для МК, так и для любого устройства 1-Wire. Он стандартизирован и описан в .

Как видно по диаграмме — МК формирует импульс RESET, переводя в низкий логический уровень шину 1-Wire и удерживая её не менее 480 микросекунд. Затем МК “отпускает” шину и напряжение возвращается к высокому логическому уровню (время зависит от ёмкости линии и сопротивления подтягивающего резистора).

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

Обнаружив импульс RESET, ведомое устройство формирует ответный импульс PRESENCE. Для этого устройство прижимает линию DQ к земле и удерживает от 60 до 240 микросекунд. Затем устройство так же “отпускает” шину.
После этого устройству еще дается время для завершения внутренних процедур инициализации, таким образом, МК должен приступить к любому обмену с устройством не ранее, чем через 480 микросекунд после завершения импульса RESET.
Т.о. процедура инициализации, с которой начинается обмен данными между устройствами, длится минимум 960 микросекунд.

Теперь рассмотрим процедуры обмена битами информации, которые осуществляются определенными тайм-слотами (определенная, жестко лимитированная по времени последовательность смены уровней сигнала в линии 1-Wire).

Различают 4 типа тайм-слотов: 1. передача «1» от МК, 2. передача «0» от МК, 3. прием «1» от устройства, 4. прием «0» от устройства. Тайм-слот всегда начинает МК, прижимая шину к земле.

Длительность тайм-слота находится в пределах от 60 до 120 микросекунд.

Между тайм-слотами всегда должен быть интервал не менее 1 микросекунды (определяется параметрами ведомого устройства). Тайм-слоты передачи отличаются от тайм-слотов приема поведением МК: — при передаче МК только формирует сигналы, — при приеме МК еще и опрашивает уровень сигнала в линии 1-Wire.

Тайм-слот передачи «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 микросекунд.

— принимая данные, МК должен считать уровень в шины 1-Wire в промежутке от 13-й до 15-й микросекунде тайм-слота.

— МК должен обеспечить интервал между тайм-слотами не менее 1 микросекунды (лучше — больше, максимальное значение не ограничено). Для достижения нужных временных интервалов нужно следовать простым правилам: — все сигналы, которые должен формировать МК, следует формировать по принципу необходимого минимума длительности (т.е. немного больше, чем указанная минимальная длительность) — от устройства следует ожидать сигналов по принципу наихудшего (т.е. ориентироваться на самые худшие варианты временных параметров сигнала).

Теперь настало время разобраться с протоколом обмена информации 🙂

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

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

Номера некоторых устройств наносятся прямо на корпус микросхем (например, для наших ключей-таблеток — iButton), а номера других можно определить при помощи специальных программ или устройств.

Итак, предположим, что мы знаем номера всех устройств 1-Wire на шине. Алгоритм работы с ними следующий: 1. МК посылает, импульс RESET, и все имеющиеся устройства выдают PRESENCE. 2. МК посылает в шину команду, которую принимают все устройства. Определено несколько общих команд для всех типов 1-Wire-устройств, а так же есть команды, уникальные для отдельных типов устройств.

Общие команды:Команда Значение байта Описание SEARCH ROM 0xF0 Поиск адресов – используется при универсальном алгоритме определения количества и адресов подключенных устройств READ ROM 0x33 Чтение адреса устройства – используется для определения адреса единственного устройства на шине MATCH ROM 0x55 Выбор адреса – используется для обращения к конкретному адресу устройства из многих подключенных SKIP ROM 0xCC Игнорировать адрес – используется для обращения к единственному устройству на шине, при этом адрес устройства игнорируется (можно обращаться к неизвестному устройству)3. После того, как МК выдаст команду READ ROM, от устройства поступит 8 байт его собственного уникального адреса — МК должен их принять. Любая процедура обмена данными с устройством должна быть завершена полностью либо прервана посылкой сигнала RESET. 4. Если отправлена команда MATCH ROM, то после нее МК должен передать 8 байт адреса конкретного устройства, с которым будет осуществляться последующий обмен данными. 5. Приняв эту команду, каждое устройство сравнивает передаваемый адрес со своим собственным. Все устройства, адрес которых не совпал, прекращают анализ и выдачу сигналов в линии 1-Wire, а опознавшее адрес устройство продолжает работу. Теперь все данные, передаваемые МК будут попадать только к этому «адресованному» устройству.

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

Порядок передачи другой информации зависит от конкретного устройства.

1-Wire и Arduino

, используя библиотеку -а – .
— там же можно посмотреть на функции расчёта CRC.

Приложение

Алгоритм поиска устройств 1-Wire

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

Однако, этот процесс подробно освещён в апноуте (Application Note):1. Итак, поиск начинается с импульса RESET от ведущего устройства и принятия PRESENCE от ведомых. 2.

Затем, посылается 1 байт команды:

0xF0 – осуществляется поиск всех устройств на линии

или

0xEC – поиск среди устройств, находящихся в состоянии тревоги (alarm state).

3. Устройства отправляют первый бит своего уникального номера. Если несколько устройств передают свой бит одновременно – результирующий бит на линии получится, как результат операции логического И (AND) 4. следующий бит, который отправляют устройства – это дополнение первого бита (если первый бит был 1, то будет 0 и наоборот – если был 0 – теперь будет 1) На основании этих двух битов – ведущее устройство может сделать вывод о первом бите устройств на линии:5. Далее, МК отправляет бит назад. И теперь продолжат работу только те ведомые устройства у которых этот бит установлен. Если же устройство такого бита не имеет – оно должно перейти в режим ожидания до следующего сигнала RESET. 6. Данная «двубитная передача» повторяется для всех следующих 63 бит ROM. 7. Т.о. все устройства на линии, кроме одного перейдут в состояние ожидания, а код ROM этого единственного устройства будет известен 🙂

Cсылки

— данная замечательная статья использовалась при написании этой заметки

библиотека –

По теме

Источник: http://robocraft.ru/blog/communication/117.html

1-Wire. Работа с DS18B20. Часть 1

     Все (и в том числе я) называют DS18B20 цифровым датчиком температуры. Однако это не просто датчик, это программируемый цифровой термометр.

Он измеряет температуру в диапазоне от –55 до +125 градусов Цельсия, имеет программируемое температурное разрешение от 9 до 12 бит и позволяет задавать верхний и нижний температурные пороги, в случае превышения которых,  устанавливается флаг аварии.

 

   Каждый термометр DS18B20 имеет уникальный 64 битный серийный номер, который используется для его адресации на 1-Wire шине. Это позволяет объединять на одной шине несколько независимо работающих термометров и осуществлять между ними и микроконтроллером обмен данными по 1-Wire протоколу. 

   Также особенностью данного термометра является то, что его можно запитывать не только от источника питания, но и от сигнального провода. Это так называемый режим паразитного питания. В этом режиме для подключения DS18B20 требуется всего два провода — сигнальный и возвратный (земляной, GND).

      Схема подключения нескольких датчиков DS18B20 с внешним питанием.    1-Wire шина  должна быть обязательно подтянута к плюсу питания через резистор номиналом 4,7 Ком. Напряжение источника питания от 3 до 5 Вольт. 

   Схема подключения датчика DS18B20 в режиме паразитного питания. 

   Вывод Vdd соединяется с GND, а 1-Wire шина дополнительно подключается к источнику питания через полевой транзистор. 

   Когда датчик DS18B20 выполняет преобразование температуры или копирует данные из ОЗУ в EEPROM память, он потребляет ток до 1,5 мА. Этот ток может вызывать недопустимое снижение напряжения на 1-Wire шине. Чтобы этого не происходило, 1-Wire шину на время выполнения этих операций подключают к источнику питания. Для этого и нужен полевой транзистор.   

     Для обмена данными термометр DS18B20 использует 1-Wire протокол (однопроводный протокол).

Это низкоскоростной двунаправленный полудуплексный последовательный протокол обмена данными использующий всего один сигнальный провод.

Естественно требуется еще и возвратный (земляной) провод, но об этом маркетологи обычно умалчивают. 1-Wire протокол был разработан фирмой Dallas Semiconductor в конце 90-х годов.    

   Имеется несколько типов сигналов, определенных 1-Wire протоколом – импульс сброса, импульс присутствия, запись 0, запись 1, чтение 0 и чтение 1. Все эти сигналы, за исключением импульса присутствия, формируются на шине главным устройством — MASTERом . В нашем случае это  микроконтроллер AVR. 

  Принцип формирования сигналов во всех случаях одинаковый. В начальном состоянии 1-Wire шина с помощью резистора подтянута к плюсу питания. Главное устройство «проваливает» на определенное время 1-Wire шину в ноль, затем «отпускает» ее и, если нужно, «слушает» ответ подчиненного (SLAVE) устройства. В нашем случае подчиненное устройство – термометр DS18B20. 

  Физически это реализуется так. 

  Операция записи бита: Вывод микроконтроллера устанавливается в режим выхода и на нем устанавливается логический ноль. Выдерживается пауза, длительность которой зависит от значения передаваемого бита (0 или 1), затем вывод переводится в режим входа в состоянии Hi-z и снова выдерживается пауза. 

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

   Все сеансы связи микроконтроллера с датчиком DS18B20 начинаются с сигнала сброса.  Микроконтроллер на 480 мкс «проваливает» 1-Wire шину в ноль, а затем «отпускает» ее. Если к шине подключен термометр DS18B20, то он  обнаруживает положительный перепад и после паузы в 15-60 мкс отвечает микроконтроллеру импульсом присутствия — «проваливает» шину в ноль на время от 60 до 240 мкс. 

  

   Обмен данными по 1-Wire шине происходит последовательно, младшим битом вперед. Передача или прием одного бита данных выполняются в течении фиксированного промежутка времени, так называемого тайм слота (time slot). Различают тайм слоты записи и тайм слоты чтения. Длительность всех тайм слотов должна быть > 60 мкс, а пауза между тайм слотами  > 1 мкс.   

   Для передачи нуля микроконтроллер «проваливает» 1-Wire шину на время от 60 до 120 мкс. Затем «отпускает» ее и перед записью следующего бита выдерживает паузу >1  мкс.

   Для передачи единицы микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс,  «отпускает» ее и выдерживает паузу. Пауза должна быть такой, чтобы длительность тайм слота была > 60+1 мкс. 

   

   DS18B20 является подчиненным устройством и может передавать данные, только когда микроконтроллер формирует на 1-Wire шине тайм слоты чтения.

Для формирования тайм слота чтения микроконтроллер «проваливает» 1-Wire шину на время от 1 до 15 мкс, а затем «отпускает» ее, передавая  управление состоянием 1-Wire шины датчику DS18B20.

Если DS18B20 передает ноль, он удерживает шину в «проваленном» состоянии (в состоянии логического нуля) до конца тайм слота. Если он передает 1, он оставляет шину в «подтянутом» состоянии. 

   Микроконтроллер может считывать данные датчика DS18B20 через 15 мкс после начала тайм слота чтения. 

Источник: http://chipenable.ru/index.php/item/80

Интерфейс 1-Wire

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

Интерфейс One-Wire (встречается и такая нотация) был разработан компанией Dallas Semiconductor и применен в виде огромного количества устройств изготовленной данной компанией. Думаю практически все знают температурные датчики c 1-Wire интерфейсом – DS18B20.

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

Как же передаются данные по однопроводной шине в обе стороны?

Данный вопрос очень удобно (и практично) рассмотреть на примере работы с датчиком температуры DS18B20.
Вот так выглядит схема его подключения:

Есть еще вариант с питанием датчика от линии данных, в таком случае вы получаете рабочий датчик температуры подключенный всего при помощи двух проводов!

Первым делом при работе с шиной 1-Wire необходимо её инициализировать, послать сигнал сброса.

Как видно из временной диаграммы (я позаимствовал её из даташита на датчик), мастер (т.е. контроллер устанавливает на шине нулевой потенциал на временя не менее 480 мкс, после чего устанавливает её в единичный потенциал.

После чего необходимо подождать 15-60мкс, чтобы датчик получил передний фронт и отправил импульс присутствия (presence pulse) длиной 60-240мкс.

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

Теперь рассмотрим процедуру отправки и приема бита.

Опять рассматриваем диаграммы из даташита.
При операции посылки (записи) бита мы должны установить шину в нулевой потенциал. Если мы хотим отправить “0”, то удерживаем нулевой потенциал по крайней мере 60мкс, если же необходимо отправить “1”, то после задержки в 1мкс, необходимо установить шину в единичный потенциал.

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

После чего переводим ножку микроконтроллера в режим приема данных и ожидаем 14мкс. После этого можно считать состояние линии. Она будет в высоком состоянии если передается “1” и в никзом, если “0”.

Наконец мы должны подождать ещё 45мкс до окончания периода в 60мкс.

Операция отправки/приема байта производиться в цикле, путем отправки/приема бита и сдвигов операнда.

При работе с данным датчиком методом “дергания ноги” очень важным является еще и точная работа функции задержки. И если с контроллерами AVR тут в принципе все нормально, то для stm32 придется пошаманить.

Также существует режим работы с шиной 1-Wire при помощи USART:

Такой режим намного удобнее для stm32 контроллеров. Там проблем с нехваткой USART'ов нет, да ножек хоть отбавляй.

Источник: http://blablacode.ru/mikrokontrollery/433

Как устроен однопроводный интерфейс 1-Wire

1-Wire — однопроводный низкоскоростной интерфейс, разработанный фирмой Dallas Semiconductor (сейчас она является подразделением фирмы MAXIM) для двунаправленного обмена данными с различными периферийными устройствами (датчики температуры, электронные ключи, аккумуляторы).

Это довольно дешёвый и надёжный интерфейс, для устройств, не требующих быстрого обмена большим количеством данных. Он позволяет обмениваться данными на скорости до 15,4 кбит/с в обычном режиме и до 125 кбит/с в режиме «overdrive» (в статье мы будем рассматривать обычный режим). При использовании специальных проводов (IEEE1394 — Firewire) расстояние передачи данных может составлять до 300 м.

Как физически устроен сам интерфейс? Да очень просто, — смотрим рисунок слева. В микрухах реализованы порты 1-wire, которые состоят из высокоомного приёмника и передатчика на полевом транзисторе с открытым стоком, подключенные к одному общему выводу (вывод порта 1-wire).

Типовой ток утечки закрытого выходного полевика составляет 5 мкА. Снаружи реализована шина 1-wire.

Она состоит из одного сигнального провода (поэтому интерфейс и назван однопроводным), подтянутого через резистор (типовое значение 5,1 кОм) к питанию (к плюсу) и одного провода, подключенного к общему проводу (то есть к минусу).

Обмен данными осуществляется по принципу Master-Slave (ведущий-ведомый), соответственно устройства с интерфейсом 1-wire бывают двух типов: «Master» (ведущее устройство) и «Slave» (ведомое устройство). Как правило в качестве «Мастера» выступает контроллер (или компьютер, через специальное устройство сопряжения), а в качестве «Слэйвов» — различные периферийные устройства.

На одну шину 1-wire можно подключить множество (до 248) slave-устройств, поскольку каждое такое устройство имеет уникальный 48-битный серийный номер, который вместе с байтом «CRC» и байтом «family code» (определяющим тип устройства) образует уникальную 64-битную метку. Ведущий на шине 1-wire должен быть один.

Питаться устройства с интерфейсом 1-wire могут как от независимого источника, так и от сигнального провода.

Если в устройствах используется КМОП-архитектура, то диапазон напряжений питания может быть довольно широкий, но, при подключении на одну шину, питание всех устройств должно быть примерно одинаковым (чтобы уровни напряжения правильно распознавались приёмниками).

В основном используются TTL-уровни (соответственно, пятивольтовое питание). Ещё хотелось бы добавить, что выход, реализованный на полевике с низким током утечки, — это специальная заточка под питание от сигнальной линии.

Если у вашего устройства будет внешнее питание — никто не мешает вам организовать порт 1-wire, например, на биполярном транзисторе с открытым коллектором. Аналогично, резистор 5,1 кОм — тоже не догма, его значение может варьироваться в зависимости, например, от ёмкости линии.

Теперь давайте подробнее расмотрим механизм передачи данных на уровне протокола.

Во первых, необходимо отметить, что всем обменом на шине управляет «Мастер». Только мастер решает — когда и с каким устройством он хочет поговорить и когда устройство должно посылать или принимать очередной бит. «Слэйвы» синхронизируются с «Мастером» по спаду на сигнальной линии и далее отсчитывают интервалы до тех или иных своих действий по внутреннему счётчику.

Единственное самостоятельное действие, разрешённое «Слэйву» — это выдача сигнала «Presence» (импульс присутствия), который он выдаёт сразу после подключения на шину, чтобы обозначить своё присутствие. Кроме этого, «Мастер» может сформировать на шине сигнал «Ресет», после которого все «Слэйвы» на шине должны ресетнуться и также ответить «Мастеру» сигналом «Presence».

Диаграммы сигналов «Reset» и «Presence» приведены на рисунке слева. Синим цветом обозначено состояние активности «Мастера» (когда он притягивает уровень на шине к нулю), красным цветом обозначено состояние активности «Слэйва» (когда «Слэйв» притягивает уровень на шине к нулю), серым цветом обозначено состояние, когда «Мастер» и «Слэйв» неактивны (сигнал через резистор подтянут к питанию).

Чтобы всё было понятно — опишем то, что нарисовано на этом рисунке, словами. Итак, чтобы сформировать сигнал «Reset», — «Мастер» должен притянуть уровень на шине к нулю на время не менее 480 мкс и не более 960 мкс (480 мкс ≤ TRSTL < 960 мкс).

После этого он должен отпустить шину и, не менее, чем на 480 мкс, прекратить свою активность на шине (TRSTH > 480 мкс).

«Слэйвы», не ранее, чем через 15 мкс, но и не позднее, чем через 60 мкс после того, как «Мастер» отпустит шину (15 мкс < TPDH < 60 мкс), должны сформировать на шине низкий уровень (это и есть сигнал присутствия), длительностью от 60 до 240 мкс (60 мкс < TPDL < 240 мкс), после чего они также отпускают шину.

После того как «Мастер», получив сигнал «Presence», понял, что на шине есть «Слэйвы» — он может начинать с этими «Слэйвами» обмен данными. Данные по шине передаются побитово, младшим битом вперёд. 0 и 1 кодируются уровнями напряжения на сигнальном проводе (0 — низкий уровень напряжения, 1 — высокий уровень напряжения).

Каждый бит передаётся в установленном временном промежутке, называемом тайм-слотом. Начало каждого тайм-слота (как я уже говорил) определяет «Мастер», притягивая шину к низкому уровню. Время между тайм-слотами не регламентировано, то есть один бит можно передать, условно говоря, сейчас, а другой, скажем, через 5 минут, ничего страшного при этом не произойдёт и данные не потеряются.

Выборка данных «Слэйвом» и «Мастером» происходит в разные временные интервалы, относительно начала тайм-слота, поэтому мы отдельно рассмотрим варианты передачи данных в направлениях «Мастер» ⇒ «Слэйв» (тайм-слот записи) и «Слэйв» ⇒ «Мастер» (тайм-слот чтения).

Тайм-слот записи показан на рисунке слева. Как и ранее, синим цветом обозначена активность «Мастера», красным — активность «Слэйва» и серым — моменты, когда линия подтянута к питанию через резистор.

  1. 1 мкс≤TLOW1

Источник: http://radiohlam.ru/?p=1236

Функции для работы с однопроводным интерфейсом One Wire

Библиотека для работы с интерфейсом One Wire (1-Wire) представляет собой набор функций для связи с внешним устройством по однопроводной шине, например, с цифровым термометром DS1820.

Протокол этого интерфейса, требующего для связи всего один провод, поддерживает ведущий (master) и ведомый (slave) микроконтроллер.

Благодаря используемой для этого интерфейса конфигурации аппаратуры (подтяжка к питанию и драйверы с открытым коллектором), он позволяет устройству slave получать питание по проводнику, используемому для связи.

 
Протокол интерфейса One Wire имеет следующие основные характеристики:

•  только одно ведущее устройство в системе;•  скорость обмена до 16 Кбод;•  расстояние между устройствами до 300 м;•  небольшие пакеты данных;

•  низкая стоимость.

Каждое устройство One Wire шины имеет уникальный 64-битовый регистрационный номер (8 бит – тип устройства, 48 бит – серийный номер и 8 бит – CRC), поэтому большое количество ведомых устройств могут сосуществовать на одной шине.

Следует заметить, что для работы с цифровыми термометрами фирмы Dallas частота тактового генератора микроконтроллера должна быть не менее 4 МГц.

 
Для работы с USART используются функции Ow_Reset, Ow_Read и Ow_Write. Описание этих функций представлено в таблицах 41 – 43 соответственно.

 Таблица 41.  Описание функции Ow_Reset

Прототип unsigned short Ow_Reset(unsigned short *port, unsigned short pin)
Возвращаемое значение 0, если DS1820 присутствует, и 1 – если нет
Описание Выдаёт сигнал сброса для One Wire DS1820. Аргументы port и pin определяют подключение DS1820 к микроконтроллеру
Требования Работает только с цифровым термометром DS1820
Пример //Cброс DS1820, который подключен к выводу RA5:Ow_Reset(&PORTA, 5)

 Таблица 42.  Описание функции Ow_Read

Прототип unsigned short Ow_Read(unsigned short *port, unsigned short pin)                                                      
Возвращаемое значение Данные, прочитанные из внешнего устройства по шине OneWire
Описание Читает один байт данных по шине OneWire
Требования Нет
Пример unsigned short tmp;…tmp = Ow_Read(&PORTA, 5);

 Таблица 43.  Описание функции Ow_Write

Прототип void Ow_Write(unsigned short *port, unsigned short pin, unsigned short par)                                        
Возвращаемое значение Нет
Описание Передаёт один байт данных (аргумент par) по шине OneWire
Требования Нет
Пример Ow_Write(&PORTA, 5, 0xCC)

Схема подключения цифрового термометра DS1820 по шине One Wire к выводу RA5 микроконтроллера показана на рисунке 28.

Рис. 28. Схема подключения цифрового термометра DS1820 к микроконтроллеру по шине One Wire

Источник: http://radio-hobby.org/modules/instruction/mikroC/funktsii-dlya-raboty-s-odnoprovodnym-interfeysom-one-wire

1-Wire

1-Wire это двунаправленная шина связи для устройств с низкой скоростью передачи данных (15,4 Кбит/с, в режиме overdrive 125 Кбит/с), в которой данные передаются по двум проводам, заземление и питание+данные.Иногда используют отдельный провод питания. Разработана корпорацией Dallas Semiconductor, является её зарегистрированной торговой маркой.

Топология такой сети называется общая шина. Сеть устройств 1-Wire со связанным основным устройством названа «MicroLan», тоже является торговой маркой Dallas Semiconductor.

Режим передачи данных по шине 1-Wire – полудуплексный: мастер и ведомые устройства передают данные по очереди.

Обмен информацией по шине 1-Wire происходит следующим образом.

Инициатором обмена является ведущее устройство, которым в большинстве случаев является микроконтроллер. Каждая транзакция через интерфейс 1-Wire начинается с того, что мастер передает импульс сброса “Reset Pulse” в линию 1-Wire.

Для этого он переводит напряжение в шине на низкий уровень и удерживает его в этом состоянии в течение 480 мкс.

Далее мастер отпускает шину, подтягивающий резистор возвращает напряжение к высокому логическому уровню. Ведомые устройства, обнаружив сигнал Reset по его окончании передают сигнал – Presence.

Это сигнал низкого уровня длительностью 100–200 мс. Так же устройство может передавать сигнал Presence и без импульса Reset в слечае его подключения к шине.

Интерфейс 1-Wire предусматривает “горячее” подключение – отключение устройства.

Информационный обмен по шине происходит под управлением мастера. После передачи импульса Presence устройство 1-Wire готово к приему команд.

Для обмена информацией по шине 1-Wire применяются специальные команды. Число комманд для каждого типа устройств различно. Но есть так называемые ROM-команды которые поддерживают все 1-Wire устройства.

Устройства в сети знают длину каждой команды. Формат команд такой – идентификатор команды (1байт), за которым следуют данные. Каждое устройство 1-Wire имеет уникальный 64-разрядный идентификатор (ID). ID состоит из 8-разрядного кода семейства, который идентифицирует тип устройства и поддерживаемые им функции, 48-разрядного серийного номера и 8-битного поля кода CRC-8.

Передачу команд инициирует мастер. Он отмечает командой Reset начало нового цикла транзакций и получив подтверждение, выбирает устройство специальной командой MATCH ROM, передавая ее идентификатор и 64 бита ID адресуемого устройства.

Ведомое устройство с данным ID получив такую команд ожидает новых команд от мастера, а все остальные остаются в пассивном состоянии до следующей команды Reset. Если в системе одно устройство то можно не передавать ID используя команду SKIP ROM.

В данном случае ведомое устройство считает себя выбранным без получения адреса.

Мастер выбрал устройство для взаимодействия и начинает процесс управления и обмена данными с этим устройством. Для этого используются команды, которые специфичны для каждого типа устройств.

Перед началом работы с устройством, мастер должен получить его ID. В случае применения в системе только одного ведомого устройства, можно использовать команду READ ROM в ответ на которую устройство передает свой 64-битный адрес.

Для обмена информацией используются тайм-слоты: один тайм-слот соответствует одному биту информации. В начале каждого таймслота мастер переводит линию в нулевой уровень. Если мастер хочет передать 0, он должен удерживает напряжение на низком уровне 60 мкс.

При передачеединицы мастер удерживает нулевое напряжение 5–6 мкс, а затем отпускает линию и выжидает примерно 60 мкс до начала формирования следующего тайм-слота. Передача данных начинается с младшего бита и далее происходит уже в виде байтов.

Осуществляется вычисление циклической контрольной суммы которая служит для гарантированного обеспечения целостности передаваемых данных.

Данные значения временных интервалов соответствуют стандартной скорости передачи данных, в режиме overdrive эти интервалы соответственно уменьшаются. Подача Reset Pulse в процессе передачи данных инициирует процедуру безусловного прекращения обмена информацией.

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

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

Выполнение такой команды составляет примерно 70 узлов сети в секунду.

1-Wire магистрали

Протяжённые 1-Wire магистрали имеют структуру, состоящую из трёх проводников: 1. DATA шина данных 2. RET (GND) возвратная шина или провод “земля”. 3.

EXT_POWER внешнее питание обслуживаемых ведомых абонентов и внешних относительно них цепей датчиков и органов управления.

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

Каждый из этих способов подразумевает использование специфичной технологии и аксессуаров при реализации магистрали.

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

(резистор на питание) До 100 метров и до 100 абонентов рекомендуется использовать витую пару не ниже 3 категории, топология строгая общая шина и мастером должно выступать устройство с активной подтяжкой или требуется использовать специальные схемные решения.

До 300 метров и до 200 абонентов, необходимо использовать витую пару не ниже категории 5, топология общая шина без разрыва ствола, мастер как вариант – программная модификация временных слотов 1‑Wire протокола.

Компаниия Maxim Integrated предоставляет свободно распространяемый тестовый программный пакета разработчика OneWireViewer.

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

Наибольшее применение устройства 1-wire нашли в виде круглых контактных площадок-«таблеток», называемых iButton, многим они знакомы в виде ключей от домофонов.

Другой пример использования – это различные датчики, например, датчики температуры из серии DS18B20, DS18S20, DS18S22 и им подобные.

Использование всего двух проводов делает достаточно удобным подключение серии датчиков, вместе с тем, в отличие от аналоговых датчиков, показания не зависят от длины провода.

Источник: http://arduinoguru.ru/index.php/manual/64-1-wire

Многокнопочная клавиатура с интерфейсом 1-Wire

Bernhard Linke, Maxim Integrated Products Inc, Dallas

Как известно, клавиатуры используются в устройствах на микроконтроллерах для ввода пользовательской информации и управления. В общем случае, многокнопочная клавиатура организуется как матрица кнопок объединенных в столбцы и строки.

Таким образом, интерфейс такой клавиатуры потребует определенного минимального количества линий ввода/вывода микроконтроллера. Например, 12-кнопочная клавиатура организуется в формат 4×3 и потребует 7 линий ввода/вывода. Для определения нажатой кнопки на такой клавиатуре микроконтроллер должен просканировать все столбцы и строки.

В сети Интернет много информации относительно этой технологии. Кроме того, применяются и другие методы организации клавиатуры.

Здесь мы рассмотрим организацию клавиатуры с интерфейсом 1-Wire, требующей всего лишь две линии (Data, GND) и, соответственно, от микроконтроллера потребуется лишь одна линия ввода/вывода. Основа нашей многокнопочной клавиатуры – 8-канальный адресуемый ключ с интерфейсом 1-Wire DS2408 от компании Maxim Integrated Products.

Микросхема DS2408 – двунаправленный порт с 8 каналами ввода/вывода, управляемый по одной сигнальной линии интерфейса 1-Wire. Выходы 8 каналов выполнены по схеме с открытым коллектором и имеют максимальное сопротивление 100 Ом.

В новой микросхеме реализован вывод строба достоверных данных, который может использоваться для защелкивания входных/выходных данных, управлять преобразованием данных во внешней схеме или работать с шиной данных микроконтроллера. Состояние выводов может быть сохранено во внутренней защелке для фиксирования мгновенных значений.

Эта функция полезна для поддержки работы клавиатуры или опроса кнопок. Каждый DS2408 содержит 64-разрядный номер, который записан в ПЗУ лазером на этапе производства микросхемы, что гарантирует уникальность каждого прибора и абсолютную идентификацию в сети.

Большое число микросхем DS2408 может быть подключено на одну шину 1-Wire независимо друг от друга. Управление DS2408 выполняется по стандартному интерфейсу Dallas Semiconductor 1-Wire.

Принципиальная схема организации клавиатуры на базе DS2408

Кликните для увеличения

8-канальный адресуемый ключ предоставляет порт ввода/вывода (P0-P7), который в нашем случае используется как входы. Резисторы RPD номиналом 1 МОм подключают входные линии на землю, что обеспечивает наличие низкого логического уровня на входах (P0-P7).

Цепь D1C1 обеспечивает питание микросхемы от сигнальной линии (паразитное питание). Нажатие какой-либо кнопки ведет к появлению высокого логического уровня на соответствующем порту.

Это изменение состояния устанавливает значение во внутренней защелке микросхемы.

Так как 1-Wire устройство является ведомым, то IC1 не инициирует коммуникацию. Инициализацию и опрос шины 1-Wire производит управляющее устройство – микроконтроллер. Чтобы минимизировать нагрузку на контроллер, устройство поддерживает функцию условного поиска, функция 1-Wire сети. Перед использованием данной функции необходимо настроить DS2408 в соответствии с нуждами приложения.

Конфигурирование включает в себя:

  • команду выбора канала, которая определяет отбор входных портов для функции условного поиска;
  • команду выбора полярности канала, которая определяет полярность выбранных портов для функции условного поиска.
  • команду выбора пина или защелки активности порта;
  • установку условия: ответит ли устройство при активности на единственном входе (ИЛИ) или при активности на всех портах (И).

Полагаем, например, что IC1 должна ответить на команду условного поиска, если определена активность на любом из 8 входных портов. Тогда для поиска нам необходимо отправить маску выбора канала 11111111b по адресу 008Bh. Единицы в разрядах байта маски означают, что устройство выбирает соответствующий канал.

Далее, для поиска, необходимо выбрать полярность канала: маска 11111111b отправляется по адресу 008Ch, где единички в разрядах означают активный «высокий уровень» для соответствующего канала.

В регистр статуса/управления DS2408 по адресу 008Dh необходимо отправить байт 00000001b, что означает выбор защелки активности порта в качестве источника, и устанавить условие ответа устройства при определении активности на единственном канале.

После подачи питания конфигурационные данные необходимо загрузить в 8-канальный адресуемый ключ DS2408 с использованием команды Write Conditional Search Register [CCh].

Далее следует команда Channel-Access Write [5Ah] с данными, определяющими, что порт используется как вход – FFh.

Завершает конфигурацию команда Reset Activity Latches [C3h], после этого устройство переходит в рабочий режим и готово отслеживать состояние кнопок.

После конфигурирования, программное обеспечение управляющего микроконтроллера должно реализовать бесконечный цикл, в котором ведомому устройству посылается команда условного поиска Conditional Search [ECh] после импульса сброса.

Если нажатия кнопок не определено, то ведомое устройство DS2408 не отвечает на команду условного поиска, о чем говорит высокий уровень на шине, немедленно после команды условного поиска (на протяжении временного интервала, соотвтетствующего чтению двух первых бит по шине).

В этом случае микроконтроллер отменяет условный поиск и начинает цикл снова.

Если микросхема отвечает на команду условного поиска, то первые два бита будут 1 и 0, представляя младшие значащие биты кода семейства, 29h, в прямой и инверсной форме. В этом случае, микроконтроллер должен завершить выполнение команды условного поиска, приняв ответ от ведомого – последовательность из 192 бит.

Далее микроконтроллер считывает данные от IC1 при помощи команды Read PIO Registers [F0h] с использованием адреса регистра защелки активности порта 008Ah.

После этого по шине от ведущего подается команда сброса, затем команда Resume Command [A5h], команда Reset Activity Latches [C3h] и переход в начало цикла для определения следующего нажатия кнопки клавиатуры.

Данные, считанные с регистра состояния защелки активности порта (Activity Latch State Register), говорят нам, какая кнопка была нажата. Если была нажата кнопка S1, то мы получим 00000001b, если нажата S2 – то получим 00000010b, и так далее.

По крайней мере один из битов буде равен 1. Если были нажаты несколько кнопок после последней команды Reset Activity Latches [C3h], то несколько бит будут равны 1.

Однако в программе микроконтроллера должна решаться такая ситуация – действительно ли были нажаты несколько кнопок.

Следует заметить, что при организации клавиатуры на базе DS2408 возможно разработать клавиатуру с более чем 8 кнопками. В стандартном решении для одной кнопки резервируется один порт (P0-P7), итого – 8 кнопок. Дополнительные кнопки можно связать с двумя одновременно активированными портами. Схема такого решения показана на рисунке ниже.

Если активируется кнопка SN, а следовательно активируются линии Px и Py, то диоды не допускают распространения высокого уровня на другие порты. Теоретический лимит количества кнопок при таком подключении – 255 и такое решение требует сочетания двух, трех, четырех, пяти, шести, семи и восьми диодов и, заметим, в некоторых случаях эффективнее использовать несколько DS2408 на одной шине.

Источник: https://www.rlocman.ru/shem/schematics.html?di=106270

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}