First commit
[hackover2013-badge-firmware.git] / tools / examples / sensors / pn532 / ISO14443A_ID / main.c
index fb6066e..511a554 100644 (file)
@@ -39,7 +39,7 @@
 #include "sysinit.h"
 
 #include "drivers/sensors/pn532/pn532.h"
-#include "drivers/sensors/pn532/pn532_drvr.h"
+#include "drivers/sensors/pn532/pn532_bus.h"
 
 /**************************************************************************/
 /*! 
@@ -55,7 +55,7 @@
 int main (void)
 {
   #ifdef CFG_INTERFACE
-    #error "CFG_INTERFACE must be disabled in projectconfig.h for this demo"
+    //#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"
@@ -64,75 +64,122 @@ int main (void)
   // Configure cpu and mandatory peripherals
   systemInit();
   
-  // Wait 5 second for someone to open the USB connection for printf
+  // Wait a bit 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;
+  byte_t response[64];
+  size_t responseLen;
 
-  // Setup command to initialise a single ISO14443A target at 106kbps 
+  // 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("Wait for an ISO14443A card (Mifare Classic, etc.)%s", CFG_PRINTF_NEWLINE);
+    printf("Waiting for an ISO14443A card (Mifare Classic, etc.)%s", CFG_PRINTF_NEWLINE);
 
-    // Send the command
+    // Send the command (and handle the most common errors)
     error = pn532Write(abtCommand, sizeof(abtCommand));
-
-    // Wait until we get a response or an unexpected error message
-    do
+    if (error)
     {
-      error = pn532Read(response, &responseLen);
-      systickDelay(25);
+      // 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;
+      }
     }
-    #ifdef PN532_UART
-    while (error == PN532_ERROR_RESPONSEBUFFEREMPTY);
-    #endif
-    #ifdef PN532_SPI
-    while ((error == PN532_ERROR_RESPONSEBUFFEREMPTY) || (error = PN532_ERROR_SPIREADYSTATUSTIMEOUT));
-    #endif
-
-    // Print the card details if possible
-    if (!error)
+    else
     {
-      /* 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   */
+      // 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: %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("%-12s: ", "Received");
+      pn532PrintHex(response, responseLen);
+
+      // Try to handle some potential frame errors
+      // Unhandled errors are caught further down
+      switch (error)
       {
-        printf("%02x ", response[13 + pos]);
+        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;
+      }
+  
+      // 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);
       }
-      printf(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
This page took 0.029268 seconds and 4 git commands to generate.