ESP32 не может обнаружить модуль NFC PN532

Последние несколько дней я боролся за то, чтобы модуль Elechouse PN532 V3 работал с ESP32 поверх I2C. Сам модуль PN532 отлично работает с Raspberry Pi.

Это схема (на самом деле не используется плата SparkFun ESP32, просто для справки) Схема ESP32

И это код, который я пытаюсь запустить

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

PN532_I2C pn532i2c(Wire);
PN532 nfc(pn532i2c);

void setup(void) {
  Serial.begin(115200);
  Serial.println("Hello!");

  Wire.begin(18, 19);
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }

  // Got ok data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
  Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
  Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

  // Set the max number of retry attempts to read from a card
  // This prevents us from waiting forever for a card, which is
  // the default behaviour of the PN532.
  nfc.setPassiveActivationRetries(0xFF);

  // configure board to read RFID tags
  nfc.SAMConfig();

  Serial.println("Waiting for an ISO14443A card");
}

void loop(void) {
  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                        // Length of the UID (4 or 7 bytes depending on ISO14443A card type)

  // Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  // 'uid' will be populated with the UID, and uidLength will indicate
  // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  if (success) {
    Serial.println("Found a card!");
    Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
    Serial.print("UID Value: ");
    for (uint8_t i=0; i < uidLength; i++) 
    {
      Serial.print(" 0x");Serial.print(uid[i], HEX); 
    }
    Serial.println("");
    // Wait 1 second before continuing
    delay(1000);
  }
  else
  {
    // PN532 probably timed out waiting for a card
    Serial.println("Timed out waiting for a card");
  }
}

И наконец серийный вывод: Didn't find PN53X board
Есть идеи, что я делаю не так?

РЕДАКТИРОВАТЬ: библиотеки я использую https://github.com/elechouse/PN532 и ESP32 dev board является клоном Wemos Lolin32 Lite.

5 ответов

Проблема в том, что частота ESP32 низкая.

Проверьте решение по адресу:https://github.com/adafruit/Adafruit-PN532/issues/80

Оно работает.

У меня нет этого оборудования, чтобы проверить это, но из 'PN532-PN532_HSU\NDEF\README.md'

For the Adafruit Shield using I2C 

    #include <Wire.h>
    #include <PN532_I2C.h>
    #include <PN532.h>
    #include <NfcAdapter.h>

    PN532_I2C pn532_i2c(Wire);
    NfcAdapter nfc = NfcAdapter(pn532_i2c);

Попробуйте использовать выше в вашем коде? Я также предлагаю вам рассмотреть примеры PN532 I2C более подробно. Код библиотеки PN532 I2C определяет функцию 'пробуждения':

void PN532_I2C::wakeup()
{
    delay(500); // wait for all ready to manipulate pn532
}

Комментарий заставляет меня поверить, что устройство может потребовать значительной задержки (500 мс), прежде чем оно будет готово к разговору.

Удачи.

Я попробовал еще немного, включил режим библиотеки DEBUG, добавил еще несколько операторов печати, но не смог получить ответ i2c. Приложение сканирования i2c находит мой модуль.

Мне интересно, если это проблема с электричеством, см. https://www.element14.com/community/thread/36348/l/i2c-communication-between-33v-uc-and-5v-uc?displayFullThread=true

sda и scl 21 и 22 также убедитесь, что вы изменили режим на I2C (эти перемычки на модуле PN532): doc - страница 3

У меня это сейчас работает с серым ядром M5STACK, общая проблема заключалась в том, что шина I2C блокировалась при сбросе или перепрограммировании. Используйте запасной контакт ввода-вывода и подключите его к контакту сброса PN532, удерживайте этот низкий уровень при загрузке, инициализируйте шину I2C, затем установите высокий уровень привода после 100 мс. Проблема решена, конфликты шины больше не решены.

Другие вопросы по тегам