Форум РадиоКот https://radiokot.ru/forum/ |
|
Ковыряем RFID Mifare и MFRC522 https://radiokot.ru/forum/viewtopic.php?f=2&t=145789 |
Страница 1 из 7 |
Автор: | isx [ Вс июн 04, 2017 01:35:21 ] |
Заголовок сообщения: | Ковыряем RFID Mifare и MFRC522 |
Приветствую всех заинтересовавшихся Началось все с покупки комплекта считывателя 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 [ Вт июн 06, 2017 00:38:49 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Чем дальше в лес, тем страшнее черти . Кто-нидь в курсе, зачем у MFRC522 встроен таймер? В даташите только описание и ничего конкретного... |
Автор: | isx [ Ср июн 07, 2017 01:00:08 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Ну раз никто не отвечает, то отвечу сам . Для того, в частности, чтоб контролировать зависание при выполнении некоторых действий. В моем случае контролировалось поступление данных в FIFO от карты. Если ответ задерживался, то возникало переполнение таймера и выставлялся флаг возникновения прерывания. Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave . |
Автор: | Zhuk72 [ Ср июн 07, 2017 08:37:13 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Чтож в SPI не додумались такое воткнуть, чтоб не висеть в цикле проверки RXNE когда отрывается Slave . А прерывание никак не включить? Вчера только читал про SPI в Cortex M3 (я относительно недавно начал ковырять АРМы), т.к. тоже имею сабжевую платку и хочу ее попробовать. Так вот, как подсказывает мне мой склероз, в МК есть прерывания на пустой ТХ буфер, НЕ пустой RX буфер и всякие ошибки (CRC, overrun и чего-то там еще). Так что можно на дисплее (если он есть) показывать какой-нибудь мультик пока не получен ответ от считывателя (слейва). Также у него (522-го) еще отдельный выход IRQ есть, но пока не дочитал до него и не знаю по каким событиям он может дергаться и дергать хост. Писать пока не начинал, только изучаю 522-й теоретически. |
Автор: | isx [ Ср июн 07, 2017 17:19:24 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Для общения с Rc522 иногда нужно послать 8 байт и сделать строб, а иногда послать два раза по 8 байт и только потом делать строб. Вот на фоне всей этой фигни и рождается жуткий гемор в прерываниях SPI. Там ведь всего 3 флага прерываний. У 522 есть целый регистр для активатиции выхода irq при возникновении того или иного прерывания. Фича полезная, если связать с внешним прерыванием МК, то можно разгрузить процессор. Сам правда пока им ре пользовался. Сейчас застрял на антиколлизии. При поднесении двух меток в буфере оказывается всякая хрень, но флаг обнаружения коллизии не выставляется. |
Автор: | isx [ Пт июн 09, 2017 18:44:30 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Оказалось, что в карточках одного типа бит коллизии установлен в одном и том же месте, поэтому коллизии не происходит. Добился выбора карты, аутентификации и чтения/записи из EEPROM, однако это происходит только один раз. Повторный цикл антиколлизии возможен только после перезагрузки устройства. Не могу никак победить проблему.... |
Автор: | Zhuk72 [ Ср июн 28, 2017 18:30:04 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Для начала освоил SPI на STM32. Потом начал изучать документацию на чип, но к моему сожалению, в ней описано только как подключается чип, протоколы обмена с МК (SPI, USART, I2C), краем упомянут протокол общения с картой и дано описание регистров. Но самое важное для меня - порядок инициализации и чтения/записи с/на карту я не нашел. Вот и я так же. С SPI на STM32F103 вчера разобрался наконец-то (ну они и намудрили с ногой NSS!), подключил модуль MFRC522 к МК, сконфигурировал SPI2 и загрустил. Такого бестолкового ДШ я еще не видел, у китайцев и то лучше! Мне не хочется пионерить чей-то инит, хочу чтоб производитель (NXP) сам мне о нем рассказал. Сейчас пошарю у них на сайте на предмет AN. В сети, как я навскидку заметил, все юзают готовые библиотеки, которые я не люблю, но никто не описывает, как с этим чипом общаться. Кстати, они там пишут про автоопределение интерфейса (SPI / I2C / UART). В таблице в графе по SPI указано I2C (pin 1) = 0, EA (pin 32) = 1. Это надо такие уровни выставить на них? |
Автор: | Zhuk72 [ Чт июн 29, 2017 15:21:05 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Кстати, они там пишут про автоопределение интерфейса (SPI / I2C / UART). В таблице в графе по SPI указано I2C (pin 1) = 0, EA (pin 32) = 1. Это надо такие уровни выставить на них? Судя по схеме и визуальному осмотру платы, на плате уже все предусмотрели, т.е. распиновка сделана под SPI. А вот с документацией у них действительно очень плохо. Если не гуглить сабж, а просто через сайт NXP попытаться найти ДШ на чип, то оказываешься в дебрях невиданных. Я так и не вышел на страницу с чипом, на которой была бы ссылка на документацию. |
Автор: | -=Vovka=- [ Вс июл 09, 2017 09:03:06 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
А я ковыряю подключение через UART. В МК ног не хватает для SPI (заняты под другие цели), переделать модуль под I2C не решился, т.к. нужно сдувать микросхему и под ней перерезать дорожку, а вот переделать под UART легко. Подключил к USB-UART переходнику через согласование. Вот мучаюсь хоть что-то от модуля получить... |
Автор: | Zhuk72 [ Вс июл 09, 2017 09:46:51 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
А еще меня смущает то, что на моем чипе не видно маркировки Я получал плату в период сложных личных обстоятельств и не обратил на это внимание. Теперь вот думаю, если чип мне не будет отвечать это из-за моей ошибки в программе, или потому что я общаюсь с простым куском керамики? |
Автор: | Zhuk72 [ Пн июл 10, 2017 10:59:36 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Почитайте страницы 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". Значит следующим за ним байт - это конфигурация этого регистра. Таким же методом пройдитесь по остальным командам и таблицам с адресами в ДШ. |
Автор: | -=Vovka=- [ Пн июл 10, 2017 18:18:03 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Спасибо, это я уже понял. Теперь с ответами разобраться бы. Я так понимаю, что на команду 54 8D (см. скриншот выше) чип отвечает 54. И похоже он всегда возвращает код команды? Хотя один раз я то-то ему послал, так всегда стал возвращать посылаемое значение. После отключения питания ответ вернулся кодом команды |
Автор: | Zhuk72 [ Пн июл 10, 2017 19:07:53 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Ну вот смотрите. Судя по таблицам, если адрес записывающий (следующий за ним байт конфигурирующий), то адрес в ответ повторяется. В случае чтения идет ответ содержимого регистра по адресу. Попробуйте отправить 0x37 и посмотрите на ответ. Самому интересно Добавлено after 2 minutes 6 seconds: Пардон, не 0x37, а 0xB7. Забыл про единицу в старшем бите. |
Автор: | -=Vovka=- [ Вт июл 11, 2017 12:33:26 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Ага, мои догадки оказались верными! И не 0xB7: 0x37<<1 = 0x6E 0x6E | 0x80 = 0xEE Чтоб не мучать МК перепрошивками делаю программу для Windows. Добавлено after 2 hours 38 minutes 40 seconds: Еще одна непонятка: контрольная сумма нужна в командах или это только при записи в карту блока данных? |
Автор: | Zhuk72 [ Вт июл 11, 2017 13:37:14 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
А сдвиг зачем? Сдвиг используется при работе через SPI (по I2C особо не вникал). В ответ на 37h (в правильной посылке) может быть только 2 ответа: 91h или 92h, т.е. 1 или 2 версия чипа. Ваш ноль - это скорее всего свидетельство ошибочной команды |
Автор: | -=Vovka=- [ Вт июл 11, 2017 19:52:16 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
А сдвиг зачем? Вот из скетча: Код: 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 [ Вт июл 11, 2017 19:57:45 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Так я же говорю, что сдвиг для SPI нужен, но не для UART. Там в скетче как раз SPI и упоминается. Не сдвигайте. Команды записи отправляйте как есть, а команды чтения с выставлением MSB. Это для SPI. У него младший бит в нуле всегда, старший такой же, как и для UART. Это для UART. На него и ориентируйтесь. |
Автор: | -=Vovka=- [ Вт июл 11, 2017 21:04:14 ] |
Заголовок сообщения: | Re: Ковыряем RFID Mifare и MFRC522 |
Отправляю B7 00 - что-то ерунду возвращает: |
Страница 1 из 7 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |