Ich meine mein Problem mit dem PN5180 auf die Implementierung zurückführen zu können, daher hätte ich hier einige Fragen, wo mir diese nicht ganz klar ist.
Zuerst einmal ganz allgemein: Woher kommt die Einschränkung, dass nur ISO-14443 Tags zum Aufwecken verwendet werden können? Bei mir löst eine andere Karte auch zuverlässig den Interrupt aus, könnte ich diese nicht auch ganz normal lesen?
Zur Implementierung:
Es gibt zwei Funktionen die den ESP32 in den Tiefschlaf versetzen und vorher LPCD aktivieren. Das ist einmal Rfid_EnableLpcd(), welches aufgerufen wird nachdem der ESPuino normal an war. Dann gibt es noch Rfid_WakeupCheck(). Dieses schaut ob der RFID den ESP geweckt hat und geht wieder in den Deepsleep wenn keine Karte aufliegt.
-
static PN5180 nfc(...);
vsstatic PN5180ISO14443 nfc14443(...);
Hier wird einmal speziell 14443 verwendet und einmal die generische Version. Wacht deshalb mein ESP zuverlässig auch bei anderen Karten auf oder hat das keine Bedeutung? -
esp_sleep_enable_ext1_wakeup((1ULL << (RFID_IRQ)), ESP_EXT1_WAKEUP_ALL_LOW);
esp_sleep_enable_ext1_wakeup((1ULL << (RFID_IRQ)), ESP_EXT1_WAKEUP_ANY_HIGH);
Der Wakeup wird einmal auf All_LOW und auf ANY_HIGH eingestellt. Der Reader sollte ja auf active low eingestellt sein, wacht er dann nicht natürlich immer auf? - Im WakeupCheck wird der interrupt für den Button nicht neu gesetzt, weil Button_Init() erst nach RFID_Init() ausgeführt wird. Daher klappt das Aufwecken mittels Button dann auch nicht mehr.
- Andere, kleine Unterschiede, wie z.B. dass
nfc.prepareLPCD();
nur in einer Funktion aufgerufen wird
Hier nochmal als Referenz der Code
Rfid_EnableLpcd()
// Handles activation of LPCD (while shutdown is in progress)
void Rfid_EnableLpcd(void) {
// goto low power card detection mode
#ifdef PN5180_ENABLE_LPCD
static PN5180 nfc(RFID_CS, RFID_BUSY, RFID_RST);
nfc.begin();
// show PN5180 reader version
uint8_t firmwareVersion[2];
nfc.readEEprom(FIRMWARE_VERSION, firmwareVersion, sizeof(firmwareVersion));
Serial.print(F("Firmware version="));
Serial.print(firmwareVersion[1]);
Serial.print(".");
Serial.println(firmwareVersion[0]);
// check firmware version: PN5180 firmware < 4.0 has several bugs preventing the LPCD mode
// you can flash latest firmware with this project: https://github.com/abidxraihan/PN5180_Updater_ESP32
if (firmwareVersion[1] < 4) {
Serial.println(F("This PN5180 firmware does not work with LPCD! use firmware >= 4.0"));
return;
}
Serial.println(F("prepare low power card detection..."));
uint8_t irqConfig = 0b0000000; // Set IRQ active low + clear IRQ-register
nfc.writeEEprom(IRQ_PIN_CONFIG, &irqConfig, 1);
/*nfc.readEEprom(IRQ_PIN_CONFIG, &irqConfig, 1);
Serial.print(F("IRQ_PIN_CONFIG=0x"));
Serial.println(irqConfig, HEX);*/
nfc.prepareLPCD();
Serial.print(F("PN5180 IRQ PIN: "));
Serial.println(Port_Read(RFID_IRQ));
// turn on LPCD
uint16_t wakeupCounterInMs = 0x3FF; // must be in the range of 0x0 - 0xA82. max wake-up time is 2960 ms.
if (nfc.switchToLPCD(wakeupCounterInMs)) {
Serial.println(F("switch to low power card detection: success"));
// configure wakeup pin for deep-sleep wake-up, use ext1
#if (RFID_IRQ >= 0 && RFID_IRQ <= 39)
esp_sleep_enable_ext1_wakeup((1ULL << (RFID_IRQ)), ESP_EXT1_WAKEUP_ALL_LOW);
#endif
// freeze pin states in deep sleep
gpio_hold_en(gpio_num_t(RFID_CS)); // CS/NSS
gpio_hold_en(gpio_num_t(RFID_RST)); // RST
gpio_deep_sleep_hold_en();
} else {
Serial.println(F("switchToLPCD failed"));
}
#endif
}
Rfid_WakeupCheck()
// wake up from LPCD, check card is present. This works only for ISO-14443 compatible cards
void Rfid_WakeupCheck(void) {
#ifdef PN5180_ENABLE_LPCD
// disable pin hold from deep sleep
gpio_deep_sleep_hold_dis();
gpio_hold_dis(gpio_num_t(RFID_CS)); // NSS
gpio_hold_dis(gpio_num_t(RFID_RST)); // RST
#if (RFID_IRQ >= 0 && RFID_IRQ <= 39)
pinMode(RFID_IRQ, INPUT);
#endif
static PN5180ISO14443 nfc14443(RFID_CS, RFID_BUSY, RFID_RST);
nfc14443.begin();
nfc14443.reset();
// enable RF field
nfc14443.setupRF();
if (!nfc14443.isCardPresent()) {
nfc14443.reset();
uint16_t wakeupCounterInMs = 0x3FF; // needs to be in the range of 0x0 - 0xA82. max wake-up time is 2960 ms.
if (nfc14443.switchToLPCD(wakeupCounterInMs)) {
Log_Println((char *) FPSTR(lowPowerCardSuccess), LOGLEVEL_INFO);
// configure wakeup pin for deep-sleep wake-up, use ext1
esp_sleep_enable_ext1_wakeup((1ULL << (RFID_IRQ)), ESP_EXT1_WAKEUP_ANY_HIGH);
// freeze pin states in deep sleep
gpio_hold_en(gpio_num_t(RFID_CS)); // CS/NSS
gpio_hold_en(gpio_num_t(RFID_RST)); // RST
gpio_deep_sleep_hold_en();
Log_Println((char *) FPSTR(wakeUpRfidNoIso14443), LOGLEVEL_ERROR);
esp_deep_sleep_start();
} else {
Serial.println(F("switchToLPCD failed"));
}
}
nfc14443.end();
#endif
}