pn532_error_t pn532Write(byte_t * abtCommand, size_t szLen) { if (!pcb.initialised) pn532Init(); // Try to wake the device up if it's in sleep mode if (pcb.state == PN532_STATE_SLEEP) { pn532_error_t wakeupError = pn532_bus_Wakeup(); if (wakeupError) return wakeupError; } // Send the command if the device is in an appropriate state if (pcb.state == PN532_STATE_READY) { return pn532_bus_SendCommand(abtCommand, szLen); } else { #ifdef PN532_DEBUGMODE PN532_DEBUG("Init Failed%s", CFG_PRINTF_NEWLINE); #endif return PN532_ERROR_UNABLETOINIT; } }
pn532_error_t pn532Read(byte_t * pbtResponse, size_t * pszLen) { if (!pcb.initialised) pn532Init(); // Try to wake the device up if it's in sleep mode if (pcb.state == PN532_STATE_SLEEP) { pn532_error_t wakeupError = pn532_bus_Wakeup(); if (wakeupError) return wakeupError; } // Read the response if the device is in an appropriate state if (pcb.state == PN532_STATE_READY) { return pn532_bus_ReadResponse(pbtResponse, pszLen); } else { #ifdef PN532_DEBUGMODE PN532_DEBUG("Init Failed%s", CFG_PRINTF_NEWLINE); #endif return PN532_ERROR_UNABLETOINIT; } }
int main (void) { #ifdef CFG_INTERFACE #error "CFG_INTERFACE must be disabled in projectconfig.h for this demo" #endif #if !defined CFG_PRINTF_USBCDC #error "CFG_PRINTF_USBCDC must be enabled in projectconfig.h for this demo" #endif // Configure cpu and mandatory peripherals systemInit(); // Wait 5 second for someone to open the USB connection for printf systickDelay(5000); // Initialise the PN532 pn532Init(); byte_t response[256]; size_t responseLen; pn532_error_t error; // Setup command to initialise a single ISO14443A target at 106kbps byte_t abtCommand[] = { PN532_COMMAND_INLISTPASSIVETARGET, 0x01, PN532_MODULATION_ISO14443A_106KBPS }; while (1) { printf("%s", CFG_PRINTF_NEWLINE); printf("Waiting for an ISO14443A card (Mifare Classic, etc.)%s", CFG_PRINTF_NEWLINE); // Send the command (and handle the most common errors) error = pn532Write(abtCommand, sizeof(abtCommand)); if (error) { // Something went wrong sending the command (probably the bus selection or wiring) switch(error) { case (PN532_ERROR_NOACK): // No ACK frame received in UART mode (bus pins not set correctly?) printf("Ooops ... No ACK frame was received! Are the bus pins sets to UART?%s", CFG_PRINTF_NEWLINE); break; case (PN532_ERROR_I2C_NACK): // No ACK bit received to I2C start (bus pins not set correctly?) printf("Ooops ... No ACK bit received for I2C start! Are the bus pins sets to I2C?%s", CFG_PRINTF_NEWLINE); break; default: printf("Ooops ... something went wrong! [PN532 Error Code: 0x%02X]%s", error, CFG_PRINTF_NEWLINE); break; } } else { // Commmand seems to have gone through ... do { // Keep reading until we get a response or an unexpected error condition error = pn532Read(response, &responseLen); systickDelay(25); } while (error == PN532_ERROR_RESPONSEBUFFEREMPTY); // Print the card details if possible if (!error) { /* Response for ISO14443A 106KBPS (Mifare Classic, etc.) See UM0701-02 section 7.3.5 for more information byte Description ------------- ------------------------------------------ b7 Tags Found b8 Tag Number (only one used in this example) b9..10 SENS_RES b11 SEL_RES b12 NFCID Length b13..NFCIDLen NFCID SENS_RES SEL_RES Manufacturer/Card Type NFCID Len -------- ------- ----------------------- --------- 00 04 08 NXP Mifare Classic 1K 4 bytes */ printf("%s", CFG_PRINTF_NEWLINE); printf("%-12s: %d %s", "Tags Found", response[7], CFG_PRINTF_NEWLINE); printf("%-12s: %02X %02X %s", "SENS_RES", response[9], response[10], CFG_PRINTF_NEWLINE); printf("%-12s: %02X %s", "SEL_RES", response[11], CFG_PRINTF_NEWLINE); printf("%-12s: ", "NFCID"); size_t pos; for (pos=0; pos < response[12]; pos++) { printf("%02x ", response[13 + pos]); } printf(CFG_PRINTF_NEWLINE); if ((response[9] == 0x00) && (response[10] == 0x04) && (response[11] == 0x08)) { printf("Seems to be a Mifare Classic 1K Card%s", CFG_PRINTF_NEWLINE); } } else { // Oops .... something bad happened. Check 'error' printf("Ooops! Error %02X %s", error, CFG_PRINTF_NEWLINE); } } // Wait at least one second before trying again systickDelay(1000); } }
int main (void) { #ifdef CFG_INTERFACE //#error "CFG_INTERFACE must be disabled in projectconfig.h for this demo" #endif #if !defined CFG_PRINTF_USBCDC #error "CFG_PRINTF_USBCDC must be enabled in projectconfig.h for this demo" #endif // Configure cpu and mandatory peripherals systemInit(); // Wait a bit for someone to open the USB connection for printf systickDelay(5000); // Initialise the PN532 pn532Init(); pn532_error_t error; byte_t response[64]; size_t responseLen; // Setup command to initialise a single ISO14443A target at 106kbps (Mifare Classic, Ultralight, etc.) byte_t abtCommand[] = { PN532_COMMAND_INLISTPASSIVETARGET, 0x01, PN532_MODULATION_ISO14443A_106KBPS }; while (1) { printf("%s", CFG_PRINTF_NEWLINE); printf("Waiting for an ISO14443A card (Mifare Classic, etc.)%s", CFG_PRINTF_NEWLINE); // Send the command (and handle the most common errors) error = pn532Write(abtCommand, sizeof(abtCommand)); if (error) { // Something went wrong sending the command (probably the bus selection or wiring) switch(error) { case (PN532_ERROR_NOACK): case (PN532_ERROR_INVALIDACK): // No ACK response frame received from the PN532 printf("Ooops ... No valid ACK frame received!%s", CFG_PRINTF_NEWLINE); break; case (PN532_ERROR_I2C_NACK): // No ACK bit received to I2C start ... not same as PN532 ACK frame (bus pins not set correctly?) printf("Ooops ... No I2C ACK received! Are the bus select pins sets to I2C?%s", CFG_PRINTF_NEWLINE); break; case (PN532_ERROR_READYSTATUSTIMEOUT): // Timed out waiting for the ready bit to clear ... this can be intentional, though, in the // case of PN532_COMMAND_INLISTPASSIVETARGET since it will only clear when a card // enters the magnetic field! Handle with caution because it isn't always an error // Note: Only valid for I2C and SPI printf("Timed out waiting for Ready/IRQ%s", CFG_PRINTF_NEWLINE); break; default: printf("Ooops ... something went wrong! [PN532 Error Code: 0x%02X]%s", error, CFG_PRINTF_NEWLINE); break; } } else { // Commmand seems to have gone through ... do { // Keep reading until we get a response or an unexpected error condition error = pn532Read(response, &responseLen); systickDelay(25); } while (error == PN532_ERROR_RESPONSEBUFFEREMPTY); printf("%s", CFG_PRINTF_NEWLINE); printf("%-12s: ", "Received"); pn532PrintHex(response, responseLen); // Try to handle some potential frame errors // Unhandled errors are caught further down switch (error) { case (PN532_ERROR_PREAMBLEMISMATCH): // Frame should start with 0x00 0x00 0xFF! printf("Response frame doesn't start with expected preamble (00 00 FF)%s", CFG_PRINTF_NEWLINE); break; case (PN532_ERROR_APPLEVELERROR): printf("Application level error reported by PN532%s", CFG_PRINTF_NEWLINE); break; case (PN532_ERROR_LENCHECKSUMMISMATCH): printf("Frame length check/checksum mismatch%s", CFG_PRINTF_NEWLINE); break; default: // Other errors handled below break; } // Print the card details if possible if (!error) { /* Response for ISO14443A 106KBPS (Mifare Classic, etc.) See UM0701-02 section 7.3.5 for more information byte Description ------------- ------------------------------------------ b7 Tags Found b8 Tag Number (only one used in this example) b9..10 SENS_RES b11 SEL_RES b12 NFCID Length b13..NFCIDLen NFCID SENS_RES SEL_RES Manufacturer/Card Type NFCID Len -------- ------- ----------------------- --------- 00 04 08 NXP Mifare Classic 1K 4 bytes */ printf("%-12s: %d %s", "Tags Found", response[7], CFG_PRINTF_NEWLINE); printf("%-12s: %02X %02X %s", "SENS_RES", response[9], response[10], CFG_PRINTF_NEWLINE); printf("%-12s: %02X %s", "SEL_RES", response[11], CFG_PRINTF_NEWLINE); printf("%-12s: ", "NFCID"); size_t pos; for (pos=0; pos < response[12]; pos++) { printf("%02x ", response[13 + pos]); } printf(CFG_PRINTF_NEWLINE); if ((response[9] == 0x00) && (response[10] == 0x04) && (response[11] == 0x08)) { printf("Seems to be a Mifare Classic 1K Card%s", CFG_PRINTF_NEWLINE); } } else { // Oops .... something bad happened. Check 'error' printf("Ooops! Error %02X %s", error, CFG_PRINTF_NEWLINE); } } // Wait at least one second before trying again systickDelay(1000); } }