Страница 1 из 7
Ковыряем RFID Mifare и MFRC522
Добавлено: Вс июн 04, 2017 01:35:21
isx
Приветствую всех заинтересовавшихся
Началось все с покупки комплекта считывателя 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
isx
Чем дальше в лес, тем страшнее черти

. Кто-нидь в курсе, зачем у MFRC522 встроен таймер? В даташите только описание и ничего конкретного...
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Ср июн 07, 2017 01:00:08
isx
Ну раз никто не отвечает, то отвечу сам

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

.
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Ср июн 07, 2017 08:37:13
Zhuk72
[uquote="isx",url="/forum/viewtopic.php?p=3121190#p3121190"]Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave

.[/uquote]
А прерывание никак не включить?
Вчера только читал про SPI в Cortex M3 (я относительно недавно начал ковырять АРМы), т.к. тоже имею сабжевую платку и хочу ее попробовать. Так вот, как подсказывает мне мой склероз, в МК есть прерывания на пустой ТХ буфер, НЕ пустой RX буфер и всякие ошибки (CRC, overrun и чего-то там еще). Так что можно на дисплее (если он есть) показывать какой-нибудь мультик пока не получен ответ от считывателя (слейва). Также у него (522-го) еще отдельный выход IRQ есть, но пока не дочитал до него и не знаю по каким событиям он может дергаться и дергать хост.
Писать пока не начинал, только изучаю 522-й теоретически.
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Ср июн 07, 2017 17:19:24
isx
Для общения с Rc522 иногда нужно послать 8 байт и сделать строб, а иногда послать два раза по 8 байт и только потом делать строб. Вот на фоне всей этой фигни и рождается жуткий гемор в прерываниях SPI. Там ведь всего 3 флага прерываний.
У 522 есть целый регистр для активатиции выхода irq при возникновении того или иного прерывания. Фича полезная, если связать с внешним прерыванием МК, то можно разгрузить процессор. Сам правда пока им ре пользовался.
Сейчас застрял на антиколлизии. При поднесении двух меток в буфере оказывается всякая хрень, но флаг обнаружения коллизии не выставляется.
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Пт июн 09, 2017 18:44:30
isx
Оказалось, что в карточках одного типа бит коллизии установлен в одном и том же месте, поэтому коллизии не происходит.
Добился выбора карты, аутентификации и чтения/записи из EEPROM, однако это происходит только один раз. Повторный цикл антиколлизии возможен только после перезагрузки устройства. Не могу никак победить проблему....
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Ср июн 28, 2017 18:30:04
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. Это надо такие уровни выставить на них?
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Чт июн 29, 2017 15:21:05
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 попытаться найти ДШ на чип, то оказываешься в дебрях невиданных. Я так и не вышел на страницу с чипом, на которой была бы ссылка на документацию.
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вс июл 09, 2017 09:03:06
-=Vovka=-
А я ковыряю подключение через UART. В МК ног не хватает для SPI (заняты под другие цели),
переделать модуль под I2C не решился, т.к. нужно сдувать микросхему и под ней перерезать дорожку, а вот
переделать под UART легко.
Подключил к USB-UART переходнику через
согласование.
Вот мучаюсь хоть что-то от модуля получить...
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вс июл 09, 2017 09:46:51
Zhuk72
А еще меня смущает то, что на моем чипе не видно маркировки
Я получал плату в период сложных личных обстоятельств и не обратил на это внимание. Теперь вот думаю, если чип мне не будет отвечать это из-за моей ошибки в программе, или потому что я общаюсь с простым куском керамики?
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вс июл 09, 2017 12:25:24
-=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:
Начало есть!!!

Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Пн июл 10, 2017 09:39:54
-=Vovka=-
Нашел ошибку: в программе не установил галку. Теперь походу правильно отвечает:

Осталось понять, что означают эти ответы...
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Пн июл 10, 2017 10:59:36
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". Значит следующим за ним байт - это конфигурация этого регистра.
Таким же методом пройдитесь по остальным командам и таблицам с адресами в ДШ.
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Пн июл 10, 2017 18:18:03
-=Vovka=-
Спасибо, это я уже понял.
Теперь с ответами разобраться бы. Я так понимаю, что на команду 54 8D (см. скриншот выше) чип отвечает 54. И похоже он всегда возвращает код команды?
Хотя один раз я то-то ему послал, так всегда стал возвращать посылаемое значение. После отключения питания ответ вернулся кодом команды
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Пн июл 10, 2017 19:07:53
Zhuk72
Ну вот смотрите. Судя по таблицам, если адрес записывающий (следующий за ним байт конфигурирующий), то адрес в ответ повторяется.
В случае чтения идет ответ содержимого регистра по адресу.
Попробуйте отправить 0x37 и посмотрите на ответ. Самому интересно
Добавлено after 2 minutes 6 seconds:
Пардон, не 0x37, а 0xB7. Забыл про единицу в старшем бите.
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вт июл 11, 2017 12:33:26
-=Vovka=-
Ага, мои догадки оказались верными!
И не 0xB7:
0x37<<1 = 0x6E
0x6E | 0x80 = 0xEE
Чтоб не мучать МК перепрошивками делаю
программу для Windows.
Добавлено after 2 hours 38 minutes 40 seconds:
Еще одна непонятка: контрольная сумма нужна в командах или это только при записи в карту блока данных?
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вт июл 11, 2017 13:37:14
Zhuk72
А сдвиг зачем?
Сдвиг используется при работе через SPI (по I2C особо не вникал).
В ответ на 37h (в правильной посылке) может быть только 2 ответа: 91h или 92h, т.е. 1 или 2 версия чипа. Ваш ноль - это скорее всего свидетельство ошибочной команды
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вт июл 11, 2017 19:52:16
-=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;
}
Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вт июл 11, 2017 19:57:45
Zhuk72
Так я же говорю, что сдвиг для SPI нужен, но не для UART. Там в скетче как раз SPI и упоминается.
Не сдвигайте. Команды записи отправляйте как есть, а команды чтения с выставлением MSB.
Это для SPI. У него младший бит в нуле всегда, старший такой же, как и для UART.
Это для UART. На него и ориентируйтесь.

Re: Ковыряем RFID Mifare и MFRC522
Добавлено: Вт июл 11, 2017 21:04:14
-=Vovka=-
Отправляю B7 00 - что-то ерунду возвращает:
