Основные принципы работы iButton фирмы Dallas Semiconductor. Часть 5
Система команд DS1990A.
Как только мастер определил на шине наличие импульса presence, он может послать одну из четырёх команд, работающих с ПЗУ (ROM) DS1990A. Каждая команда состоит из 8 бит. Перечень этих команд следующий (в квадратных скобках указан hex-код команды):
Read ROM [33h] или [0Fh] (прочитать ПЗУ)
Эта команда позволяет мастеру шины прочитать из DS1990A код устройства (family code), уникальный 48-битный серийный номер и 8-битный CRC. Эта команда может быть использована только в том случае, если на шине присутствует только одно устройство DS1990A (для электронного замка это условие выполняется). Если на шине присутствует более одного подчинённого устройства, произойдёт коллизия данных, когда все slave-устройства начнут передавать одновременно (параллельно соединённые открытые стоки будут работать как логический элемент И). DS1990A будет одинаково реагировать как на код команды 33h, так и на код 0Fh для обеспечения совместимости с более ранней версией электронного серийного номера DS1990, который реагирует только на команду 0Fh.
Math ROM [55h], Skip ROM [CCh], Searсh ROM [F0h]
Не будем останавливаться на этих командах, поскольку для электронного замка они не нужны (подробности по ним см. в Книге Стандартов iButton фирмы Dallas Semiconductor).
Генерирование CRC.
Для проверки правильности данных, переданных из DS1990A (как, впрочем, и из других устройств iButton) master может генерировать значение CRC из принятых данных. Эта сгенерированная величина затем сравнивается с величиной, сохранённой в последних 8 битах DS1990A. Master вычисляет CRC от 8-битового family code и всех 48 бит серийного номера, но не от самой сохранённой в iButton величины CRC (от первых 7 байт содержимого DS1990A). Если две величины, вычисленная и считанная напрямую, совпадают, то передача была безошибочной. Для генерации CRC используется полином вида:
CRC = x8 + x5 + x4 + 1
Ниже приведён код из технического описания DS1990A фирмы Dallas Semiconductor для процессора с системой команд Intel 8051, реализующий алгоритм вычисления CRC.
DO_CRC:
; Процедура DO_CRC считает КУМУЛЯТИВНО CRC от всех данных, передаваемых в acc.
; Перед началом подсчёта в CRC надо поместить 0. Затем каждый байт помещается
; в acc, вызывается процедура DO_CRC, и величина CRC в ней обновляется.
; После того, как все данные прошли через DO_CRC, переменная CRC будет
; содержать результат (контрольную сумму). Эквивалентная полиномная; функция этой подпрограммы:
; CRC = X^8 + X^5 + X^4 + 1
mov a, r7 ;параметр в C-функции передаётся через r7
push acc
push b
push acc ;сохраним сдвигаемые биты
mov b, #8 ;установить сдвиг = 8 бит
CRC_LOOP:
xrl a, CRC ;вычисляем CRC
rrc a ;двигаем её в перенос
mov a, CRC ;получаем последнюю величину CRC
jnc ZERO ;пропускаем, если data=0
xrl a, #18h ;обновляем CRC
ZERO:
rrc a ;позиционируем новую CRC
mov CRC, a ;запомним новую CRC
pop acc ;получим оставшиеся биты
rr a ;позиционируемся на следующий бит
push acc ;сохраним оставшиеся биты
djnz b, CRC_LOOP ;повторим для восьми бит
pop acc ;очистим стек
pop b
pop acc
ret
Более подробно принцип вычисления CRC описан в Книге Стандартов iButton фирмы Dallas Semiconductor.