Пример ускоренного поиска ПЗУ
Приведенный ниже пример должен обеспечить лучшее понимание того, как функция ускоренного поиска ПЗУ позволяет мастеру 1-Wire идентифицировать четыре различных прибора на шине 1-Wire с приведенными ниже идентификаторами ПЗУ (приведены только младшие значащие байты):
- ROM1 = 00110101....
- ROM2 = 10101010....
- ROM3 = 11110101....
- ROM4 = 00010001....
- Микроконтроллер формирует импульс сброса, записывая 01h в регистр команд. Одновременно с поиском присутствия реагируют все подчиненные устройства.
- Микроконтроллер формирует команду поиска ПЗУ (Search ROM), записывая F0h в регистр команд. Ведущий должен дождаться флага RBF и считать (освободить) регистр буфера приемника.
- Микроконтроллер переводит мастера 1-Wire в режим ускоренного поиска ПЗУ, записывая 02h в регистр команд.
- Микроконтроллер записывает 00h в буфер передатчика и считывает возвращенные данные из регистра буфера приемника. Этот процесс повторяется для всех 16 байт. Считанные данные содержат ROM4 в позиции бита ID и установленные флаги несоответствия d0 и d2. Это может быть замечено при сравнении битов приведенных идентификаторов ПЗУ. Первое несоответствие имеется в нулевом бите (d0). Временной интервал записи мастера шины содержит 0, таким образом, снимая выделение ROM2 и ROM3. После этого несоответствие между ROM1 и ROM4 происходит во втором бите идентификатора ПЗУ (d2), оставляя только в поиске только ROM4. Таким образом, принятые данные будут выглядеть следующим образом (d0ID0 d1ID1 d2ID2 d3ID3 d4ID4 d5ID5 d6ID6 d7ID7 ....):
Принятые данные = 10 00 10 01 00 00 00 01....
- Микроконтроллер тогда изменяет чередование данных для достижения идентификатора ПЗУ 00010001... и данных несоответствия (полужирных) 10100000.... с последним несоответствием в размещении d2.
- Микроконтроллер записывает 0x00h в регистр команд для выхода из режима ускоренного поиска. Теперь ведущий может послать или принять данные непосредственно от этого прибора.
- Для нахождения остальных идентификаторов повторяются шаги с 1 по 6. 16 байтов данных, посланных на сей раз идентичны ROM4 вплоть до последнего флага несоответствия (d2 в нашем случае), который инвертируется и все информационные разряды несоответствия более высокого порядка устанавливаются в 0 как показано: r0r1r2r3r4r5 .... = 001000..... Для этой поисковой итерации, принятые данные содержат идентификатор ROM1 в размещениях бита ID и снова установленные биты несоответствия d2 и d0.
Принятые данные = 10 00 11 01 00 01 00 01....
- Так как наиболее значительное несоответствие (d2) не изменилось, то для следующего поиска используется следующее самое высокое несоответствие (d0) r0r1r2r3r4r5.... =100000.....
Принятые данные = 11 10 01 00 01 00 01 00....
Разделение чередования выдает ПЗУ ID 10101010.. (ROM2) и флаги несоответствия 11000000.. (d1 - наиболее значительный флаг).
- Следующий поиск использует идентификатор ПЗУ, полученный в прошлом поиске, за исключением наиболее значительного флага несоответствия: r0r1r2r3r4r5.... =110000...
Принятые данные = 11 11 01 01 00 01 00 01....
Разделение чередования выдает ПЗУ ID 11110101.. (ROM3) и флаги несоответствия 11000000.. (d1 - наиболее значительный флаг).
- В этом пункте, наиболее значительное несоответствие (d1) не изменилось, поэтому используется следующее несоответствие (d0). Однако, d0 был обработан во втором поиске и с тех пор не было никаких меньших несоответствий. Поэтому поиск закончен и идентификаторы ПЗУ всех четырех приборов найдены.
|