Анализ протокола записи RW1990 (часть 1)

Теперь разберемся с протоколом записи ключей типа RW1990.2. Лог записи номера F9000009E5544C01 на болванку можно взять здесь. Запись последнего произведена с помощью логического анализатора, описанного в предыдущей статье (пункт 1). В архиве содержится 2 файла. Файл с разрешением 2.txt является двоичным логом записи, причем первым в каждом байте записан младший значащий разряд. Файл с разрешением doc представляет собой переработанный в табличную форму файл 2.txt.

Таблица состоит из 4-х колонок:
1) Колонка «№ п/п» - номер по порядку;
2) Колонка «Лог. сост» - логическое состояние (соответственно может быть только "0" и "1");
3) Колонка «Кол-во» - число измерений (выборок), приходящееся на соответствующее логическое состояние;
4) Колонка «Время, мкс» - время в микросекундах, в течение которого было соответствующее логическое состояние.

Итак, весь процесс записи ключа дубликатором можно разбить на несколько этапов:
1) Проверка первоначально записанного кода;
2) Если записанный код не совпадает с записываемым, то дубликатор посылает ряд команд (если быть точным, то 2);
3) Сверка записанного кода.

Весь процесс занимает 2-3 секунды.
Теперь разберем каждый этап более подробно

1) Проверка первоначально записанного кода
Данный этап полностью специфицирован в документации на DS1990, представленной на сайте производителя - компании Maxim IC. Коротко коснемся основных моментов.

Дубликатор посылает ключу команду(33h) на чтение ПЗУ. В ответ на что, RW1990.2 отсылает 64 битный "уникальный" код. Давайте обратимся к логу записи: дубликатор целых 3 раза посылает команду на чтение ПЗУ (см. позиции лога записи с 75 по 87, с 220 по 234 и с 359 по 374). Видимо два предыдущих варианта окончились неудачно, т.е. в считывающем устройстве не сошлась контрольная сумма, пересылаемая ключом в последнем байте, и ему пришлось повторно отправить команду на чтение.

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

Передача команды начинается с позиции 519. Давайте обратимся к графику (см. рис. 2, 3), на котором я прорисовал всю последовательность инициализации.

Как ни странно в первом пакете можно обнаружить всего 15 бит информации. Скорее всего один бит просто "слился" с предыдущим в виду схемотехнических особенностей моего логического анализатора. На графике этот момент отмечен красным. Свои попытки поймать 16 бит я делал неоднократно, но увы за 3 испытания мне ничего уловить так и не удалось. Вот только результат с каждой попыткой получался всё хуже и хуже. В одной из попыток у меня получилось всего 13 бит в данном пакете.

Давайте теперь определим, что именно передается/посылается за эти 16 бит. Тут возможны 2 варианта:
1. Дубликатор посылает только 8 бит и 8 бит получает в ответ от ключа.
2. Дубликатор посылает 16 бит ключу, хм... а ключ ничего не отвечает. Или ответом ключа является последующая последовательность бит, которую я ошибочно принял за вторую команду.
На сегодняшний день будут прорабатываться 2 рабочие версии. Итак, на рисунке 2 мы видим пересылку команды 1Eh по протоколу 1-Wire, а на рисунке 3, скорее всего, ответ ключа RW1990.2 на данный запрос (байт FFh), либо это просто – RW1990 отмолчался (смотря как к этому относиться).

После первых 16 бит, дубликатор посылает сброс и передаёт вторую управляющую команду (см. рис. 4). Расшифровывая протокол, я столкнулся с некоторой неопределенностью, которая возникает при чтении лога (позиции 553-568). Опираясь на протокол получается, что следующий команда – 1Ch, если же взывать к логике, и проследить аналогию с последующими битами, то вроде выходит – 1Dh.

Сразу после неё дубликатор передает сам "уникальный" код, который будет записан в энергонезависимую память RW1990.2. Запись происходит по следующему алгоритму: чтобы передать "1" дубликатор передает логический ноль в течение до 14 микросекунд, а затем логическую единицу в интервале времени до 13 милисекунд; для передачи "0" время логического нуля увеличено с 14 до 60 микросекунд при оставшемся неизменным по времени уровне логической единицы (см. рис.5).

В EEPROM таким образом передается 64 бита.
Продолжение следует…