Test example

Dependencies:   mbed

Fork of readMifare by Interactive Device Design

Committer:
nebgnahz
Date:
Fri Sep 19 05:04:15 2014 +0000
Revision:
0:54bf4b21c7fa
Child:
1:fb72a2f7cab5
Version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nebgnahz 0:54bf4b21c7fa 1 // readMifare code adapted from Adafruit-PN532 library.
nebgnahz 0:54bf4b21c7fa 2 // see: https://github.com/adafruit/Adafruit-PN532
nebgnahz 0:54bf4b21c7fa 3 //
nebgnahz 0:54bf4b21c7fa 4 // Original Author : Adafruit Industries
nebgnahz 0:54bf4b21c7fa 5 // Modified By : Ben Zhang <benzh@eecs.berkeley.edu>
nebgnahz 0:54bf4b21c7fa 6 // Date : 2014/09/17
nebgnahz 0:54bf4b21c7fa 7
nebgnahz 0:54bf4b21c7fa 8 /**************************************************************************/
nebgnahz 0:54bf4b21c7fa 9 /*!
nebgnahz 0:54bf4b21c7fa 10 This example will wait for any ISO14443A card or tag, and
nebgnahz 0:54bf4b21c7fa 11 depending on the size of the UID will attempt to read from it.
nebgnahz 0:54bf4b21c7fa 12
nebgnahz 0:54bf4b21c7fa 13 If the card has a 4-byte UID it is probably a Mifare
nebgnahz 0:54bf4b21c7fa 14 Classic card, and the following steps are taken:
nebgnahz 0:54bf4b21c7fa 15
nebgnahz 0:54bf4b21c7fa 16 - Authenticate block 4 (the first block of Sector 1) using
nebgnahz 0:54bf4b21c7fa 17 the default KEYA of 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF
nebgnahz 0:54bf4b21c7fa 18 - If authentication succeeds, we can then read any of the
nebgnahz 0:54bf4b21c7fa 19 4 blocks in that sector (though only block 4 is read here)
nebgnahz 0:54bf4b21c7fa 20
nebgnahz 0:54bf4b21c7fa 21 If the card has a 7-byte UID it is probably a Mifare
nebgnahz 0:54bf4b21c7fa 22 Ultralight card, and the 4 byte pages can be read directly.
nebgnahz 0:54bf4b21c7fa 23 Page 4 is read by default since this is the first 'general-
nebgnahz 0:54bf4b21c7fa 24 purpose' page on the tags.
nebgnahz 0:54bf4b21c7fa 25
nebgnahz 0:54bf4b21c7fa 26
nebgnahz 0:54bf4b21c7fa 27 This is an example sketch for the Adafruit PN532 NFC/RFID breakout boards
nebgnahz 0:54bf4b21c7fa 28 This library works with the Adafruit NFC breakout
nebgnahz 0:54bf4b21c7fa 29 ----> https://www.adafruit.com/products/364
nebgnahz 0:54bf4b21c7fa 30
nebgnahz 0:54bf4b21c7fa 31 Check out the links above for our tutorials and wiring diagrams
nebgnahz 0:54bf4b21c7fa 32 These chips use SPI to communicate, 4 required to interface
nebgnahz 0:54bf4b21c7fa 33
nebgnahz 0:54bf4b21c7fa 34 Adafruit invests time and resources providing this open source code,
nebgnahz 0:54bf4b21c7fa 35 please support Adafruit and open-source hardware by purchasing
nebgnahz 0:54bf4b21c7fa 36 products from Adafruit!
nebgnahz 0:54bf4b21c7fa 37
nebgnahz 0:54bf4b21c7fa 38 */
nebgnahz 0:54bf4b21c7fa 39 /**************************************************************************/
nebgnahz 0:54bf4b21c7fa 40
nebgnahz 0:54bf4b21c7fa 41 #include "mbed.h"
nebgnahz 0:54bf4b21c7fa 42 #include "Adafruit_PN532.h"
nebgnahz 0:54bf4b21c7fa 43
nebgnahz 0:54bf4b21c7fa 44 #define SS PTD0
nebgnahz 0:54bf4b21c7fa 45 // PTD1 is also LED_BLUE
nebgnahz 0:54bf4b21c7fa 46 #define SCK PTD1
nebgnahz 0:54bf4b21c7fa 47 #define MOSI PTD2
nebgnahz 0:54bf4b21c7fa 48 #define MISO PTD3
nebgnahz 0:54bf4b21c7fa 49
nebgnahz 0:54bf4b21c7fa 50 DigitalOut red(LED_RED);
nebgnahz 0:54bf4b21c7fa 51 DigitalOut green(LED_GREEN);
nebgnahz 0:54bf4b21c7fa 52
nebgnahz 0:54bf4b21c7fa 53 Serial pc(USBTX, USBRX);
nebgnahz 0:54bf4b21c7fa 54 Adafruit_PN532 nfc(SCK, MISO, MOSI, SS);
nebgnahz 0:54bf4b21c7fa 55
nebgnahz 0:54bf4b21c7fa 56 void loop(void);
nebgnahz 0:54bf4b21c7fa 57
nebgnahz 0:54bf4b21c7fa 58 int main() {
nebgnahz 0:54bf4b21c7fa 59 pc.printf("Hello!\n");
nebgnahz 0:54bf4b21c7fa 60 // By default, red
nebgnahz 0:54bf4b21c7fa 61 green = 1; red = 0;
nebgnahz 0:54bf4b21c7fa 62
nebgnahz 0:54bf4b21c7fa 63
nebgnahz 0:54bf4b21c7fa 64 nfc.begin();
nebgnahz 0:54bf4b21c7fa 65
nebgnahz 0:54bf4b21c7fa 66 uint32_t versiondata = nfc.getFirmwareVersion();
nebgnahz 0:54bf4b21c7fa 67 if (! versiondata) {
nebgnahz 0:54bf4b21c7fa 68 pc.printf("Didn't find PN53x board");
nebgnahz 0:54bf4b21c7fa 69 while (1); // halt
nebgnahz 0:54bf4b21c7fa 70 }
nebgnahz 0:54bf4b21c7fa 71 // Got ok data, print it out!
nebgnahz 0:54bf4b21c7fa 72 pc.printf("Found chip PN5%2X with Firmware ver. %d.%d\n",
nebgnahz 0:54bf4b21c7fa 73 versiondata >> 24,
nebgnahz 0:54bf4b21c7fa 74 (versiondata >> 16) & 0xFF,
nebgnahz 0:54bf4b21c7fa 75 (versiondata >> 8) & 0xFF);
nebgnahz 0:54bf4b21c7fa 76
nebgnahz 0:54bf4b21c7fa 77 // configure board to read RFID tags
nebgnahz 0:54bf4b21c7fa 78 nfc.SAMConfig();
nebgnahz 0:54bf4b21c7fa 79
nebgnahz 0:54bf4b21c7fa 80 pc.printf("Waiting for an ISO14443A Card ...\n");
nebgnahz 0:54bf4b21c7fa 81
nebgnahz 0:54bf4b21c7fa 82 while(1) { loop(); }
nebgnahz 0:54bf4b21c7fa 83 }
nebgnahz 0:54bf4b21c7fa 84
nebgnahz 0:54bf4b21c7fa 85
nebgnahz 0:54bf4b21c7fa 86 void loop(void) {
nebgnahz 0:54bf4b21c7fa 87 // Turn back to red
nebgnahz 0:54bf4b21c7fa 88 green = 1; red = 0;
nebgnahz 0:54bf4b21c7fa 89
nebgnahz 0:54bf4b21c7fa 90 uint8_t success;
nebgnahz 0:54bf4b21c7fa 91 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
nebgnahz 0:54bf4b21c7fa 92 uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
nebgnahz 0:54bf4b21c7fa 93
nebgnahz 0:54bf4b21c7fa 94 // Wait for an ISO14443A type cards (Mifare, etc.). When one is found
nebgnahz 0:54bf4b21c7fa 95 // 'uid' will be populated with the UID, and uidLength will indicate
nebgnahz 0:54bf4b21c7fa 96 // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
nebgnahz 0:54bf4b21c7fa 97 success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
nebgnahz 0:54bf4b21c7fa 98
nebgnahz 0:54bf4b21c7fa 99 if (success) {
nebgnahz 0:54bf4b21c7fa 100 // Turn off to indicate Card swipe
nebgnahz 0:54bf4b21c7fa 101 green = 1; red = 1;
nebgnahz 0:54bf4b21c7fa 102 // Display some basic information about the card
nebgnahz 0:54bf4b21c7fa 103 pc.printf("\n\nFound an ISO14443A card\n");
nebgnahz 0:54bf4b21c7fa 104 pc.printf(" UID Length: %d bytes", uidLength);
nebgnahz 0:54bf4b21c7fa 105 pc.printf(" UID Value: ");
nebgnahz 0:54bf4b21c7fa 106 nfc.PrintHex(uid, uidLength);
nebgnahz 0:54bf4b21c7fa 107 pc.printf("\n");
nebgnahz 0:54bf4b21c7fa 108
nebgnahz 0:54bf4b21c7fa 109 if (uidLength == 4)
nebgnahz 0:54bf4b21c7fa 110 {
nebgnahz 0:54bf4b21c7fa 111 // We probably have a Mifare Classic card ...
nebgnahz 0:54bf4b21c7fa 112 pc.printf("Seems to be a Mifare Classic card (4 byte UID)\n");
nebgnahz 0:54bf4b21c7fa 113
nebgnahz 0:54bf4b21c7fa 114 // Now we need to try to authenticate it for read/write access
nebgnahz 0:54bf4b21c7fa 115 // Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
nebgnahz 0:54bf4b21c7fa 116 pc.printf("Trying to authenticate block 4 with default KEYA value\n");
nebgnahz 0:54bf4b21c7fa 117 uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
nebgnahz 0:54bf4b21c7fa 118
nebgnahz 0:54bf4b21c7fa 119 // Start with block 4 (the first block of sector 1) since sector 0
nebgnahz 0:54bf4b21c7fa 120 // contains the manufacturer data and it's probably better just
nebgnahz 0:54bf4b21c7fa 121 // to leave it alone unless you know what you're doing
nebgnahz 0:54bf4b21c7fa 122 success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya);
nebgnahz 0:54bf4b21c7fa 123
nebgnahz 0:54bf4b21c7fa 124 if (success)
nebgnahz 0:54bf4b21c7fa 125 {
nebgnahz 0:54bf4b21c7fa 126 // Turn green to indicate success
nebgnahz 0:54bf4b21c7fa 127 green = 0; red = 1;
nebgnahz 0:54bf4b21c7fa 128 pc.printf("Sector 1 (Blocks 4..7) has been authenticated\n");
nebgnahz 0:54bf4b21c7fa 129 uint8_t data[16];
nebgnahz 0:54bf4b21c7fa 130
nebgnahz 0:54bf4b21c7fa 131 // If you want to write something to block 4 to test with, remove
nebgnahz 0:54bf4b21c7fa 132 // the definition of data above, and uncomment the following lines
nebgnahz 0:54bf4b21c7fa 133 /************************************************************************
nebgnahz 0:54bf4b21c7fa 134 uint8_t data[16] = { 'b', 'e', 'n', ' ', 'z', 'h', 'a', 'n', 'g' };
nebgnahz 0:54bf4b21c7fa 135 success = nfc.mifareclassic_WriteDataBlock (4, data);
nebgnahz 0:54bf4b21c7fa 136 if (success)
nebgnahz 0:54bf4b21c7fa 137 {
nebgnahz 0:54bf4b21c7fa 138 // Data seems to have been read ... spit it out
nebgnahz 0:54bf4b21c7fa 139 pc.printf("Data Written to Block 4:\n\t");
nebgnahz 0:54bf4b21c7fa 140 nfc.PrintHexChar(data, 16);
nebgnahz 0:54bf4b21c7fa 141 pc.printf("\n");
nebgnahz 0:54bf4b21c7fa 142
nebgnahz 0:54bf4b21c7fa 143 // Wait a bit before reading the card again
nebgnahz 0:54bf4b21c7fa 144 wait(1);
nebgnahz 0:54bf4b21c7fa 145 }
nebgnahz 0:54bf4b21c7fa 146 else
nebgnahz 0:54bf4b21c7fa 147 {
nebgnahz 0:54bf4b21c7fa 148 pc.printf("Ooops ... unable to write the requested block.\n");
nebgnahz 0:54bf4b21c7fa 149 }
nebgnahz 0:54bf4b21c7fa 150 return;
nebgnahz 0:54bf4b21c7fa 151 ************************************************************************/
nebgnahz 0:54bf4b21c7fa 152
nebgnahz 0:54bf4b21c7fa 153 // Try to read the contents of block 4
nebgnahz 0:54bf4b21c7fa 154 success = nfc.mifareclassic_ReadDataBlock(4, data);
nebgnahz 0:54bf4b21c7fa 155
nebgnahz 0:54bf4b21c7fa 156 if (success)
nebgnahz 0:54bf4b21c7fa 157 {
nebgnahz 0:54bf4b21c7fa 158 // Data seems to have been read ... spit it out
nebgnahz 0:54bf4b21c7fa 159 pc.printf("Reading Block 4:\n\t");
nebgnahz 0:54bf4b21c7fa 160 nfc.PrintHexChar(data, 16);
nebgnahz 0:54bf4b21c7fa 161 pc.printf("\n");
nebgnahz 0:54bf4b21c7fa 162
nebgnahz 0:54bf4b21c7fa 163 // Wait a bit before reading the card again
nebgnahz 0:54bf4b21c7fa 164 wait(1);
nebgnahz 0:54bf4b21c7fa 165 }
nebgnahz 0:54bf4b21c7fa 166 else
nebgnahz 0:54bf4b21c7fa 167 {
nebgnahz 0:54bf4b21c7fa 168 pc.printf("Ooops ... unable to read the requested block. Try another key?\n");
nebgnahz 0:54bf4b21c7fa 169 }
nebgnahz 0:54bf4b21c7fa 170 }
nebgnahz 0:54bf4b21c7fa 171 else
nebgnahz 0:54bf4b21c7fa 172 {
nebgnahz 0:54bf4b21c7fa 173 pc.printf("Ooops ... authentication failed: Try another key?\n");
nebgnahz 0:54bf4b21c7fa 174 }
nebgnahz 0:54bf4b21c7fa 175 }
nebgnahz 0:54bf4b21c7fa 176
nebgnahz 0:54bf4b21c7fa 177 if (uidLength == 7)
nebgnahz 0:54bf4b21c7fa 178 {
nebgnahz 0:54bf4b21c7fa 179 // We probably have a Mifare Ultralight card ...
nebgnahz 0:54bf4b21c7fa 180 pc.printf("Seems to be a Mifare Ultralight tag (7 byte UID)\n");
nebgnahz 0:54bf4b21c7fa 181
nebgnahz 0:54bf4b21c7fa 182 // Try to read the first general-purpose user page (#4)
nebgnahz 0:54bf4b21c7fa 183 pc.printf("Reading page 4\n");
nebgnahz 0:54bf4b21c7fa 184 uint8_t data[32];
nebgnahz 0:54bf4b21c7fa 185 success = nfc.mifareultralight_ReadPage (4, data);
nebgnahz 0:54bf4b21c7fa 186 if (success)
nebgnahz 0:54bf4b21c7fa 187 {
nebgnahz 0:54bf4b21c7fa 188 // Data seems to have been read ... spit it out
nebgnahz 0:54bf4b21c7fa 189 nfc.PrintHexChar(data, 4);
nebgnahz 0:54bf4b21c7fa 190 pc.printf("\n");
nebgnahz 0:54bf4b21c7fa 191
nebgnahz 0:54bf4b21c7fa 192 // Wait a bit before reading the card again
nebgnahz 0:54bf4b21c7fa 193 wait(1);
nebgnahz 0:54bf4b21c7fa 194 }
nebgnahz 0:54bf4b21c7fa 195 else
nebgnahz 0:54bf4b21c7fa 196 {
nebgnahz 0:54bf4b21c7fa 197 pc.printf("Ooops ... unable to read the requested page!?\n");
nebgnahz 0:54bf4b21c7fa 198 }
nebgnahz 0:54bf4b21c7fa 199 }
nebgnahz 0:54bf4b21c7fa 200 }
nebgnahz 0:54bf4b21c7fa 201 }