пятница, 11 мая 2018 г.

новая периферия: попытка выработать подход (на примере RFID-RC522)

На правах "записок" на "манжетах".
Имеется устройство, возможно, почти "безмозглое".
Задача: дойти до состояния, когда устройство можно использовать.
Тут попытка поставить вопросы и найти ответы, которые встретятся по ходу решения задачи: от вопроса подключения устройства до выбора API для работы с ним. В качестве подопытного — MF-RC522
Не так давно прилетел из Китая очень дешёвый считыватель RFID: RFID-RC522 (где-то проходит под именем MFRC522). На его примере можно как раз и посмотреть, какие возникнут вопросы и какие найдутся ответы. Не знаю, получится ли по ходу HOWTO-шка для этого девайся, там посмотрим.
Итак, устройство на руках. Здравый смысл подсказал несколько первых шагов
  1. Осматриваем. Находим чип с надписями:
    • RC522
      12 02
      TXD6080
      NXP
    • О! амэрикэн кампани! Вери гуд!
    • Даташиттен доступен, быстро качаем.
  2. Гуглим.
    1. Быстро находится статья одного умельца. Там есть фотки и описаны несколько хороших грабель, будем иметь в виду
    2. Статья на известном cxem.net , содержит (сюрприз) схему. Но схема очень принципиальная, содержит только часть того, что на плате
    3. Впрочем нормальная схема платы тоже нашлась.
    4. Кстати, попутно прояснил для себя разницу между RFID и  NFC. Знание — свет! :)
Как и обещал, по ходу действия встали некоторые довольно принципиальные вопросы (надо же, опять это слово!)
  1. Ок, вот плата. Как будем подключать?
    1. Уважаемый китайский производитель платы "прибил гвоздями" SPI, о чём честно предупредил при продаже
    2. Однако, даташит поведал, что на самом деле вариантов целых 3: UART (TTL), SPI, I2C
    3. Разница очевидна: SPI и I2C — хороши для сцепки с МК. Купленная плата позиционируется именно как "шилд" для Ардуино, поэтому и интерфейс установлен SPI.
    4. UART хорош для сцепки с PC, но тут, конечно, нельзя забывать, что это не совсем "обычный COM-порт", а UART TTL
    5. Несмотря на то, что производитель запаял ножки "I2C = 0" и "EA = 1", всегда можно что-то сделать, да? 😉 Один умный человек подсказал отрезать дорожку, что и было сделано для EA. Теперь, соединяя EA на питание, получаем интерфейс SPI, а на землю — UART.
    6. Мне ардуины не чужды, но считыватель я хотел использовать с компьютера. Поэтому МК был бы лишней прокладкой. Желаю UART!
  2. Ещё раз о подключении этой платки к компьютеру:
    1. отрезаем дорожку Vcc ←→ EA
    2. контактим EA ←→ GND
    3. подключаем UART TTL согласно даташиту
  3. Как убедиться, что плата работает (работает правильно?)
    этот, якобы тривиальный, вопрос в некоторых случаях ставит в тупик.
    1. Способ для богатых — осцилограф. Им, по определению, видно всё.
    2. Способ чуть попроще — логический анализатор.
    3. Способ "прямой", он же "бюджетный": смотреть на "выходе", возможно, подавая на "вход" тестовые команды
      • для данной платы рецепт простой:
      1. переводим UART в режим 9600 8N1
      2. посылаем команду "выдай свою версию" и ловим ответ:
        • cat /dev/ttyUSB0 > rc522.log &
        • echo b7 | rax2 -s >> /dev/ttyUSB0
    4. как показал дальнейший процесс изучения считывателя, плата не во всех случаях работает правильно.
  4. Выбираем API,
    1. другими словами, какими программными средствами получить нужную функциональность от устройства?
    2. Как ни странно, бывает, что способ подключения накладывает свои рамки. Впрочем, с открытым кодом возможнсти расширить эти рамки возможно, возможно!
    3. Даташит поведает нам, что для нашего "подопытного" самым непосредственным "системным" способом работы является запись байтовых команд в шину (одну из перечисленных выше) и считывание данных из неё же.
    4. Из доступного:
      1. достаточно популярный проект miguelbalboa/rfid и пара других заточены для работы в Arduino и через SPI;
    5. из желаемого: nfc-tools/libnfc, в том числе mfoc — взломщик Mifare Classic. "Небольшая" проблемка состоит в том, что эта библиотека не поддерживает MF-RC522 и не собирается поддерживать RFID. Но появились пара ребят, которые захотели и кое-что закодили, чтобы запустить libnfc на этом чипе. Можно продолжать это благородное дело.
  5. Итак, есть библиотека, которая частично работает (автор патча утверждает, что nfc-anticol работает стопудово). Переходим к тестам. Пропущу длинные логи, в сухом остатке видим следующие интересные моменты:
    1. $ LIBNFC_LOG_LEVEL=3 ./nfc-anticol 2>&1 | tee /tmp/nfc.log | histring error
      ...
      debug    libnfc.chip.rc522    RD 37: 12
      • вот это да! в даташите написано чёрным по белому:
        MFRC522 version 1.0 software version is: 91h.
        MFRC522 version 2.0 software version is: 92h.
      • А у нас тут "неопознанный енот"! 12h
    2. Смотрим дальше:
      • debug    libnfc.driver.rc522_uart    Upgrading baud rate to user-specified 115200 bps.
        debug    libnfc.bus.uart    Serial port speed requested to be set to 115200 baud.
        debug    libnfc.bus.uart    TX: 1f
        debug    libnfc.bus.uart    RX: 00
        debug    libnfc.driver.rc522_uart    rc522_uart_write ack does not match (sent 1F, received 00)
        error    libnfc.chip.rc522    Unable to write register 1F!
      • вот так.. порт на нормальные 115200 бод работать отказывается.
      • Чтобы продолжать, придётся дальше работать на 9600:
      • name = "MFRC522"
        connstring = "rc522_uart:/dev/ttyUSB0:9600"
    3. Совершенно шокирующим оказался результат Self-test (раздел 16.1.1 даташита). На выходе - одни нули.
    4. Если идти ещё дальше, то получаются странные дела: при отсутвии RFID-карты около считывателя всё отрабатывает до сообщения: "Error: No tag available". А если приложить RFID-карту — ошибка при инициализации радио-части.
  6. Как показал эксперимент (вот она, настоящая физика!),
    1. чип явно нестандартный, либо работает сильно не так из-за неправильной платы. Полагаю, в данном случае второе — чисто гипотетическое предположение, которое, опять, один умный человек напомнил.
    2. практическое использование функций считывателя пока ещё не светит: надо выверять, что работает, а что — нет, двигаться по шагам, без хорошего обзора, сколько ещё впереди.
Вот так. Вопросы пока подвисли, ответы нашлись не все.
feedback is welcome, share your thoughts/experience/etc.
15.05 Добавил результат Self-test

Комментариев нет:

Отправить комментарий