Ковыряем RFID Mifare и MFRC522

Обсуждаем цифровые устройства...
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Ковыряем RFID Mifare и MFRC522

Сообщение isx »

Приветствую всех заинтересовавшихся :beer:
Началось все с покупки комплекта считывателя RFID RC522, карты и брелка на Али. Валялся он у меня пару недель, а потом появилось время поработать с ним... и ту понеслось :) .
Для начала освоил SPI на STM32. Потом начал изучать документацию на чип, но к моему сожалению, в ней описано только как подключается чип, протоколы обмена с МК (SPI, USART, I2C), краем упомянут протокол общения с картой и дано описание регистров. Но самое важное для меня - порядок инициализации и чтения/записи с/на карту я не нашел.
После этого были долгие поиски инфы в сети, но дальше библиотек ардуины уйти не удавалось (а понять ардуины код для меня как полет в космос). Через два дня я наткнулся на библиотеку под STM (к сожалению уже не помню где ее взял) для этого считывателя, и все пошло в гору, как я подумал. Но не тут то было.
Из библиотеки я честно спёр инит. На этом я и остановился. Вот инит:

Код: Выделить всё

void MFRC522_init (void)
{
   MFRC522_write_register(MFRC522_REG_COMMAND, 0x0F); // RESET
   
   MFRC522_write_register(MFRC522_REG_T_MODE, 0x8D);
   MFRC522_write_register(MFRC522_REG_T_PRESCALER, 0x3E);
   MFRC522_write_register(MFRC522_REG_T_RELOAD_L, 30);           
   MFRC522_write_register(MFRC522_REG_T_RELOAD_H, 0);
   MFRC522_write_register(MFRC522_REG_RF_CFG, 0x70);
   MFRC522_write_register(MFRC522_REG_TX_AUTO, 0x40);
   MFRC522_write_register(MFRC522_REG_MODE, 0x3D);

   if (!(MFRC522_read_register(MFRC522_REG_TX_CONTROL) & 0x03)) {MFRC522_set_bits_of_register(MFRC522_REG_TX_CONTROL, 0x03);} // Antenna ON
}

Хотя я и могу понять, какие биты мы устанавливаем при ините и в какой регистр, но почему именно так - для меня загадка. Ну да и черт с этим - инициализация простая и работает.
Далее я спер еще часть кода с библиотеки и переделал ее под себя. В итоге получилось такое чудо, которое выдает мне один непонятный байт в str[0] и четыре байта, как я понял, серийного номера карты в str[1] - str[4]. Больше и ничего не должно быть (как я полагал на тот момент, но опять ошибся) и я полез искать регистры, с которых считываются 4 байта серийного номера, но конечно же, их нет.
После изучения принципов работы Mifare и этой библиотеки появились следующие вопросы:
1) Перед тем как запросить данные с карты в библиотеке в FIFO RC522 (по адресу 0x09) записываются числа 0x93 и 0x20. После этого мы получаем серийный номер карты. Как эти числа заставляют карту прислать данные с нулевого сектора нулевого блока? И где вообще посмотреть данные по посылаемым карте командам?
2) Как нам отличить один тип карты от другого? К примеру: в моей карте UID состоит из 4-х байт, поэтому я и прочту только 4 байта. А если я поднесу карту с UID из 7-ми байт, то прочту только 4 байта и получу хрень на выходе. Как этого избежать?
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Ковыряем RFID Mifare и MFRC522

Сообщение isx »

Чем дальше в лес, тем страшнее черти :) . Кто-нидь в курсе, зачем у MFRC522 встроен таймер? В даташите только описание и ничего конкретного...
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Ковыряем RFID Mifare и MFRC522

Сообщение isx »

Ну раз никто не отвечает, то отвечу сам :) . Для того, в частности, чтоб контролировать зависание при выполнении некоторых действий. В моем случае контролировалось поступление данных в FIFO от карты. Если ответ задерживался, то возникало переполнение таймера и выставлялся флаг возникновения прерывания.
Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave :) .
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

[uquote="isx",url="/forum/viewtopic.php?p=3121190#p3121190"]Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave :) .[/uquote]
А прерывание никак не включить?
:)

Вчера только читал про SPI в Cortex M3 (я относительно недавно начал ковырять АРМы), т.к. тоже имею сабжевую платку и хочу ее попробовать. Так вот, как подсказывает мне мой склероз, в МК есть прерывания на пустой ТХ буфер, НЕ пустой RX буфер и всякие ошибки (CRC, overrun и чего-то там еще). Так что можно на дисплее (если он есть) показывать какой-нибудь мультик пока не получен ответ от считывателя (слейва). Также у него (522-го) еще отдельный выход IRQ есть, но пока не дочитал до него и не знаю по каким событиям он может дергаться и дергать хост.

Писать пока не начинал, только изучаю 522-й теоретически.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Ковыряем RFID Mifare и MFRC522

Сообщение isx »

Для общения с Rc522 иногда нужно послать 8 байт и сделать строб, а иногда послать два раза по 8 байт и только потом делать строб. Вот на фоне всей этой фигни и рождается жуткий гемор в прерываниях SPI. Там ведь всего 3 флага прерываний.
У 522 есть целый регистр для активатиции выхода irq при возникновении того или иного прерывания. Фича полезная, если связать с внешним прерыванием МК, то можно разгрузить процессор. Сам правда пока им ре пользовался.
Сейчас застрял на антиколлизии. При поднесении двух меток в буфере оказывается всякая хрень, но флаг обнаружения коллизии не выставляется.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Ковыряем RFID Mifare и MFRC522

Сообщение isx »

Оказалось, что в карточках одного типа бит коллизии установлен в одном и том же месте, поэтому коллизии не происходит.
Добился выбора карты, аутентификации и чтения/записи из EEPROM, однако это происходит только один раз. Повторный цикл антиколлизии возможен только после перезагрузки устройства. Не могу никак победить проблему....
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

[uquote="isx",url="/forum/viewtopic.php?p=3119369#p3119369"]Для начала освоил SPI на STM32. Потом начал изучать документацию на чип, но к моему сожалению, в ней описано только как подключается чип, протоколы обмена с МК (SPI, USART, I2C), краем упомянут протокол общения с картой и дано описание регистров. Но самое важное для меня - порядок инициализации и чтения/записи с/на карту я не нашел.[/uquote]
Вот и я так же. С SPI на STM32F103 вчера разобрался наконец-то (ну они и намудрили с ногой NSS!), подключил модуль MFRC522 к МК, сконфигурировал SPI2 и загрустил. Такого бестолкового ДШ я еще не видел, у китайцев и то лучше!
Мне не хочется пионерить чей-то инит, хочу чтоб производитель (NXP) сам мне о нем рассказал. Сейчас пошарю у них на сайте на предмет AN.
В сети, как я навскидку заметил, все юзают готовые библиотеки, которые я не люблю, но никто не описывает, как с этим чипом общаться.

Кстати, они там пишут про автоопределение интерфейса (SPI / I2C / UART).
В таблице в графе по SPI указано I2C (pin 1) = 0, EA (pin 32) = 1. Это надо такие уровни выставить на них?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

[uquote="Zhuk72",url="/forum/viewtopic.php?p=3134795#p3134795"]Кстати, они там пишут про автоопределение интерфейса (SPI / I2C / UART).
В таблице в графе по SPI указано I2C (pin 1) = 0, EA (pin 32) = 1. Это надо такие уровни выставить на них?[/uquote]
Судя по схеме и визуальному осмотру платы, на плате уже все предусмотрели, т.е. распиновка сделана под SPI.

А вот с документацией у них действительно очень плохо. Если не гуглить сабж, а просто через сайт NXP попытаться найти ДШ на чип, то оказываешься в дебрях невиданных. Я так и не вышел на страницу с чипом, на которой была бы ссылка на документацию.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

А я ковыряю подключение через UART. В МК ног не хватает для SPI (заняты под другие цели), переделать модуль под I2C не решился, т.к. нужно сдувать микросхему и под ней перерезать дорожку, а вот переделать под UART легко.
Подключил к USB-UART переходнику через согласование.
Вот мучаюсь хоть что-то от модуля получить...
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

А еще меня смущает то, что на моем чипе не видно маркировки :(
Я получал плату в период сложных личных обстоятельств и не обратил на это внимание. Теперь вот думаю, если чип мне не будет отвечать это из-за моей ошибки в программе, или потому что я общаюсь с простым куском керамики?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

Подключился на скорости 9600
Посылаю в модуль код.
Для понимания буду писать так: первая строка это байты, которые нужно послать, а вторая строка это то, что реально посылаю (после сдвига адреса).

Коды беру из первого сообщения темы.
Сброс:
01 0F
02 0F
Ответа нет

Инициализация:
2A 8D 2B 3E 2D 30 2C 00 26 70 15 40 11 3D
54 8D 56 3E 5A 30 58 00 4C 70 2A 40 22 3D
Ответа нет

Добавлено after 1 hour 32 minutes 54 seconds:
Начало есть!!!
Изображение
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

Нашел ошибку: в программе не установил галку. Теперь походу правильно отвечает:
Изображение
Осталось понять, что означают эти ответы...
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

Почитайте страницы 13-16, там про формат команды. А потом загляните в таблицу адресов на страницах 36-37.
У вас второй запрос начинается с 0х54, тогда как адресация там 6-битная, до 0х3F. Бит 7 говорит о чтении по адресу (=1) или записи по нему (=0). Бит 6 - reserved. Для адреса остаются только младшие 6 битов.
Следовательно 0х54 должен восприниматься чипом как 0х14, причем как запись в него. Это TxControlReg: "controls the logical behavior of the antenna driver pins TX1 and TX2". Значит следующим за ним байт - это конфигурация этого регистра.
Таким же методом пройдитесь по остальным командам и таблицам с адресами в ДШ.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

Спасибо, это я уже понял.
Теперь с ответами разобраться бы. Я так понимаю, что на команду 54 8D (см. скриншот выше) чип отвечает 54. И похоже он всегда возвращает код команды?
Хотя один раз я то-то ему послал, так всегда стал возвращать посылаемое значение. После отключения питания ответ вернулся кодом команды
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

Изображение
Изображение

Ну вот смотрите. Судя по таблицам, если адрес записывающий (следующий за ним байт конфигурирующий), то адрес в ответ повторяется.
В случае чтения идет ответ содержимого регистра по адресу.

Попробуйте отправить 0x37 и посмотрите на ответ. Самому интересно :)

Добавлено after 2 minutes 6 seconds:
Пардон, не 0x37, а 0xB7. Забыл про единицу в старшем бите.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

Ага, мои догадки оказались верными!

И не 0xB7:
0x37<<1 = 0x6E
0x6E | 0x80 = 0xEE
Изображение

Чтоб не мучать МК перепрошивками делаю программу для Windows.

Добавлено after 2 hours 38 minutes 40 seconds:
Еще одна непонятка: контрольная сумма нужна в командах или это только при записи в карту блока данных?
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

А сдвиг зачем?
:shock:
Сдвиг используется при работе через SPI (по I2C особо не вникал).

В ответ на 37h (в правильной посылке) может быть только 2 ответа: 91h или 92h, т.е. 1 или 2 версия чипа. Ваш ноль - это скорее всего свидетельство ошибочной команды
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

[uquote="Zhuk72",url="/forum/viewtopic.php?p=3143007#p3143007"]А сдвиг зачем?[/uquote]
Вот из скетча:

Код: Выделить всё

void MFRC522_WriteRegister(uint8_t addr, uint8_t val) {
   addr = (addr << 1) & 0x7E;                                                      // Address format: 0XXXXXX0
    SPI1_WriteReg(addr, val);
}

uint8_t MFRC522_ReadRegister(uint8_t addr) {
   uint8_t val;

   addr = ((addr << 1) & 0x7E) | 0x80;
   val = SPI1_ReadReg(addr);
   return val;   
}
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Ковыряем RFID Mifare и MFRC522

Сообщение Zhuk72 »

Так я же говорю, что сдвиг для SPI нужен, но не для UART. Там в скетче как раз SPI и упоминается.
Не сдвигайте. Команды записи отправляйте как есть, а команды чтения с выставлением MSB.

Это для SPI. У него младший бит в нуле всегда, старший такой же, как и для UART.
Изображение

Это для UART. На него и ориентируйтесь.
Изображение
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
-=Vovka=-
Опытный кот
Сообщения: 844
Зарегистрирован: Пн апр 11, 2011 10:08:52

Re: Ковыряем RFID Mifare и MFRC522

Сообщение -=Vovka=- »

Отправляю B7 00 - что-то ерунду возвращает:
Изображение
Ответить

Вернуться в «Цифровая техника»