Протокол записи RW1990 (заключение)

Итак, с последней моей статьи прошло более двух недель. За это время можно было горы свернуть, однако, среди всех людей, желающих ознакомиться с протоколом, только от hexFFh я смог получить реальную помощь. Основные наши усилия были направлены на модернизацию логического анализатора. Коллега помог собрать прибор на микроконтроллере ATMEGA16 и написал прошивку для него.

Основное отличие данного анализатора от предыдущего варианта заключается в том, как данные передаются на компьютер. Если первоначально я передавал состояние линии непрерывно и разрешающая способность прибора обуславливалась пропускной способностью COM порта – 115 кБит/с, то вариант hexFFh расшифровывает протокол внутри микроконтроллера и посылает готовые данные на компьютер.

Теперь ближе к делу. В данной статье будет рассмотрен протокол записи двух самых распространенных болванок: RW1990.2 и RW1990.

До недавнего времени я думал, что две эти заготовки абсолютно идентичны по протоколу, однако этот миф также быстро развеялся. Вначале моё предположение подтвердилось в описании, размещенном на сайте ikey.ru, а затем и опытным путем. Новый код для RW1990 записывается инверсно. Как обычно передача начинается с family code, младшим байтом вперед, но биты в каждом байте инвертированы. Больше отличий в протоколах нет, поэтому все последующие высказывания будут относиться к заготовке второй версии.

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

Последовательность записи в EEPROM RW1990.2 через 1-Wire порт следующая:
1) Чтение ПЗУ;
2) Инициализация записи;
3) Запись кода в EEPROM;
4) Проверка записанного кода;
5) Ожидание момента, когда ключ уберется с лузы дубликатора.

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

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

Для того, чтобы запись заготовки происходила достаточно уверенно, а записанные данные не носили случайный характер, необходимо обеспечить ток порядка 1 мА. У меня RW1990.2 стабильно записывается при номинале подтягивающего резистора 200 Ом (вход подтянут относительно положительного потенциала напряжения питания +5 В).

Запись происходит, как уже писалось выше, в несколько этапов. Подробно разберем каждый из них.

1) Чтение ПЗУ.
Перед тем как записать заготовку дубликатор трижды считывает уникальный код, находящийся в ПЗУ RW1990.2.
Как известно из технической документации для этого предназначена команда 0x33, перед которой следует чередование сигналов Reset и Presence. Для того, чтобы упростить чтение лога введем следующие сокращения: R – Reset, P – Presence. Также не забываем, что чтение и запись информации идёт начиная с младшего бита, а инициирует передачу/прием всегда только мастер.

Таблица 1
№ п/п Режим мастера Данные Примечание
1 передача R последовательность повторяется три раза
2 прием P
3 передача 0x33
4 прием 64-бита (уникальный код ПЗУ)

2) Инициализация записи
В таблице 2 представлена последовательность, которую дубликатор посылает перед записью ключа. Следует отметить, что перед посылкой первого пакета Reset->Presence (см. п.1 табл.2) выдерживается уровень логической единицы порядка 4 мс. Перед передачей Reset (см. п.5 и п.9 табл.2) длительность импульса логической единицы составляет 13 мс, перед Reset (п.9 табл. 2) – 16 мс. Все остальные временные промежутки согласно документации на DS1990.

Таблица 2
№ п/п Режим мастера Данные Примечание
1 передача R повторяем 4 раза
2 прием P
3 передача 0x1E
4 прием 0xFF
5 передача R
6 прием P
7 передача 0x1D
8 передача тайм-слот записи 1
9 передача R
10 прием P
11 передача 0x1E
12 прием 0xFF
13 передача R
14 прием P

3) Запись кода в EEPROM
Для того чтобы запись кода происходила корректно, необходимо после передачи каждого бита выдержать импульс логической единицы более 10 мс. Здесь действует правило – лучше передержать, чем недодержать. Импульсу Reset (позиция 8 в табл. 3) предшествует импульс логической единицы длительностью 13 мс

Таблица 3
№ п/п Режим мастера Данные Примечание
1 передача 0xD5
2 передача 64-бита (записываемый код) временные диаграммы см. рисунок 2
3 передача R
4 прием P
5 передача 0x1D ключ записывается и без этой последовательности
6 передача тайм-слот записи 0
7 передача R
8 прием P
9 передача 0x1E
10 прием 0xFF

4) Проверка записанного кода
Данный этап происходит аналогично пункту 1.

5) Ожидание момента, когда ключ уберется с лузы дубликатора
Можно пропустить данный абзац и даже не читать, но все-таки раз дубликатор это делает, значит опишу. До тех пор, пока Вы не уберете ключ с лузы дубликатора идет чередование Reset -> Presense.

Перед тем как использовать материалы из этой статьи хочу обратить внимание на некоторые моменты:
- Данная информация опубликована исключительно для ознакомления (прочитав материал, Вы должны его тут же забыть).
- Использование в коммерческих целях недопустимо. Имейте совесть!
- При перепечатке материалов ссылка на страницу sun-student.ru обязательна.
Вот и всё, что я хотел сказать. Ещё один орех расколот, теперь нужно ставить новую цель и идти к ней. Удачи!

Хочу выразить особую благодарность hexFFh, за помощь в изучении протокола и написании статьи