Test example

Dependencies:   mbed

Fork of readMifare by Interactive Device Design

Committer:
shong2010
Date:
Mon Nov 03 05:48:29 2014 +0000
Revision:
2:96f420fa4a6e
Parent:
1:fb72a2f7cab5
Child:
3:08251c301e26
RFID Prototype

Who changed what in which revision?

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