Commit 55af57c07393d669214c815c3b38ca9d4f371bb5

Authored by henyxia
1 parent bf0a878a

Customized version of the sample given by Arduino

Showing 1 changed file with 129 additions and 0 deletions   Show diff stats
main.ino 0 → 100644
... ... @@ -0,0 +1,129 @@
  1 +#include <SPI.h>
  2 +#include <PN532_SPI.h>
  3 +#include "PN532.h"
  4 +
  5 +PN532_SPI pn532spi(SPI, 10);
  6 +PN532 nfc(pn532spi);
  7 +
  8 +void setup(void) {
  9 + Serial.begin(115200);
  10 + Serial.println("Hello!");
  11 +
  12 + nfc.begin();
  13 +
  14 + uint32_t versiondata = nfc.getFirmwareVersion();
  15 + if (! versiondata)
  16 + {
  17 + Serial.print("Didn't find PN53x board");
  18 + while (1);
  19 + }
  20 + //Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
  21 + Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
  22 + Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  23 +
  24 + // configure board to read RFID tags
  25 + nfc.SAMConfig();
  26 +
  27 + Serial.println("Waiting for an ISO14443A Card ...");
  28 +}
  29 +
  30 +
  31 +void loop(void)
  32 +{
  33 + uint8_t success;
  34 + uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
  35 + uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
  36 +
  37 + // Wait for an ISO14443A type cards (Mifare, etc.). When one is found
  38 + // 'uid' will be populated with the UID, and uidLength will indicate
  39 + // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  40 + success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  41 +
  42 + if(success)
  43 + {
  44 + // Display some basic information about the card
  45 + Serial.println("Found an ISO14443A card");
  46 + Serial.print(" UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
  47 + Serial.print(" UID Value: ");
  48 + nfc.PrintHex(uid, uidLength);
  49 + Serial.println("");
  50 +
  51 + if(uidLength == 4)
  52 + {
  53 + // We probably have a Mifare Classic card ...
  54 + Serial.println("Seems to be a Mifare Classic card (4 byte UID)");
  55 +
  56 + // Now we need to try to authenticate it for read/write access
  57 + // Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
  58 + Serial.println("Trying to authenticate block 4 with default KEYA value");
  59 + uint8_t keya[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
  60 +
  61 + // Start with block 4 (the first block of sector 1) since sector 0
  62 + // contains the manufacturer data and it's probably better just
  63 + // to leave it alone unless you know what you're doing
  64 + success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 44, 0, keya);
  65 +
  66 + if(success)
  67 + {
  68 + Serial.println("Sector 1 (Blocks 4..7) has been authenticated");
  69 + uint8_t data[16];
  70 +
  71 + // If you want to write something to block 4 to test with, uncomment
  72 + // the following line and this text should be read back in a minute
  73 + // data = { 'a', 'd', 'a', 'f', 'r', 'u', 'i', 't', '.', 'c', 'o', 'm', 0, 0, 0, 0};
  74 + // success = nfc.mifareclassic_WriteDataBlock (4, data);
  75 +
  76 + // Try to read the contents of block 4
  77 + success = nfc.mifareclassic_ReadDataBlock(44, data);
  78 +
  79 + if(success)
  80 + {
  81 + // Data seems to have been read ... spit it out
  82 + Serial.println("Reading Block 4:");
  83 + nfc.PrintHexChar(data, 16);
  84 + nfc.mifareclassic_ReadDataBlock(45, data);
  85 + nfc.PrintHexChar(data, 16);
  86 + nfc.mifareclassic_ReadDataBlock(46, data);
  87 + nfc.PrintHexChar(data, 16);
  88 + Serial.println("");
  89 +
  90 + // Wait a bit before reading the card again
  91 + delay(1000);
  92 + }
  93 + else
  94 + {
  95 + Serial.println("Ooops ... unable to read the requested block. Try another key?");
  96 + }
  97 + }
  98 + else
  99 + {
  100 + Serial.println("Ooops ... authentication failed: Try another key?");
  101 + }
  102 + }
  103 +
  104 + if(uidLength == 7)
  105 + {
  106 + // We probably have a Mifare Ultralight card ...
  107 + Serial.println("Seems to be a Mifare Ultralight tag (7 byte UID)");
  108 +
  109 + // Try to read the first general-purpose user page (#4)
  110 + Serial.println("Reading page 4");
  111 + uint8_t data[32];
  112 + success = nfc.mifareultralight_ReadPage (4, data);
  113 + if(success)
  114 + {
  115 + // Data seems to have been read ... spit it out
  116 + nfc.PrintHexChar(data, 4);
  117 + Serial.println("");
  118 +
  119 + // Wait a bit before reading the card again
  120 + delay(1000);
  121 + }
  122 + else
  123 + {
  124 + Serial.println("Ooops ... unable to read the requested page!?");
  125 + }
  126 + }
  127 + }
  128 +}
  129 +
... ...