Поиск ROM на шине 1-WIRE.

Категория: 3. Протоколы обмена
Автор: DARK Просмотров: 639

 

1wir

  Решил из спортивного интереса разобраться с поиском всех устройств на шине         1 - WIRE. Напомню, для чего это нужно. Каждое устройство имеет свой индивидуальный код, идентификатор. Если на шине одно такое устройство, то код можно не вводить. А если их несколько или сотни, надо знать все коды, где-то хранить и т.д. Интересно опросить устройства на шине узнать и записать их коды.

 

 

 

Как известно для всех устройств, работающих   на данной шине, есть общие команды, одна из них это SearchROM и как частный случай этой команды это AlarmSearch. Первая из них осуществляет поиск всех устройств на шине, вторая только тех, которые находятся в состоянии тревоги. В дальнейшем речь пойдет только о SearchROM.

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

  1.     Сразу при написании программы считать все ROM и жестко привязать программу к этим номерам. Но чтобы сменить один датчик придется перепрограммировать контроллер заново с новым кодом ROM, к тому же этот код надо еще считать с датчика. Совершенно не подходит если готовое устройство работает вдали от «цивилизации» ну или хотя бы от компьютера.
  2.    Если датчиков немного, и есть свободные порты, можно выделить каждому свой порт. Тоже не подходит, если датчиков хотя бы 10, либо при дефиците выводов…
  3. И самый оптимальный объединить все датчики в одну шину, занимая тем самым только один вывод контроллера. Обращаться к датчикам придется только по их кодам ROM. Если на шине даже хотя бы 20 датчиков, то считать со всех коды ROMуже довольно утомительно. Поэтому решено было разобраться с алгоритмом автоматического поиска всех кодов устройств, подключенных к шине, при этом никаких манипуляций с подключением и отключением устройств от шины делать нет необходимости. Они все должны быть подключены…
  4. searh rom

 

К счастью, разработчики уже позаботились о нас и разработали алгоритм поиска, который описан в документе Application Note 187. Здесь же есть и блок схема алгоритма.

Теперь немного теории:

По спецификации на шину, логическая 1 должна формироваться за счет подтягивающего резистора R1 (из чего следует, что выводы, как самих устройств, так и контроллера должны находится в высокоимпедансном состоянии, т.е. работать на вход), логический 0 должен формироваться либо самими устройствами, либо контроллером за счет подтяжки шины на землю. Таким образом исключаются электрические конфликты. Пока на шине все тихо, ни одно устройство ничего не выдает и на шине присутствует логическая 1 за счет R1. Очевидно, что все устройства на шине соединены по схеме монтажное И. И если обратиться сразу ко всем устройствам, то и получим ответ как логическое И всех ROM.

Как видно из документа «DS18B20 ProgrammableResolution 1-WireDigitalThermometer» после передачи команды SearchROMконтроллером, все датчики каждое устройство передаст свой нулевой бит кода, а затем его инверсию. Очевидно, что при наличии одного датчика мы должны принять 0 и 1, либо 1 и 0, т.е. сам бит и его инверсию. Теперь если хоть у одного из устройств этот бит будет отличаться от всех остальных, контроллер примет логическое И этих бит, т.е. 0 и 0… Это принципиально, т.к. именно на этом принципе основан алгоритм поиска. В дальнейшем контроллер должен передать принятый бит, либо при обнаружении различий, выбрать одно из направлений поиска и запомнить номер текущего различия, передав в шину 0 или 1. Таким образом мы можем отсеять часть устройств на шине, у которых текущий бит не будет совпадать. В дальнейшем будет осуществлен возврат к запомненной точке и выбрано другое направление поиска, исключая, тем самым, уже другую группу устройств… Надо отметить, что вся соль алгоритма заключается именно в выборе направления поиска и он не случаен… Также запоминаем только последнее различие в битах, а не все.

В итоге, мы сможем получить все коды устройств, подключенных к шине. И, кстати, количество проходов будет в точности равно количеству устройств. И не играет никакой роли, что это, датчики температуры, или ключи таблетки, или какое либо другое устройство, работающее по протоколу 1-WIRE. Это не принципиально…

Собственно программу прилагаю. Сама процедура приема и передачи байта была заимствована из самоучителя, с поправкой на 18 PICи, а также исправлена некорректная работа процедуры в некоторых случаях. Ошибка проявлялась в неспособности (не всегда, иногда работала J) оригинальной подпрограммы считывать байты. Обусловлено было некорректной работой на шине, т.к. контроллер переключал вывод на вход только в случае приема, а должен всегда работать на вход если нет передачи…

В программе сделаны два «мертвяка», там где должен быть выход из подпрограммы, и второй, если поиск кончился с ошибкой. Тут все зависит от логики самой программы и оставляю на выбор варианты. Места я указал… Также при удачном окончании поиска в регистре count_DQнаходится количество устройств, подключенных к шине. Сами коды ROM находятся по адресу 7FFFи в сторону уменьшения адресов. При этом более старший байт находится в ячейке с бОльшим адресом… Доступ можно получить через табличное чтение… Также программа рассчитана максимум на 64 устройства. Правда определит она хоть неограниченное количество устройств, но сохранение в памяти программ гарантируется только для 64 устройств… Проверку CRCне организовывал… Но метка стоит там, где она должна быть… И еще оговорюсь, в железе программа полностью не проверялась, т.к. просто нет в наличии стольких датчиков…

Скачать  материал здесь

 


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

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