Skip to main content

1-Wire

1-Wire или OWI – это интерфейс, который представляет собой двунаправленную шину связи для устройств с низкоскоростной передачей данных, в которой данные передаются по цепи питания. Используется всего два провода, один общий, а второй для питания и данных.

Основные характеристики

  • работа в режиме «ведущего»;
  • минимальная частота тактирования 1 МГц;
  • поддержка стандартной и повышенной скоростей обмена;
  • поддержка набора стандартных команд;
  • расширенный набор статусов и прерываний.

Структурная схема 

Структурная схема 1-Wire

OWI состоит из следующих блоков:

  • REGISTERS – блок для хранения управляющих данных и статусов;
  • BUFFER_TX – буфер передатчика;
  • SHIFT_TX – сдвиговый регистр передатчика;
  • BUFFER_RX – буфер приемника;
  • SHIFT_RX – сдвиговый регистр приемника;
  • CLOCK_DIVIDER – делитель частоты;
  • 1-WIRE_TIMING_AND_CONTROL – основной блок интерфейса, содержащий управляющие автоматы и отвечающий за корректное функционирование.

Сигналы шины 1-Wire

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

Цикл сброса/обнаружения присутствия состоит из двух этапов: в течение времени t_RSTL ведущий подтягивает линию к низкому уровню, далее начинается окно t_RSTH, в течение которого после задержки t_PDH ведомое устройство переводит линию к низкому уровню на промежуток времени t_PDL, чтобы сообщить о своем присутствии. Для проверки импульса присутствия модуль OWI сначала ожидает t_PDW, а затем в течение t_PDSW производит выборку напряжения вывода 1W_IO.

Модуль OWI позволяет включить маскирование импульса присутствия, генерируемого ведомым устройством, установив бит PPM регистра OWICTRL. При установленном бите PPM модуль OWI генерирует импульс присутствия (пунктирная линия), который начинается с конца t_PPMS и длится до конца _t_PPME.

Цикл сброса/обнаружения присутствия

Тайм-слот записи нуля состоит из двух этапов: ведущий подтягивает линию в течение t_W0L, далее следует время восстановления t_REC0. Сумма времени t_W0L и t_REC0 равна длительности тайм-слота t_SLOT.

Тайм-слот записи нуля

Тайм-слот записи единицы также состоит из двух этапов: ведущий подтягивает линию в течение t_W1L, затем ожидается завершение тайм-слота.

Тайм-слот записи единицы

Тайм-слот чтения состоит из трех этапов: ведущий подтягивает линию к низкому уровню в течение t_W1L, ведомый устанавливает уровень на линии, после чего ожидается завершение тайм-слота. В течение t_MRS модуль OWI осуществляет выборку напряжения вывода 1WIO. Следует иметь ввиду, что ведомое устройство, отвечая нулем, начинает устанавливать низкий уровень на линии 1W_IO до того, как истечет время _t_W1L.

Тайм-слот чтения
ОбозначениеПараметр, единица измеренияУсловияМинМакс
T_OWIВнутренний период
синхросигнала модуля, мкс
Для достижения данного периода делитель входной системной частоты настроить в соответствии с таблицей регистра OWI_PRCR0,81
t_SLOTДлительность тайм-слота, мкс
Стандартная скорость передачи, LLM = 05670
Стандартная скорость передачи, LLM = 16480
Ускоренная передача810
t_W0LВремя низкого уровня тайм-слота записи нуля (Write-zero Low time), мкс
Стандартная скорость передачи4860
Ускоренная передача6,48,0
t_W1LВремя низкого уровня тайм-слота записи единицы/чтения (Write-one/read Low time), мкс
Стандартная скорость передачи, LLM = 04,86,0
Стандартная скорость передачи, LLM = 16,48,0
Ускоренная передача0,81,0
t_MRSВремя выборки тайм-слота чтения (Master Read Sample time), мкс
Стандартная скорость передачи, LLM = 01215
Стандартная скорость передачи, LLM = 119,224
Ускоренная передача1,62,0
t_REC0Время восстановления уровня тайм-слота записи нуля (Write-zero Recovery time), мкс
Стандартная скорость передачи, LLM = 0810
Стандартная скорость передачи, LLM = 11620
Ускоренная передача1,62,0
t_RSTLВремя низкого уровня цикла сброса (Reset Low time), мкс
Стандартная скорость передачи480600
Ускоренная передача5670
t_RSTHВремя высокого уровня цикла сброса (Reset High time), мкс
Стандартная скорость передачи384480
Ускоренная передача46,458
t_PDWВремя ожидания цикла присутствия (Presence-Detect Wait time), мкс
Стандартная скорость передачи8,010
Ускоренная передача1,62,0
t_PDSWВремя выборки цикла присутствия (Presence-Detect Sample Window), мкс
Стандартная скорость передачи, LLM = 048,861
Стандартная скорость передачи, LLM = 160,876
Ускоренная передача6,48,0
T_PPMSВремя начала маскированного цикла присутствия (Presence-Pulse Mask Start), мксСтандартная скорость передачи1620
T_PPMEВремя завершения маскированного цикла присутствия (Presence-Pulse Mask End), мксСтандартная скорость передачи7290

* – Временные характеристики зависят от задержек на универсальных портах ввода-вывода. Если порты работают медленно, то эти характеристики изменятся соответствующим образом.

Предварительная настройка

Перед началом работы с модулем OWI настроить предделитель и делитель частоты и включить систему тактирования в регистре OWI_PRCR. При необходимости использовать порывания задать соответствующие значение в регистр маски OWI_MSK. После этого модуль готов к работе на стандартной скорости и в байтовом режиме.

Генерация цикла сброса/обнаружения присутствия

Для генерации цикла сброса/обнаружения присутствия записать код 01h в регистр OWI_CFG. Если включено прерывание по биту PD в регистре OWI_MSK, то микроконтроллер может продолжить работу до завершения цикла. После завершения прочитать бит PDR регистра OWI_ST, чтобы установить, был ли обнаружен импульс присутствия.

Передача байта

Чтобы передать байт по шине 1-Wire необходимо записать его по адресу OWI_BUF в буфер передатчика. Затем данные переходят в сдвиговый регистр передатчика, где они последовательно отправляются на шину младшим битом вперед (LSB). Соответственно новый байт данных может быть записан в буфер передатчика. Как только сдвиговый регистр передатчика станет пустым, данные будут снова переданы из буфера, и процесс повторится. Каждый из этих регистров имеет флаг (регистр OWI_ST), на основе которого можно вызвать прерывание (регистр OWI_MSK). Бит TBE статусного регистра устанавливается, когда буфер передатчика пуст и готов принять новые дынные. Как только происходит запись байта в буфер передатчика, TBE очищается. Бит TEMT статусного регистра устанавливается, когда сдвиговый регистр пуст и готов принять новые данные. Как только байт передается из буфера в сдвиговый регистр, бит TEMT очищается, а TBE устанавливается.

Прием байта

Для считывания данных с шины 1-Wire необходимо подготовить ведомое устройство (команды, ранее полученные от ведущего). Процесс приема данных аналогичен передачи. Ведущий начинает прием, записывая FFh по адресу OWI_BUF в буфер передатчика. Данные, которые затем передаются в сдвиговый регистр приемника – это побитовое «И» переданных и принятых данных. После того, как сдвиговый регистр приемника заполняется, данные передаются в буфер приемника, откуда они могут быть прочитаны по адресу OWI_BUF. Следующие байты от ведомого устройства могут быть прочитаны путем повторной записи FFh в буфер приемника. Если ведомый не был готов передать данные, то полученные данные будут идентичны переданным. На основе состояния буфера приемника и сдвигового регистра приемника также могут генерироваться прерывания. Бит RBF статусного регистра устанавливается, когда данные из сдвигового регистра переданы в буфер, а очищается после чтения буфера. Пока флаг RBF установлен, дальнейшие передачи по шине 1-Wire выполняться не должны, иначе данные могут быть потеряны, так как произойдет перезапись буфера приемника следующим принятым байтом.

Битовый режим

Чтобы активировать битовый режим необходимо записать в бит BIT_CTL регистра OWI_CTRL «1». Последующая работа такая же, как и в байтовом режиме, однако важен только младший бит в буфере приемника/передатчика.

Ускоренная передача

Переключение между скоростями происходит посредствам бита OD регистра OWI_CTRL. Любые операции на шине 1-Wire после обновления бита OD происходят на новой скорости. Режим длинной линии относится только к стандартной скорости.

Режим ускоренного поиска ПЗУ (Search ROM Accelerator)

Прежде чем перейти в режим ускоренного поиска ПЗУ необходимо выполнить цикл сброса/обнаружения присутствия и отправить команду поиска ПЗУ (Search ROM – F0h) в байтовом режиме. Буфер приемника не должен содержать данных. Далее можно переходить в режим ускоренного поиска ПЗУ, переведя бит SRA регистра OWI_CFG в «1».

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

№ байтаБуфераБит 7Бит 6Бит 5Бит 4Бит 3Бит 2Бит 1Бит 0
1Передатчикr3xr2xr1xr0x
ПриемникID3d3ID2d2ID1d1ID0d0
2Передатчикr3xr2xr1xr0x
ПриемникID3d3ID2d2ID1d1ID0d0
...
16Передатчикr63xr62xr61xr60x
ПриемникID63d3ID62d2ID61d1ID60d60

x – биты, которые не имеют значения;

r_n – биты, которые выдаст ведущий при несоответствии идентификаторов;

d_n – флаги несоответствия (равен «1», если есть несоответствие или нет ответа);

ID_n – биты фактически выбранного идентификатора.

Для каждого бита (с 0 по 63) ведущий генерирует следующие три тайм-слота:

  • b1 – прием данных (истинный бит);
  • b2 – прием данных (инверсный бит);
  • b3 – передача данных.

В третьем временном интервале b3 ведущий передает «1» и «0» следующим образом:

  • b3 = r_n, если у двух и более устройств разные значения n-ого бита;
  • b3 = b1, если у всех устройств одинаковый n-ый бит;
  • b3 = «1», в случае если есть ошибка (нет ответа).

Бит, переданный в тайм-слоте b3, идентичен ID_n.

Для начала выполнения поиска ПЗУ во все r_n биты пишутся нули. В случае возникновения ошибки все последующие биты ID_n будут равны «1» до тех пор, пока бит SRA не будет деактивирован. Таким образом, если биты ID_63 и d_63 равны «1», то произошла ошибка во время процедуры поиска и необходимо повторить последнюю последовательность. В противном случае, все ID_n (с 0 до 63) – это идентификатор ПЗУ устройства, которое было найдено и адресовано. После завершения поиска ПЗУ нужно очистить бит SRA для вывода ведущего из режима Search ROM Accelerator. Для поиска следующего устройства повторно используется предыдущий набор r_n (n = 0…63), но r_m устанавливается в «1», где m – наивысший порядок флага несоответствия. Все r_i, где i > m, устанавливаются в «0». Этот процесс повторяется до тех пор, пока не произойдет расхождение на одной и той же битовой позиции в течение двух проходов.

Пример использования режима

В данном примере рассматривается процесс поиска четырех различных устройств на шине 1-Wire. Они имеют следующие идентификаторы (представлены только младшие значащие биты от 0 до 8):

ROM1 = 00110101…

ROM2 = 10101010…

ROM3 = 11110101…

ROM4 = 00010001…

  1. Микроконтроллер инициализирует импульс сброса, записывая 01h в регистр OWI_CFG. Все подчиненные устройства отвечают импульсом обнаружением присутствия.
  2. Микроконтроллер отправляет команду поиска ПЗУ (Search ROM), записывая F0h в буфер передатчика. Необходимо дождаться установления статуса RBF и считать (освободить) буфер приемника.
  3. Микроконтроллер переводит модуль в режим Search ROM Accelerator, записывая 02h в регистр OWI_CFG.
  4. Микроконтроллер записывает 00h в буфер передатчика и считывает возвращаемые данные из буфера приемника. Этот процесс повторяется для всех 16 байт. Считанные данные будут содержать в IDn ROM4, а «1» установлена в d_0 (r_n содержит «0», следовательно, ROM2 и ROM3 переходят в состояние ожидания) и d_2 (аналогично первому случаю ROM1 переходит в состояние ожидания). Принятые данные выглядят следующим образом (ID_n подчеркнуты, наиболее значащий флаг несоответствия выделен): полученные данные (1) = 1*0_0_0***1**_0_0_1_0_0_0_0_0_0_0_1
  5. Микроконтроллер преобразует полученные данные в идентификатор устройства путем устранения лишних битов.
  6. Микроконтроллер записывает 00h в регистр OWI_CFG для выхода из режима ускоренного поиска ПЗУ. После этого ведущий может продолжить работу с адресованным ведомым.
  7. Для нахождения следующего устройства шаги с 1-ого по 6-ой повторяются, только на этот раз в передаваемой последовательности наиболее значащий бит решения несоответствия (r2 в данном случае) инвертируется, и все данные, следующие за ним, устанавливаются в ноль. Полученные данные содержат идентификатор ROM1, а d_0 и d_2 снова установлены в «1»:
    отправленные данные (2) = 0
    0_0_0_0_1_0_0_0_0_0_0_0_0_0_0*…
    полученные данные (2) = 1*0_0_0***1**_1_0_1_0_0_0_1_0_0_0_1*…
  8. Так как наиболее значащий флаг несоответствия остался прежним (d2), то нужно использовать следующий наиболее значащий (d_0). Процесс повторяется. Следующие итерации выглядят следующим образом: 
    отправленные данные (3) = 0
    10_0_0_0_0_0_0_0_0_0_0_0_0_0
    полученные данные (3) = 1*1***1**_0_0_1_0_0_0_1_0_0_0_1_0_0*…
    отправленные данные (4) = 01_0_1_0_0_0_0_0_0_0_0_0_0_0_0
    полученные данные (4) = 1*1***1**_1_0_1_0_1_0_0_0_1_0_0_0_1*…
  9. Так как наиболее значащий флаг несоответствия (d_2) не изменился, то переходим к следующему (d_0). Однако, d_0 обработан дважды, а менее значимых флагов несоответствия больше нет. Следовательно поиск завершен, найдены идентификаторы всех четырех устройств.

Статусы и прерывания

В отличии от остальных модулей в OWI прерывание по биту-событию не формируется от последующих событий после перехода бита в «1», пока он не будет сброшен чтением обратно в «0». Остальные принципы работы, описанные в разделе «Типы статусов и прерывания», остаются неизменными.

Регистры 1-Wire

АббревиатураДоступОписание
2B00hOWI_CFGRW*Регистр конфигурации
2B04hOWI_BUFRWРегистр буфера приемника/передатчика
2B08hOWI_STRРегистр статуса
2B0ChOWI_MSKRWРегистр маски
2B10hOWI_PRCRRWРегистр делителя часты
2B14hOWI_CTRLRWРегистр управления

* – Не все регистры доступны для записи.

OWI_CFG

Данный регистр используется для генерации цикла сброса/обнаружения присутствия 1-Wire, а также для активации или деактивации режима ускоренного поиска ПЗУ (Search ROM Accelerator), который позволяет избежать использования однобитовых операции с шиной (бит FOW) во время процедуры поиска. В дополнение этим двум функциям регистр содержит 2 бита для непосредственного управления выводом 1W_IO.

Бит76543210
НазначениеРезервOW_INFOWSRA1WR
Начальное значение01W_IO0

OW_IN (1-Wire Input) – текущее значение на линии 1-Wire (только чтение):

  • 1 – значение на линии соответствует логической единице;
  • 0 – значение на линии соответствует логическому нулю.

Используется в сочетании с битом FOW для выполнения пользовательских функций. Например, 
для чтения необходимо изменить FOW на «0», затем подождать необходимое количество времени и установить состояние OW_IN.

FOW (Force 1-Wire) – прямое управление линией 1-Wire:

  • 1 – переводит линию в состояние логического нуля;
  • 0 – оставляет линию в состоянии высокого импеданса.

Данную функцию необходимо разрешить путем записи бита EN_FOW регистра OWI_CTRL. 
В противном случае изменение FOW не влияет на состояние шины. Если EN_FOW и FOW равны «1», то генерация импульса сброса и функция передачи/приема (регистр OWI_BUF) не работают. Изменение EN_FOW на «0» имеет тот же эффект, что и запись в FOW «0».

SRA (Search ROM Accelerator) – включение режима ускоренного поиска ПЗУ:

  • 1 – модуль работает в режиме ускоренного поиска ПЗУ;
  • 0 – модуль работает в нормальном режиме.

1WR (1-Wire Reset) – управление генерацией последовательности сброса/обнаружения присутствия на линии 1-Wire:

  • 1 – инициализировать генерацию цикла сброса/обнаружения присутствия;
  • 0 – цикл сброса/обнаружения присутствия не генерируется.

Бит переводится в «0» после завершения генерации цикла сброса/обнаружения присутствия. Цикл можно прервать, записав «0».

OWI_BUF

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

Бит76543210
НазначениеDATA
Начальное значение0

DATA – данные на передачу или принятые дынные. Данные могут передаваться в байтовом или битовом режиме в зависимости от бита BIT_CTL регистра OWI_CTRL. В битовом режиме имеет значение только младший бит.

OWI_ST

Бит76543210
НазначениеOW_LOWOW_SHORTRSRFRBFTEMTTBEPDRPD
Тип статусаEVENTEVENTFLAGEVENT
Начальное значение01110

OW_LOW – принят импульс присутствия от ведомого устройства. Ведомое устройство при подключении к незанятой шине генерирует спонтанный импульс присутствия, который устанавливает этот бит. Любой переход в «0» на незанятой шине также устанавливает этот бит.

OW_SHORT – короткое замыкание на шине. Перед началом импульса сброса или тайм-слота ведущий проверяет, находится ли шина в режиме ожидания на высоком уровне. Если в этот момент уровень шины низкий, то связь невозможна.

RSRF (Receive Shift Register Full) – сдвиговый регистр приемника заполнен. Когда этот бит равен «0», то это указывает на то, что сдвиговый регистр приемника не содержит данных или осуществляет их прием. После передачи данных в буфер приемника этот бит сбрасывается аппаратно.

RBF (Receive Buffer Full) – буфер приемника заполнен. Флаг переходит в «1», когда есть новые данные, полученные из сдвигового регистра приемника. Если бит равен «0», то это указывает, что буфер приемника не содержит новых данных. Этот бит сбрасывается аппаратно после чтения буфера приемника.

TEMT (Transmit Shift Register Empty) – сдвиговый регистр передатчика пуст и готов принять новые данные. Флаг устанавливается в «1», когда регистр сдвига передатчика не содержит данных. После передачи данных из буфера передатчика в сдвиговый регистр передатчика этот бит переходит в «0». Если бит равен «0», то это указывает на то, что регистр сдвига передатчика занят передачей данных.

TBE (Transmit Buffer Empty) – буфер передатчика пуст и готов принять новые данные. Флаг устанавливается в «1», когда буфер передатчика не содержит данных. После записи данных в буфер передатчика этот бит переходит в «0». Если бит равен «0», то это указывает на то, что буфер передатчика ждет окончания сдвига данных из сдвигового регистра передатчика.

PDR (Presence Detect Result) – результат цикла обнаружения присутствия:

  • 1 – импульс присутствия не обнаружен;
  • 0 – обнаружен импульс присутствия.

PD (Presence Detect) – цикл сброса/обнаружения присутствия завершен, а результат находится 
в бите PDR. При использовании прерывания по данному биту оно должно быть включено в OWI_MSK до инициализации цикла сброса.

OWI_MSK

Бит76543210
НазначениеOW_LOWOW_SHORTRSRFRBFTEMTTBEРезервPD
Начальное значение0

Для каждого из битов справедливо:

  • 1 – данное прерывание формируется;
  • 0 – данное прерывание не формируется.

OWI_PRCR

Модуль OWI требует внутренней тактовой частоты 1 МГц. Эта частота генерируется от тактовой частоты системы f_clk. Регистр OWI_PRCR позволяет управлять делителем и передделителем тактовой частоты с целью максимально приблизить f_clk к 1 МГц. Систему тактирования модуля необходимо настроить и включить до начала передачи по шине 1-Wire.

Бит76543210
НазначениеCLK_ENРезервDIVPRE
Начальное значение0

CLK_EN – включение системы тактирования OWI:

  • 1 – система тактирования включена;
  • 0 – система тактирования выключена.

DIV – выбор коэффициента делителя частоты:

  • 111b – f_clk/128;
  • 110b – f_clk/64;
  • 101b – f_clk/32;
  • 100b – f_clk/16;
  • 011b – f_clk/8;
  • 010b – f_clk/4;
  • 001b – f_clk/2;
  • 000b – f_clk.

PRE – выбор коэффициента предделителя частоты:

  • 11b – f_clk/7;
  • 10b – f_clk/5;
  • 01b – f_clk/3;
  • 00b – f_clk.

Делитель и предделитель работают совместно.

Мин. fclk, МГцМакс. fclk, МГцМакс. погрешность fclk, %Коэф. деленияDIVPRE
21010
11,2525100000
22,525200100
33,7525300001
4больше 5 25401000
5больше 6 20500010
6больше 7 17600101
7больше 8 14700011
8больше 10 25801100

OWI_CTRL

Бит76543210
НазначениеРезервODBIT_CTLРезерв*EN_FOWPPMLLM
Начальное значение0

* – Не изменять начальное значение.

OD (Overdrive) – режимом ускоренной передачи:

  • 1 – режим ускоренной передачи включен;
  • 0 – режим ускоренной передачи выключен.

BIT_CTL – выбор битового или байтового режима:

  • 1 – режим битовой передачи включен;
  • 0 – режим байтовой передачи выключен.

Следовательно, в битовом режиме соответствующие биты в статусном регистре устанавливаются после 1 тайм-слота, а не после 8 тайм-слотов, как в байтовом режиме.

EN_FOW (Enable Force 1-Wire) – разрешение прямого управления линией 1-Wire:

  • 1 – разрешено управление линией 1-Wire посредствам бита FOW регистра OWI_CFG;
  • 0 – прямое управление линией 1-Wire запрещено.

PPM (Presence Pulse Masking) – режим маскирования импульса присутствия:

  • 1 – маскирование импульса присутствия включено;
  • 0 – маскирование импульса присутствия выключено.

В условиях длинной линии импульсы присутствия, генерируемые ведомыми устройствами, могут вызывать помехи на линии. Маскирование импульса присутствия может предотвратить неблагоприятные эффекты, вызванные импульсом присутствия. Если PPM равен «1», то результат цикла обнаружения присутствия (бит PDR регистра OWI_ST) всегда равен «0», даже если на шине нет ведомого устройства.

LLM (Long Line Mode) – режим длинной линии:

  • 1 – режим длинной линии включен;
  • 0 – режим длинной линии выключен.

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