Протокол
записи 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 |
4 |
передача |
R |
|
5 |
прием |
P |
|
6 |
передача |
0x1D |
ключ записывается и без этой последовательности |
7 |
передача |
тайм-слот
записи 0 |
|
8 |
передача |
R |
|
9 |
прием |
P |
|
10 |
передача |
0x1E |
|
11 |
прием |
0xFF |
4) Проверка
записанного кода
Данный этап происходит аналогично пункту 1.
5) Ожидание
момента, когда ключ уберется с лузы дубликатора
Можно пропустить данный абзац и даже не читать, но
все-таки раз дубликатор это делает, значит опишу. До
тех пор, пока Вы не уберете ключ с лузы дубликатора
идет чередование Reset -> Presense.
Перед тем как использовать материалы из этой статьи
хочу обратить внимание на некоторые моменты:
-
Данная информация
опубликована исключительно для ознакомления (прочитав материал, Вы должны его
тут же забыть).
-
Использование в
коммерческих целях недопустимо. Имейте совесть!
- При перепечатке материалов ссылка на страницу sunstudent.narod.ru обязательна.
Вот и всё, что я хотел сказать. Ещё один орех расколот,
теперь нужно ставить новую цель и идти к ней. Удачи!
Хочу выразить
особую благодарность hexFFh, за помощь в изучении
протокола и написании статьи