Обсуждаем цифровые устройства...
Ответить

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

Вс июн 04, 2017 01:35:21

Приветствую всех заинтересовавшихся :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 байта и получу хрень на выходе. Как этого избежать?

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

Вт июн 06, 2017 00:38:49

Чем дальше в лес, тем страшнее черти :) . Кто-нидь в курсе, зачем у MFRC522 встроен таймер? В даташите только описание и ничего конкретного...

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

Ср июн 07, 2017 01:00:08

Ну раз никто не отвечает, то отвечу сам :) . Для того, в частности, чтоб контролировать зависание при выполнении некоторых действий. В моем случае контролировалось поступление данных в FIFO от карты. Если ответ задерживался, то возникало переполнение таймера и выставлялся флаг возникновения прерывания.
Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave :) .

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

Ср июн 07, 2017 08:37:13

Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave :) .

А прерывание никак не включить?
:)

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

Писать пока не начинал, только изучаю 522-й теоретически.

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

Ср июн 07, 2017 17:19:24

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

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

Пт июн 09, 2017 18:44:30

Оказалось, что в карточках одного типа бит коллизии установлен в одном и том же месте, поэтому коллизии не происходит.
Добился выбора карты, аутентификации и чтения/записи из EEPROM, однако это происходит только один раз. Повторный цикл антиколлизии возможен только после перезагрузки устройства. Не могу никак победить проблему....

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

Ср июн 28, 2017 18:30:04

Для начала освоил SPI на STM32. Потом начал изучать документацию на чип, но к моему сожалению, в ней описано только как подключается чип, протоколы обмена с МК (SPI, USART, I2C), краем упомянут протокол общения с картой и дано описание регистров. Но самое важное для меня - порядок инициализации и чтения/записи с/на карту я не нашел.

Вот и я так же. С SPI на STM32F103 вчера разобрался наконец-то (ну они и намудрили с ногой NSS!), подключил модуль MFRC522 к МК, сконфигурировал SPI2 и загрустил. Такого бестолкового ДШ я еще не видел, у китайцев и то лучше!
Мне не хочется пионерить чей-то инит, хочу чтоб производитель (NXP) сам мне о нем рассказал. Сейчас пошарю у них на сайте на предмет AN.
В сети, как я навскидку заметил, все юзают готовые библиотеки, которые я не люблю, но никто не описывает, как с этим чипом общаться.

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

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

Чт июн 29, 2017 15:21:05

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

Судя по схеме и визуальному осмотру платы, на плате уже все предусмотрели, т.е. распиновка сделана под SPI.

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

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

Вс июл 09, 2017 09:03:06

А я ковыряю подключение через UART. В МК ног не хватает для SPI (заняты под другие цели), переделать модуль под I2C не решился, т.к. нужно сдувать микросхему и под ней перерезать дорожку, а вот переделать под UART легко.
Подключил к USB-UART переходнику через согласование.
Вот мучаюсь хоть что-то от модуля получить...

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

Вс июл 09, 2017 09:46:51

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

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

Вс июл 09, 2017 12:25:24

Подключился на скорости 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:
Начало есть!!!
Изображение

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

Пн июл 10, 2017 09:39:54

Нашел ошибку: в программе не установил галку. Теперь походу правильно отвечает:
Изображение
Осталось понять, что означают эти ответы...

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

Пн июл 10, 2017 10:59:36

Почитайте страницы 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". Значит следующим за ним байт - это конфигурация этого регистра.
Таким же методом пройдитесь по остальным командам и таблицам с адресами в ДШ.

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

Пн июл 10, 2017 18:18:03

Спасибо, это я уже понял.
Теперь с ответами разобраться бы. Я так понимаю, что на команду 54 8D (см. скриншот выше) чип отвечает 54. И похоже он всегда возвращает код команды?
Хотя один раз я то-то ему послал, так всегда стал возвращать посылаемое значение. После отключения питания ответ вернулся кодом команды

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

Пн июл 10, 2017 19:07:53

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

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

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

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

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

Вт июл 11, 2017 12:33:26

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

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

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

Добавлено after 2 hours 38 minutes 40 seconds:
Еще одна непонятка: контрольная сумма нужна в командах или это только при записи в карту блока данных?

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

Вт июл 11, 2017 13:37:14

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

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

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

Вт июл 11, 2017 19:52:16

А сдвиг зачем?

Вот из скетча:
Код:
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;   
}

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

Вт июл 11, 2017 19:57:45

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

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

Это для UART. На него и ориентируйтесь.
Изображение

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

Вт июл 11, 2017 21:04:14

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