Dallas crc ошибка

Звездочка в коде ключа

Звездочка, появляющаяся на экране дубликатора после прочтения кода, означает, что контрольная сумма (CRC) не совпадает.
Ключ DS1990A и другие ключи Dallas имеют контрольное число для проверки прочитанного кода, это самый первый байт.

Он рассчитывается по специальной формуле из остальных 7 байт.
Если записать такой код на заготовку, то домофоны не будут реагировать на такой ключ, так как данное несовпадение служит сигналом, что при чтении кода ключа произошла ошибка (например, был плохой контакт в лузе) и какой-то байт прочитан неверно.

Дубликатор считывает ключ и отображает несовпадение в виде символа звездочки или сообщения BAD CRC.
Тем самым прибор дает понять, что контрольная сумма байт данного кода не соответствует той, что должна быть.
В большинстве случаев это признак того, что ключ просто прочитан с ошибкой. Выйдите в режим чтения и прочитайте ключ ещё раз.

В программе iKeyBase есть галка «исправлять СRC» — в данном случае контрольная сумма, считанная из ключа, будет пересчитана и исправлена.
Однако, это не гарантирует, что ключ начнет работать, т.к. это всего лишь контрольная сумма остальных байт.
Исправится только CRC, программа пересчитает его и заменит, после чего ключ будет читаться панелью, но если ошибка была не в самой контрольной сумме, а в коде ключа, то дверь он открывать всё равно не будет — код ключа окажется незнакомым домофону.
Контрольная сумма нужна только для проверки чтения и в большинстве случаев не позволяет восстановить утраченное правильное значение в самом коде.

Форум РадиоКот • Просмотр темы — CRC8 OF DALLAS

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 10:18:30 

Открыл глаза

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

Доброго ремени суток!
никогда ранее не работал с контрольными суммами.а тут вот пришлось.порылся в инете.сидел долго,научился считать на бумажке 8битный срс со сдвигом вправо)))) имею опыт работы с микролан,но ранее считать КС не было необходимости.решил проверить полученные данные на практике.нашел спецификацию ibutton,где указан конкретный пример расчета FC+ID.но разобраться КАК они там что считают,не могу.короче,возникают следующие вопросы:
1.почему указанный полином в даташите и спецификации 100000111.а во всех примерах используется 0х8С(10001100)?
2.если данные передаются LSBпервым,то каким образом осущетвляется расчет CRC8 DALLAS??? пример из документа что-то как-то не лезет ни под одно правило,которое я нашел.

если есть у Вас опыт расчета CRC8 DALLAS,подскажите,плиз,как это делается правильно????.не примеры си или асма,а как говорится на пальцах)))мне хочется понять логику,а код я и сам в состоянии написать,понимая суть процесса.

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

Jack_A

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 11:13:17 

Друг Кота
Аватар пользователя

Карма: 62

Рейтинг сообщений: 817

Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5430
Откуда: Minsk

Рейтинг сообщения: 0

Не совсем прямой ответ, но все же… Я в своих проектах сторонник табличного вычисления CRC, если памяти ROM хватает, зато вычисление быстрое. Только использую CRC16 , CRC8 — отстой, IMHO, не слишком надежен.

Вернуться наверх
Реклама

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 11:13:33 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

Fnnfго что вы наплодите сто тем — лучше не будет. Если на ваш позавчирашний пост не ответили, подумайте, может вы написали не достаточно внятно или вообще муйню? С другой стороны можете взять мобильник и попросить танка загрузить вам знания. Из этой реальности вам загрузить знания не удастся.

anton234ff писал(а):

1.почему указанный полином в даташите и спецификации 100000111.

А где вы в спецификации нашли такие цифры???????????

anton234ff писал(а):

а во всех примерах используется 0х8С(10001100)?

Вообще-то не 8с. а X^8_X^5+X^4+X^0.

Схема приведённая в даташите реально отражает процесс вычисления CRC.
Вот например на VHDL вполне работоспособный код — у меня в термометре работает. datain — бит из потока данных идущий с ds18x20 именно в порядке с младшего бита.

Код:

crc <= (crc(0) xor datain) & crc (7 downto 5) & (crc(4) xor crc(0) xor datain) & (crc(3) xor crc(0) xor datain) & crc(2 downto 1);

Что вам еще не понятно?

Вот когда-то сделал екселевскую табличку для расчета CRC — заполнять зеленые поля.
https://docs.google.com/spreadsheet/ccc … jlSN09UYlE
(Убедительная просьба не портить формулы, а лучше сделайте себе копию и с ней играйтесь)

Мммммммм. может еще можно поиском попользоваться…

А, кажется понял. Вы, наверное не в курсе, что существуют разные полиномы для расчета CRC!


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Последний раз редактировалось uldemir Вс ноя 18, 2012 21:24:35, всего редактировалось 1 раз.

Вернуться наверх

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 11:42:22 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

ваш сарказм,дорогой товарищ,мягко говоря,неуместен.есть сферы,в которых и я могу поумничать.
x^8+x^5+x^4+1 это 100110001.открываем апп27 на странице номер 5 и видим 10001100.КАКОГО СПРАШИВАЕТСЯ??????далее открываем блокнот,скаченный где-то во всемирной помойке и видим то же самое 0х8с.

Вернуться наверх
Реклама

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 11:57:57 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

вы не ответили на первый вопрос:

anton234ff писал(а):

1.почему указанный полином в даташите и спецификации 100000111

Покажите подробно где вы его увидели.
Откуда берется 8Ch (он же 18h) я знаю. Но! это «примеры си или асма» которого вы просили избегать. Потому я его и избегаю.
Так что сначала покажите строчку указанную в первом вопросе. А то пока не понятно, в чем проблема-то.

p.s. впрочем, как говорил раньше, сделать так чтобы вы поняли логику я не могу. Могу только порекомендовать самостоятельно почитать умную книжку: http://rsdn.ru/article/files/classes/Se … cguide.pdf


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх
Реклама

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 12:12:35 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

по поводу указанного числа-наверное уже по запарке его вбил,хотя имел в виду то,что указал сегодня чуть ранее.
по поводу си и асма-я имел ввиду не ссылки типа «вот мой код написанный сто лет назад,гарантированно работает,ставь и не парься».мне нужно ПОНЯТЬ,а написать на си,да и на асме кстати тоже смогу сам.
так почему же все таки 0х8с?можно узнать?и как это число получается из указанного полинома в даташите?

Вернуться наверх

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 12:34:59 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

эту книжку я читал.как вообще считается контрольная сумма я вкурил.если указанная степень полинома равна 8,количество дополняющих нулей соответственно 8,и срс 8 бит.но 0х8с это никак не восьмая степень.

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 12:38:41 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

18 — это маска по которой надо инвертировать биты, вроде, после сдвига. 8С — до сдвига, но так как старший бит уходит… то, похоже оптимальнее 18.


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

urry

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 12:47:48 

Сверлит текстолит когтями
Аватар пользователя

Карма: 22

Рейтинг сообщений: 78

Зарегистрирован: Пн дек 08, 2008 10:58:48
Сообщений: 1257
Откуда: Винница

Рейтинг сообщения: 0

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 12:59:58 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

А ну да, в википедии он назван как реверсивный.

01234567 8
10001100 1 = 31

8 76543210
1 00110001 = 8C

откуда 18?

А 18 это 8С до сдвига вправо.


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 13:16:28 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

так,давайте подведем промежуточный итог.по алгоритму CRC-8 DALLAS контрольная сумма будет вычисляться все таки таким образом???

0000111100000000 | 100110001
000000000
———-
111100000
100110001
———-
011010001
000000000
———-
110100010
100110001
———-
100100110
100110001
———-
000101110

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 13:36:39 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

вы бы отступы сделали. а то не вижу логики.


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 13:56:30 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

да,я их делал.при отправке сообщения что-то с форматированием произошло)))
0000111100000000 | 100110001
000000000
———-
——111100000
——100110001
———-
—— 011010001
——000000000
———-
——-110100010
——-100110001
———-
———100100110
———100110001
———-
———000101110

по моим представлениям примерно так

Вернуться наверх

polyname

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 14:13:29 

Карма: 1

Рейтинг сообщений: 10

Зарегистрирован: Пт май 18, 2012 23:12:23
Сообщений: 249

Рейтинг сообщения: 0

вот проверенный код:

Код:

// CRC8 Dallas (021cb801000000a2=0x00)
#define CRC8_DS_INIT 0x00
U8 crc8_ds_upd(U8 data, U8 crc_prev) {
    data ^= crc_prev;
    crc_prev = 0;
    if(data & 0x01) crc_prev = 0x5e;
    if(data & 0x02) crc_prev ^= 0xbc;
    if(data & 0x04) crc_prev ^= 0x61;
    if(data & 0x08) crc_prev ^= 0xc2;
    if(data & 0x10) crc_prev ^= 0x9d;
    if(data & 0x20) crc_prev ^= 0x23;
    if(data & 0x40) crc_prev ^= 0x46;
    if(data & 0x80) crc_prev ^= 0x8c;
    return crc_prev;
}

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 14:35:13 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

У меня получилось так-же.

Код:

0000111100000000 | 100110001
000000000…….
———-
—-111100000…
—-100110001
———-
——110100010..
——100110001
———-
——100100110.
——100110001
———-
——-000101110
——-000000000
———-
———00101110


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

shads

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 14:52:26 

Опытный кот
Аватар пользователя

Карма: 8

Рейтинг сообщений: 105

Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882

Рейтинг сообщения: 0

anton234ff писал(а):

если есть у Вас опыт расчета CRC8 DALLAS,подскажите,плиз, как говорится на пальцах)))мне хочется понять логику процесса.

Вот тут в свое время GUDD-HEAD на пальцах объяснял мне….. И я все понял….. Потом написал свои процедуры и на асме и на С…..

Вернуться наверх

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 14:57:18 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

угу.есть калькулятор для расчета срс SCB-CALC.в поле результата третья ячейка выдает значение в формате СРС8.сколько ни бился с ручным расчетом,ни разу мои результаты не совпали с ответом данного калькулятора.даже в нашем случае на 00001111 ответ выдает 11101011. (((((((

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 15:29:42 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

не знаю. с моим калькулятором сходится. для 00001111 CRC 74 (00101110)
вот попробовал для 01010101 посчитать получилось D1 (10001011)


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

anton234ff

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 15:33:12 

Зарегистрирован: Ср янв 04, 2012 12:40:34
Сообщений: 53

Рейтинг сообщения: 0

а как он называется?хочу найти и скачать

Вернуться наверх

uldemir

Не в сети

Заголовок сообщения: Re: CRC8 OF DALLAS

СообщениеДобавлено: Вс ноя 18, 2012 16:04:27 

Друг Кота
Аватар пользователя

Карма: 46

Рейтинг сообщений: 1353

Зарегистрирован: Пт авг 28, 2009 21:34:30
Сообщений: 7187
Откуда: 845-й км.

Рейтинг сообщения: 0

Медали: 1

Получил миской по аватаре (1)

в моём первом сообщении этой темы после слов: «Вот когда-то сделал екселевскую табличку для расчета CRC — заполнять зеленые поля.» Ексель не нужен — оно работает под гугловским спредшитом. Ну и конечно считает только далласовский полином. Сделал когда сам разбирался с этими CRC.


_________________
А люди посмотрят и скажут: «Собаки летят. Вот и осень.»

Вернуться наверх

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Во время передачи информации от одного устройства к другому могут возникать различные ошибки (помехи в радио-эфире, электромагнитные наводки в проводах), приводящие к повреждению данных. Достаточно повредить один бит, и число может сильно измениться! Например передавали число 123, которое выглядит как 0b01111011, и неправильно передали один бит. Приёмник получил число 0b01011011, что уже является числом 91! Если речь идёт о дистанционном управлении каким-то устройством, то даже один “битый” бит в посылке может привести к серьёзной аварии. Как приёмнику понять, что принятые данные повреждены?

Контрольная сумма


Самый простой вариант – контрольная сумма. Перед отправкой данных передатчик суммирует все байты и отправляет их например последними в посылке. Благодаря такой штуке как переполнение переменной, даже в один байт можно бесконечно суммировать данные и получить в итоге конкретное число, олицетворяющее все передаваемые данные. Например, передаём набор байтов 201, 125, 47, 94, 10, 185. Их суммой будет число 662, если брать ячейку int, или 150, если это byte. Осталось отправить контрольную сумму последним байтом (или двумя, если передаём int число)! Приёмник получает посылку, в свою очередь суммирует все байты кроме последнего (или двух последних, если контрольная сумма 16-битная), а затем сравнивает это значение с полученной контрольной суммой. Если отличается хоть на 1 – данные повреждены. Причём повреждёнными при передаче могут быть как сами данные, так и контрольная сумма: в любом случае они не совпадут, а это означает, что передача произошла с ошибкой. Давайте рассмотрим пример “передачи и приёма” структуры, где будет использоваться конструкция, позволяющая разбивать любые данные на байтовый поток. Три таких конструкции мы рассмотрели в уроке про указатели и ссылки. Структуру используем для удобства упаковки и использования данных. Универсальная для любого типа данных функция расчёта хеш-суммы может выглядеть так:

byte getHash(byte* data, int length) {
  byte hash = 0;
  int i = 0;
  while (length--) {
    hash += *(data + i);
    i++;
  }
  return hash;
}

И возвращать байт суммы. Создадим и заполним структуру данными и прогоним через эту функцию. В последний байт структуры запишем контрольную сумму:

// структура данных посылки
struct MyData {
  byte channel;
  int val_i;
  float val_f;
  byte hash;  // байт контрольной суммы
};

void setup() {
  Serial.begin(9600);
  // создаём и заполняем дату
  MyData data;
  data.channel = 16;
  data.val_i = 12345;
  data.val_f = 3.1415;
  data.hash = 0;

  // расчёт суммы
  byte thisHash = getHash((byte*)&data, sizeof(data));

  // пакуем в посылку
  data.hash = thisHash;

  // выведем для отладки
  Serial.println(thisHash); // выдаст 102
}

Теперь можно передать структуру приёмнику! Пример “синтетический”, так как кому и каким способом передавать данные мы не рассматриваем. Хотя, можно отправить по Serial, например с одной Ардуины на другую, как в уроке по парсингу Serial:

Serial.write((byte*)&data, sizeof(data));

Далее на приёмнике примем данные:

// структура данных посылки
struct MyData {
  byte channel;
  int val_i;
  float val_f;
  byte hash;  // байт контрольной суммы
};
MyData rxData;

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) {
    // приняли данные
  }
}

Теперь нужно убедиться в том, что данные верны. Для этого прогоним их через ту же суммирующую функцию, но без учёта последнего байта, так как он сам является суммой:

byte thisHash = getHash((byte*)&rxData, sizeof(rxData) - 1);

Если значение совпадёт с переданным rxData.hash – данные верны! Дополним предыдущий код:

void loop() { 
  if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) {        // читаем дату
    byte thisHash = getHash((byte*)&rxData, sizeof(rxData) - 1); // считаем сумму
    if (thisHash == rxData.hash) {
      // данные верны
    } else {
      // данные повреждены
    }
  }
}

И по условию можем выполнять какие-то действия, например применить полученные данные к устройству или проигнорировать их. Достоинства контрольной суммы:

  • Быстрое и простое вычисление на любой платформе
  • Возможность сделать 8 и 16 бит без особых вмешательств в код (это ваше домашнее задание)

Недостатки контрольной суммы:

  • Низкая надёжность по сравнению с другими алгоритмами

Низкая надёжность заключается в том, что контрольная сумма не учитывает порядок байтов в посылке, то есть не является уникальным “отпечатком” всех данных. Например, данные повредились так, что из вот такого пакета

data.channel = 16;
data.val_i = 12345;
data.val_f = 3.1415;

Превратились в такой:

data.channel = 15;
data.val_i = 12346;
data.val_f = 3.1415;

Но контрольная сумма всё равно будет 102! Также контрольная сумма фактически игнорирует нули, то есть любой набор данных со всеми нулями и условно одной единичкой будет обрабатываться одинаково (например 0, 0, 0, 1, 0, 0 и 0, 1, 0, 0, 0, 0), что также снижает надёжность. Поэтому рассмотрим более хитрый алгоритм, который называется CRC.

CRC


CRC (cyclic redundancy code) – циклический избыточный код. Алгоритм тоже выдаёт некое “число” при прохождении через него потока байтов, но учитывает все предыдущие данные при расчёте. Как работает данный алгоритм мы рассматривать не будем, об этом можно почитать на Википедии или здесь. Рассмотрим реализацию CRC 8 бит по стандарту Dallas, он используется в датчиках этой фирмы (например DS18b20 и домофонные ключи iButton). Данная реализация должна работать на всех платформах, так как это чисто C++ без привязки к архитектуре (компилятор сам разберётся):

byte crc8(byte *buffer, byte size) {
  byte crc = 0;
  for (byte i = 0; i < size; i++) {
    byte data = buffer[i];
    for (int j = 8; j > 0; j--) {
      crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1);
      data >>= 1;
    }
  }
  return crc;
}

Данная функция применяется точно так же, как предыдущая getHash(), просто “скармливаем” ей данные в байтовом представлении и всё! Но есть пара моментов:

  • При расчёте CRC перед отправкой нужно исключить байт самого CRC (последний), даже если он нулевой. То есть в примерах выше: byte thisHash = crc8((byte*)&data, sizeof(data) - 1);
  • При расчёте CRC на стороне приёмника можно прогнать все данные полностью, вместе с байтом CRC. В этом случае функция вернёт 0, если данные верны! Это очень удобно использовать.

Финальный пример. Передатчик:

// структура данных посылки
struct MyData {
  byte channel;
  int val_i;
  float val_f;
  byte crc;  // байт crc
};

void setup() {
  Serial.begin(9600);
  // создаём и заполняем дату
  MyData data;
  data.channel = 16;
  data.val_i = 12345;
  data.val_f = 3.1415;

  // расчёт CRC (без последнего байта)
  byte crc = crc8((byte*)&data, sizeof(data) - 1);

  // пакуем в посылку
  data.crc = crc;
}

void loop() {
  // отправляем
  Serial.write((byte*)&data, sizeof(data));
  delay(1000);
}

byte crc8(byte *buffer, byte size) {
  byte crc = 0;
  for (byte i = 0; i < size; i++) {
    byte data = buffer[i];
    for (int j = 8; j > 0; j--) {
      crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1);
      data >>= 1;
    }
  }
  return crc;
}

Приёмник:

// структура данных посылки
struct MyData {
  byte channel;
  int val_i;
  float val_f;
  byte crc;  // байт crc
};
MyData rxData;

void setup() {
  Serial.begin(9600);
}

void loop() { 
  if (Serial.readBytes((byte*)&rxData, sizeof(rxData))) { // читаем дату 
    byte crc = crc8((byte*)&rxData, sizeof(rxData)); // считаем crc посылки полностью
    if (crc == 0) {
      // данные верны
    } else {
      // данные повреждены
    }
  }
}

byte crc8(byte *buffer, byte size) {
  byte crc = 0;
  for (byte i = 0; i < size; i++) {
    byte data = buffer[i];
    for (int j = 8; j > 0; j--) {
      crc = ((crc ^ data) & 1) ? (crc >> 1) ^ 0x8C : (crc >> 1);
      data >>= 1;
    }
  }
  return crc;
}

Также коллега поделился реализацией данного алгоритма на ассемблере для AVR, она работает чуть быстрее и весит чуть легче, что может быть критично например для ATtiny:

byte crc8_asm(byte *buffer, byte size) {
  byte crc = 0;
  for (byte i = 0; i < size; i++) {
    byte data = buffer[i];
    // резкий алгоритм для AVR
    uint8_t counter;
    uint8_t buffer;
    asm volatile (
      "EOR %[crc_out], %[data_in] \n\t"
      "LDI %[counter], 8          \n\t"
      "LDI %[buffer], 0x8C        \n\t"
      "_loop_start_%=:            \n\t"
      "LSR %[crc_out]             \n\t"
      "BRCC _loop_end_%=          \n\t"
      "EOR %[crc_out], %[buffer]  \n\t"
      "_loop_end_%=:              \n\t"
      "DEC %[counter]             \n\t"
      "BRNE _loop_start_%="
      : [crc_out]"=r" (crc), [counter]"=d" (counter), [buffer]"=d" (buffer)
      : [crc_in]"0" (crc), [data_in]"r" (data)
    );
  }
  return crc;
}

Функция используется точно так же, как предыдущая.

Полезные страницы


  • Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
  • Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
  • Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
  • Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
  • Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
  • Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
  • Поддержать автора за работу над уроками
  • Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])

Некоторые пользователи при загрузке (или установке) файлов с каких-либо источников могут столкнуться с ошибкой CRC, проявляющей себя сообщением «Ошибка в данных (CRC)». Данная проблема обычно возникает в ситуации, когда система фиксирует несовпадение контрольных данных загружаемого файла, вследствие чего возникает сообщение об ошибке в данных CRC. В этой статье я расскажу, что это за ошибка, при каких условиях она возникает, а также поясню как её исправить.

  • Что такое CRC
  • Особенности возникновения ошибки
  • Ошибка в данных CRC — проблемы с жёстким диском
  • Как исправить ошибку CRC — альтернативные варианты
  • Заключение

Ошибка CRC

Что такое CRC

Прежде чем начать описывать, что делать в ситуации, когда появляется ошибка CRC, следует пояснить, что такое «CRC».

Как известно, CRC (Cycle Redundancy Check – в переводе «циклическая избыточная проверка») являет собой алгоритм создания и проверки «контрольной суммы файла». Последняя используется в слежении за целостностью передаваемых данных с целью профилактики их повреждения или потери.

Данный алгоритм на основе циклического кода вычисляет контрольную сумму файла и добавляет её к телу самого файла. При загрузке (копировании) данного файла система, обладая алгоритмом вычисления контрольной суммы, проверяет правильность полученных данных, и при возникновении нестыковок выдаёт сообщение об ошибке CRC (data error — cycle redundancy check ).

Алгоритм CRC был изобретён в далёком 1961 году, пережил несколько качественных улучшений, и ныне является универсальным средством для проверки целостности получаемых данных.

Иллюстрация технологии CRC

Особенности возникновения ошибки

Что же до причин возникновения данной дисфункции, то конкретные причины ошибки CRC могут быть следующими:

  • Потеря или повреждение какого-либо из пакетов сетевых данных при их передаче;
  • Потеря или повреждение данных на жёстком диске (к примеру, из-за плохих секторов);
  • Физическое повреждение оптического диска с информацией (CD, DVD и др.);
  • Нарушение целостности системного реестра;
  • Случайный сбой при инсталляции программы;
  • Неверная конфигурация файлов и так далее.

Для отображения кода CRC существует такая программа как HashTab, которая, после своей установки, в свойствах самого файла (кликаем правой клавишей мыши на файле, затем выбираем «Свойства) отображает значения контрольных сумм данного файла.

Программа HashTab

Ошибка в данных CRC — проблемы с жёстким диском

Итак, как исправить ошибку CRC? Поскольку она регулярно случается из-за проблем к доступу жёсткого диска, то рекомендую выполнить следующее:

Действие 1. Восстановите потерянные данные на жёстком диске. Если данная проблема возникла при попытке получения доступа к какому-либо файлу на жёстком диске, тогда стоит использовать различные программы для восстановления потерянных данных. В частности, можно попробовать в деле такие программные продукты как Power Data Recovery или BadCopy Pro, предназначенные именно для рассматриваемых мной задач.

К примеру, чтобы воспользоваться Power Data Recovery, необходимо скачать и установить приложение, в меню выбрать «Damaged Partition Recovery», и осуществить полное сканирование (Full Scan). Если потерянные данные удастся восстановить, тогда, первым делом, нужно будет скопировать их на надёжный и безопасный носитель.

Программа Power Data Recovery

Действие 2. Альтернативным вариантом восстановления доступа к данным на винчестере является использование системной утилиты проверки диска.

  1. Зайдите в Проводник, кликните правой клавишей мыши на проблемном диске (например, С:), в появившемся меню выберите «Свойства».
  2. Перейдите на вкладку «Сервис», кликните на «Выполнить проверку», поставьте галочки напротив двух опций проверки диска, нажмите на «Ок», а затем перезагрузите компьютер.
  3. После перезагрузки система автоматически задействует проверку целостности данных на жёстком диске, и попытается восстановить повреждённые сектора (может занять какое-то время).

Кнопка проверки диска

Проверьте диск на наличие ошибок

Действие 3. Также можно запустить командную строку от имени администратора (нажать на кнопку «Пуск», в строке поиска написать cmd (не нажимая на ввод), кликнуть на появившийся вверху однотипный результат правой клавишей мыши, и выбрать «Запуск от имени администратора). В командной строке необходимо написать:

chkdsk c: /r /f — (вместо «с:» впишите имя другого проблемного диска при необходимости) затем нажать на ввод, и дождаться окончания проверки.

Как исправить ошибку CRC — альтернативные варианты

Кроме проблем с жёстким диском, ошибка CRC может возникать и по другим причинам. Потому чтобы пофиксить ошибку CRC сделайте следующее:

  • Скачайте торрент-файл из другого источника. Если вы скачали какой-либо файл с торрентов и получили ошибку CRC, тогда запустите торрент-клиент, удалите закачку с ошибкой, а потом и сами некорректно загруженные файлы на жёстком диске. Попробуйте поискать альтернативную закачку той же программы на торрент-трекере, возможно проблемная закачка была создана не совсем корректно, или файлы в ней были повреждены. В некоторых ситуациях не будет лишним и переустановить торрент-клиент, причина ошибки CRC может быть и в нём;
  • Если вы получили данную ошибку при попытке считывания данных с СД (ДВД) диска, тогда, для начала, необходимо аккуратно протереть поверхность диска мягкой тканью с целью удаления пыли или грязи на его поверхности, а затем попробовать считать его содержимое с помощью уже упомянутой программы BadCopyPro;Окно программы BadCopyPro
  • Если данная ошибка возникла при установке какой-либо игры, будет проще загрузить её образ ещё раз (или сами файлы программы) из другого источника с помощью проверенных программ уровня Download Master, возможно, это поможет избавиться от ошибки CRC.

Заключение

Если у вас возникла ошибка в данных CRC, то, прежде всего, определитесь с условиями, при которых возникла данная ошибка. Наиболее часто она возникает при попытке закачки и установки образов дисков (или самых программ) из сети. Эффективным средством в этом случае будет использование альтернативных ресурсов для закачки данных файлов, что, в большинстве случаев, помогает эффективно решить указанную проблему. Если же вы имеете дело с дисфункцией в работе жёсткого диска, тогда необходимо использовать программы уровня Power Data Recovery или BadCopyPro, способных помочь в восстановлении доступа к нужным вам файлам.

Flipper Zero — проект карманного мультитула для хакеров в формфакторе тамагочи, который мы разрабатываем. Предыдущие посты [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14]

iButton — это общее название для формата электронного ключа в форм-факторе металлической “таблетки”. Еще его называют Dallas Touch Memory. Часто его ошибочно называют “магнитным” ключом, но это неправильно, ничего магнитного в нем нет. Внутри iButton полноценный микрочип, работающий по цифровому протоколу.

В статье разберем формат ключей iButton от физического устройства до протоколов, а также трюки, которые можно с ним делать при помощи Flipper Zero.

Что такое iButton

Название iButton — это продукт фирмы Dallas Semiconductor, в 1991 году выпустившей на рынок ключ под торговой маркой Touch Memory, потом замененной на iButton.

Схематическое устройство ключа iButton: в центре корпуса контакт плюс, потом пластиковая изоляция, и внешняя часть корпуса это минус

Обычно под словом iButton принято понимать именно физический формфактор ключа и считывателя — круглая таблетка с двумя контактами. Существуют разные вариации оправ самой таблетки. Кроме привычного пластикового держателя с отверстием бывают варианты в виде колец, кулонов и т.д.

Внутреннее устройство iButton: внутри металлической оболочки находится микрочип

Считыватель

При поднесении ключа к считывателю, контакты соприкасаются, и на ключ подается питание. Далее осуществляется передача ID ключа. Иногда ключ не считывается сразу, потому что внешние контуры ключа и считывателя не соприкоснулись. В этом случае нужно упереть ключ в одну из стенок считывателя.

Касание контактов iButton ключа с домофонным считывателем

В формфакторе «таблетки» iButton бывают не только простые ключи с ID, но и климатические датчики, устройства для хранения криптографических ключей со своей батарейкой, часами и прочими наворотами. Эти устройства выглядят так же как ключи, но ими не являются.

Как устроен iButton во Flipper Zero

Разработка контактной площадки iButton во Flipper Zero — это огромная боль. Дело в том, что не существует готовых контактных площадок для одновременного чтения и эмуляции. Если бы мы просто взяли существующие модули, из флиппера бы торчала огромная металлическая кнопка, и рядом такая же огромная площадка для считывания. Это бы многократно увеличило размер устройства.

Нам пришлось изобретать собственную конструкцию контактной площадки с нуля, которую можно было бы реализовать на печатной плате так, чтобы итоговый размер устройства не увеличился. Было решено использовать 3 подпружиненных пого-пина. В итоге было протестировано около 20 разных конструкций.

Прототипы конструкций контактной площадки iButton во Flipper Zero, которые мы печатали на 3D-принтере в процессе разработки

Самая большая сложность конструкции контактной площадки в эмуляции, когда флиппер сам выступает ключом и его нужно прикладывать к домофону. Каждый производитель изобретает собственную конструкцию считывателя, из-за этого постоянно находятся домофоны в которых конструкция не работает: пины просто не дотягиваются либо до центрального контакта Data+, либо до бокового контакта GND.

Левая часть контактной площадки используется для считывания и записи ключей, правая для эмуляции. Центральный пин GND общий для обоих режимов.

Финальная конструкция получилась компромиссной: 100% ключей считывается успешно, примерно 80% считывателей успешно работают с эмуляцией. В оставшихся 20% считывателей приходится корячиться, чтобы контакт достал до нужных стенок. Для этих редких случаев можно использовать внешние контакты GPIO, на которые выведены контакты ibutton: подключиться макетными проводами и ткнуть их в считыватель.

Режим считывателя

В режиме считывателя флиппер ожидает поднесения ключа, при этом готов прожевать сразу три типа ключей: Dallas, Cyfral, Metakom. Флиппер сам определит тип ключа при чтении. Название протокола ключа отобразится на экране над ID номером.

Чтение ключа ibutton формата Dallas. Прочитанный ключ сохраняется на SD-карту.

Для считывания ключа необходимо зайти в меню iButton —> Read и приложить читаемый ключ к контактной площадке. Считанный ключ можно сразу эмулировать, записать на болванку, либо сохранить на SD-карту. Хоть контактная площадка находится на задней стороне от экрана, можно быстро наловчиться читать ключи не разворачивая флиппер, просто на ощупь.

В режиме чтения iButton используются два правых контакта Flipper Zero

Режим эмуляции iButton

В режиме эмуляции ключа, Флиппер сам выступает ключом и программно эмулирует iButton из памяти. ID ключа для эмуляции во Flipper Zero можно добавить двумя способами:

  • Считать существующий ключ — сохранить ID ключа на SD-карту и выбирать нужный ключ в любой момент
  • Вручную ввести ID ключа — даже если в руках нет нужного ключа, но его ID известен, его можно ввести вручную. Так, например, можно сфотографировать ID ключа и отправить его другу с флиппером, без необходимости передавать физический ключ

Для запуска эмуляции ключа нужно зайти в меню iButton —> Saved, выбрать нужный ключ и запустить Emulate. На экране появится надпись с ID ключа, который эмулируется. После этого можно подносить Флиппер к считывателю. Важно помнить, что в этом режиме используются другие пины на контактной площадке Флиппера.

В режиме эмуляции Флиппер передает конкретный ID и эмулирует только один, заранее заданный, протокол ключа, так что его можно подносить только к конкретному домофону, который знает этот ключ. Перебирать сразу несколько ключей в этом режиме нельзя, так как нельзя однозначно убедиться, прочитал ли домофон наш ключ, и нельзя знать задержку в домофоне, между ошибкой чтения. Поэтому для дома, офиса, дачи, подвала нужно будет каждый раз выбирать конкретный ключ из меню.

В режиме эмуляции ключа iButton Флиппер нужно подносить к домофону как ключ. При этом нужно убедиться, что оба контакта коснулись контактной площадки считывателя.

iButton через внешний GPIO

Контакт iButton на нижней крышке также выведен на гребенку GPIO. Это можно использовать для подключения к нестандартным считывателям, ключам, любым устройствам работающим по протоколу 1-Wire вроде датчиков. Мы используем эти контакты для анализа сигналов через осциллограф. При этом, этот контакт не совсем честный GPIO, потому что имеет подтяжку к 5V.

Контакты iButton соединены с гребенкой GPIO. Порт iButton работает в режиме open-drain и подтянут к напряжению 5 В через резистор 1 кОм.

Протокол 1-Wire


В протоколе 1-Wire всегда есть главное устройство Master и ведомые Slave

Ключи Dallas обмениваются данными по протоколу 1-wire. Всего один контакт на передачу данных(!!) в обе стороны, от мастера к слейву и наоборот. Протокол 1-wire работает по модели Master-Slave. В этой топологии устройство Master всегда инициирует общение, а Slave следует его указаниям.

При контакте ключа (Slave) с домофоном (Master) чип внутри ключа включается, получив питание от домофона и происходит инициализация ключа, после чего домофон запрашивает ID ключа. Далее мы разберем подробно этот процесс.

Флиппер умеет работать в режимах Master и Slave. В режиме чтения ключа Флиппер выступает в роли считывателя, то есть работает как Master. А в режиме эмуляции ключа, флиппер прикидывается ключом, то есть работает в режиме Slave.

При чтении ключа Флиппер выступает мастером, а при эмуляции с домофоном работает как slave

Формат данных в ключе Dallas

Домофон считывает из iButton 8 байт (64 бита) информации, чтобы решить, открывать дверь или нет.

Структура данных этих 8 байт следующая:

  • 1 байт — код семейства (Family Code), для iButton он всегда равен 0x01
  • 6 байт — серийный номер ключа
  • 1 байт — контрольная сумма СRC

Код семейства у ключей Dallas всегда 0x01. Если у вас этот код отличается, то скорее всего, это не ключ от домофона.

Серийный номер в некоторых случаях выгравирован на ключе, но может:

  • Не содержать все 8 байт
  • Иметь последовательность символов задом-наперед
  • Иметь начало в непонятном месте


На оригинальном ключе iButton выгравирован ID, но его формат записи немного отличается от представления во Флиппере: сперва идет family code, потом инвертированный серийный номер, потом контрольная сумма

На картинке выше показан неочевидный пример гравировки ID на оригинальном ключе iButton. В нем читать байты нужно справа налево, контрольная сумма написана слева, а family code справа.

Ошибки чтения

При некорректном чтении ключа Flipper Zero сообщает об ошибках. Возможные ошибки:

  • Некорректная контрольная сумма — ошибка в CRC
  • Неправильный код семейства — когда family code отличается от 0x01, Флиппер ругается что это не ключ iButton.


Возможные ошибки при чтении ключей Dallas: неправильный байт CRC — CRC ERROR; байт Family-code не равен 0x01 — THIS IS NOT A KEY.

Ввод ID вручную

Если ID ключа известен, его можно ввести во Флиппер вручную. Это удобно когда самого физического ключа нет, например можно передать нужные байты просто в чате или скинув другу фото. На видео показан пример создания нового ключа Cyfral из 2 байт. Новый сгенерированный ключ сохраняется на SD-карту.

Создание нового ключа с помощью ручного ввода айдишника

При создании ключа нужно выбрать его тип: Dallas, Cyfral или Metakom. От этого будет зависеть длина ID и протокол, используемый при эмуляции. После ввода ID Флиппер предложит ввести имя нового ключа, либо использовать сгенерированное.

Запись ключей 1-Wire Dallas

Существуют ключи Dallas, которые можно записать и которые нельзя. Популярные перезаписываемые iButton болванки: RW1990, TM2004, TM01C. Процесс записи имеет свои нюансы, разберем их.

Запись болванки может требовать повышенного напряжения — например, для записи менее популярной RW2000 требуется напряжение 8 В (правда это Cyfral, но смысл понятен).

Некоторые болванки требуют финализиации — после финализации ключ больше не может быть перезаписан. Этим пользуются некоторые домофоны, пробуя перезаписать ключ перед считыванием, чтобы избежать поддельных ключей. Обычно для финализации используют импульс напряжения и специальную команду, которая может отличаться для разных ключей.

Существуют болванки, которые могут подходить ко всем типам ключей: Dallas/Cyfral/Metakom. Флиппер умеет записывать основные популярные болванки.

Запись ключа Dallas на болванку RW1990 с помощью Flipper Zero

Чтобы записать ключ на болванку, нужно выбрать желаемый ключ из меню iButton —> Saved —> Имя_ключа и выбрать пункт Write. Далее прислонить перезаписываемый ключ к контактной площадке. После записи на болванку, флиппер проверяет корректность записи и показывает сообщение об успешной записи ID.

Русские народные ключи Cyfral, Metakom

Протоколы Metakom и Cyfral — отечественные разработки, распространенные только в СНГ. В отличие от ключей Dallas, они работают не по напряжению, а по току. Это менее распространенные и более дорогие ключи. Они очень чувствительны к параметрам ключа (частота, сила тока, амплитуда сигнала и пр.), из-за чего изготовление дубликатов бывает капризным процессом.

Cyfral и Metakom не принимают никакие команды. При подаче питания на ключ, он сразу начинает бесконечно посылать ID за счет изменения сопротивления. Таким образом, логические уровни определяются сопротивлением ключа. По документации ключей условно принимается, что информационные слова кода выдаются начиная с младшего бита.

Cyfral

Логические уровни в Cyfral, так же как и в Dallas имеют временные ограничения: если сопротивление остается низким около 50 мкс — это логический “0”, если 100 мкс — это логическая “1”.

Формат передаваемых данных специфичен.

Cyfral циклично отправляет 9 нибблов (1 ниббл = 4 бита): 1 стартовый и 8 ID. Ниббл может иметь всего 4 значения для ID и одно значение для стартового слова. Все остальные записи — некошерные.


В итоге ID записывается в 2 байта (Всего 8 нибблов ID. 4 ниббла = 16 состояний = 1 байт информации).

Бывает, что домофоны Cyfral занимаются проверкой ключа, подавая некорректные данные.
У Cyfral нет никаких контрольных сумм. Хочешь убедиться в целостности ID — прочитай ключ еще раз, а хочешь пять. Так как сигнал аналоговый, то чтение сигнала требует наличия АЦП или компаратора. Проще всего использовать компаратор, выход которого является низким или высоким уровнем напряжения.

С эмулированием ключа на практике проблем не возникает. Замыкания на землю (отсутствия сопротивления) вполне достаточно, чтобы ключ выдал логический «0».

Metakom

Ключ Metakom посылает 4 байта, где каждый байт заканчивается битом четности.
Metakom имеет 3 примитива передачи:

  • Синхронизирующий бит
  • Бит 0
  • Бит 1

Структура посылки выглядит так:

  • Синхронизирующий бит
  • 4 байта информации, где каждый байт содержит:
    • 1 бит четности
    • 7 бит данных

На практике, эти домофоны в 99% случаев открываются с помощью универсального ключа, который легко гуглится.

Смотрим на 1-Wire через осциллограф

Захват сигнала осциллографом в момент чтения ключа Dallas

Линия передачи устроена по принципу «монтажного И» и может иметь одно из двух состояний: логический “0” и логическая “1”.
Устройства (ключи и домофон) имеют внутренние транзисторы, которые в нужное время подтягивают линию к нулю. Вся линия передачи переходит в состояние логического “0”, если любое из устройств перевело ее в нуль, т.е. если домофон перетянул линию в нуль — ключ об этом узнает, и наоборот.

С помощью перетяжек напряжения и удержания уровней 1-wire имеет 4 примитива для работы на шине:

  • импульс сброса (RESET)
  • импульс присутствия (PRESENCE)
  • отправка бита 0
  • отправка бита 1 и она же по совместительству чтение бита


Чтение ключа Dallas на Flipper. Состоит из команд Search ROM и Read ROM. Каждая команда имеет Reset sequence.

Чтение ключа на Flipper Zero устроено так: командой поиска проверяется наличие ключа, а затем происходит чтение ID. Это сделано, чтобы избежать случайных совпадений с другими ключами Cyfral/Metakom, тайминги которых могут случайно совпасть с требуемыми.

На осциллограмме виден длинный сигнал из 2 команд, где каждая состоит из:

  • Инициализации команды:
    • Импульс сброса
    • Импульс присутствия

  • Передачи команды для Slave
  • Ответа Slave на принятую команду

Разберем более детально каждый из пунктов.

Reset sequence — инициализация команды. Состоит из Импульса Сброса и Импульса Присутствия. Импульс Сброса — уровень опускает Master. Импульс Присутствия — уровень опускает Slave.

Инициализация (reset sequence) состоит из двух импульсов:

  1. Импульс Сброса (Reset pulse)
  2. Импульса Присутствия (Presence pulse)

Для Импульса Сброса — линию к земле подтягивает Master (домофон).
Для Импульса Присутствия — линию к земле подтягивает Slave (ключ).

Некоторые домофоны не подают импульс сброса, так как отсутствие контакта между ключом и домофоном и есть сигнал сброса.

Команда чтения ID с ответом. Тайм-слот бита информации состоит из 2 участков: синхронизации и значения бита. В КОМАНДАХ за уровни напряжения на обоих участках отвечает Master. В ОТВЕТЕ на команду чтения за синхронизацию отвечает Master, за значение бита отвечает Slave.

После инициализации команды происходит обмен информацией:

  • отправка команды для Slave
  • ответ Slave на команду

Обмен информацией ведется тайм-слотами: один тайм-слот для обмена одним битом информации. Данные передаются бит за битом, начиная с младшего бита младшего байта.
Синхронизация Master и Slave происходит в одно действие: Master (домофон) подтягивает линию к низкому уровню. Далее через конкретное время, Master или Slave измеряет напряжение на линии и записывает бит информации (Master — при чтении ключа, Slave — при записи ключа). Правила выдержки временных интервалов для команд чтения и записи одинаковы. Каждый тайм-слот синхронизируется независимо, поэтому передача информации может приостанавливаться, не вызывая ошибок.

Важно, что все сигналы имеют конкретные временные ограничения, которые обязательно должны быть соблюдены! Бывает, что производители домофонов упарываются, и соблюдают какие-то свои временные задержки.
Еще у iButton есть режим Overdrive, в котором временные задержки сокращены, из-за чего передача информации происходит быстрее. Есть вероятность, что в дикой природе существуют домофоны, работающие в этом режиме… Но на практике они не встречались.

Стандартные команды 1-wire ключей Dallas

Для iButton характерны команды размером 1 байт (8 бит).
Зачастую домофон использует команды поиска и чтения ID (Search ROM и Read ROM).

Некоторые производители домофонов — люди оригинальные, поэтому придумывают разные последовательности команд, чтобы проверить, а действительно ли к домофону прикладывают ключ, а не эмулятор. Поэтому ознакомимся с существующими командами.

Стандартные команды iButton для Regular режима следующие:

Бонус про домофонные ключи

Бонус про домофонные ключи

Почему старые домофоны это плохо?

Некоторые старинные домофоны с ключами Dallas имеют в памяти базу ID ключей, заполненную не полностью. Незаполненные поля имеют некоторое значение, иногда соответствующее всем нулям (0x00) или всем единицам (0xFF). Для проверки домофона на дремучесть создаются два ключа: один со всеми нулями, другой со всеми единицами.
Эти ключи содержат неправильный код семейства (не 0x01) и неправильный CRC (вообще не контрольная сумма)!!! — Да, бывают и такие исключения.

Как почтальоны разносят по подъездам рекламу?

Никак, почтальоны разносят письма :) Но очевидно, что в почтовом отделении нет огромной связки с ключами для каждого подъезда. Часто используют универсальные ключи, они же “вездеходы”, подходящие на группу домофонов, например для всего района. Этот ключ может быть один на город, один на группу домов, может быть дефолтным для какой-то модели, а может и вовсе отсутствовать.

Что такое мастер ключ?

Обычно это ключ, который сам не открывает дверь, а позволяет добавлять в память новые ключи. Он записан в отдельную область памяти домофона. Такой ключ может одновременно для одних домофонов быть мастер-ключом, а для других обычным. Это всего лишь циферки, которые записаны в одну или другую область памяти домофона.

Играясь заблокировали домофон?

Такой вариант возможен, когда в домофоне есть “блокирующий ключ”. Он блокирует домофон для всех остальных ключей, пока не снимут блокировку с помощью мастер-ключа.

Какие болванки нам известны

В ходе работы с iButton мы зафиксировали некоторые известные нам “болванки” ключей. Вот они, на здоровье!

Наши соцсети

Все обновления по проекту первым делом публикуются в Telegeram-канале @zhovner_hub
_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________


Предзаказ Flipper Zero

Сейчас запущено производство первой партии Flipper Zero для бекеров заказавших устройство на Kickstarter. Вторая партия будет доступна для покупки осенью 2021. Вы можете зарезервировать устройство из второй партии заранее здесь shop.flipperzero.one Это важно для нас, чтобы более точно прогнозировать объемы производства.

Понравилась статья? Поделить с друзьями:
  • Daihatsu yrv коды ошибок
  • Dal91 carrier ошибка
  • Daf ошибка air suspension
  • Dal87 carrier ошибка что означает
  • Dal86 carrier ошибка