Test example

Dependencies:   mbed

Fork of readMifare by Interactive Device Design

Committer:
mjovanov1
Date:
Thu Mar 17 09:49:16 2016 +0000
Revision:
5:4b238fd5f347
Parent:
4:70acff42d8b4
Child:
6:9109b95c3e97
Pokusaj 123124

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
mjovanov1 4:70acff42d8b4 43 #define MOSI p11
mjovanov1 4:70acff42d8b4 44 #define MISO p12
mjovanov1 4:70acff42d8b4 45 #define SCK p13
mjovanov1 4:70acff42d8b4 46 #define SS p20
nebgnahz 0:54bf4b21c7fa 47
nebgnahz 0:54bf4b21c7fa 48 Serial pc(USBTX, USBRX);
nebgnahz 0:54bf4b21c7fa 49 Adafruit_PN532 nfc(SCK, MISO, MOSI, SS);
nebgnahz 0:54bf4b21c7fa 50
nebgnahz 0:54bf4b21c7fa 51 void loop(void);
mjovanov1 5:4b238fd5f347 52 int sectorToBlock(int sectorIndex);
nebgnahz 0:54bf4b21c7fa 53
nebgnahz 0:54bf4b21c7fa 54 int main() {
mjovanov1 3:08251c301e26 55 pc.printf("Hello!\r\n");
shong2010 2:96f420fa4a6e 56 // By default, no color
nebgnahz 0:54bf4b21c7fa 57
nebgnahz 0:54bf4b21c7fa 58 nfc.begin();
nebgnahz 0:54bf4b21c7fa 59
nebgnahz 0:54bf4b21c7fa 60 uint32_t versiondata = nfc.getFirmwareVersion();
nebgnahz 0:54bf4b21c7fa 61 if (! versiondata) {
nebgnahz 0:54bf4b21c7fa 62 pc.printf("Didn't find PN53x board");
nebgnahz 0:54bf4b21c7fa 63 while (1); // halt
nebgnahz 0:54bf4b21c7fa 64 }
nebgnahz 0:54bf4b21c7fa 65 // Got ok data, print it out!
mjovanov1 3:08251c301e26 66 pc.printf("Found chip PN5%2X with Firmware ver. %d.%d\r\n",
nebgnahz 0:54bf4b21c7fa 67 versiondata >> 24,
nebgnahz 0:54bf4b21c7fa 68 (versiondata >> 16) & 0xFF,
nebgnahz 0:54bf4b21c7fa 69 (versiondata >> 8) & 0xFF);
nebgnahz 0:54bf4b21c7fa 70
nebgnahz 0:54bf4b21c7fa 71 // configure board to read RFID tags
nebgnahz 0:54bf4b21c7fa 72 nfc.SAMConfig();
nebgnahz 0:54bf4b21c7fa 73
mjovanov1 3:08251c301e26 74 pc.printf("Waiting for an ISO14443A Card ...\r\n");
nebgnahz 0:54bf4b21c7fa 75
nebgnahz 0:54bf4b21c7fa 76 while(1) { loop(); }
nebgnahz 0:54bf4b21c7fa 77 }
nebgnahz 0:54bf4b21c7fa 78
nebgnahz 0:54bf4b21c7fa 79
nebgnahz 0:54bf4b21c7fa 80 void loop(void) {
shong2010 2:96f420fa4a6e 81 // Turn back to no color
nebgnahz 0:54bf4b21c7fa 82
nebgnahz 0:54bf4b21c7fa 83 uint8_t success;
nebgnahz 0:54bf4b21c7fa 84 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
nebgnahz 0:54bf4b21c7fa 85 uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
mjovanov1 5:4b238fd5f347 86 int sector = 32;
nebgnahz 0:54bf4b21c7fa 87
nebgnahz 0:54bf4b21c7fa 88 // Wait for an ISO14443A type cards (Mifare, etc.). When one is found
nebgnahz 0:54bf4b21c7fa 89 // 'uid' will be populated with the UID, and uidLength will indicate
nebgnahz 0:54bf4b21c7fa 90 // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
nebgnahz 0:54bf4b21c7fa 91 success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
nebgnahz 0:54bf4b21c7fa 92
nebgnahz 0:54bf4b21c7fa 93 if (success) {
nebgnahz 0:54bf4b21c7fa 94 // Display some basic information about the card
mjovanov1 3:08251c301e26 95 pc.printf("\r\n\r\nFound an ISO14443A card\r\n");
nebgnahz 0:54bf4b21c7fa 96 pc.printf(" UID Length: %d bytes", uidLength);
nebgnahz 0:54bf4b21c7fa 97 pc.printf(" UID Value: ");
nebgnahz 0:54bf4b21c7fa 98 nfc.PrintHex(uid, uidLength);
mjovanov1 3:08251c301e26 99 pc.printf("\r\n");
nebgnahz 0:54bf4b21c7fa 100
nebgnahz 0:54bf4b21c7fa 101 if (uidLength == 4)
nebgnahz 0:54bf4b21c7fa 102 {
nebgnahz 0:54bf4b21c7fa 103 // We probably have a Mifare Classic card ...
mjovanov1 3:08251c301e26 104 pc.printf("Seems to be a Mifare Classic card (4 byte UID)\r\n");
nebgnahz 0:54bf4b21c7fa 105
nebgnahz 0:54bf4b21c7fa 106 // Now we need to try to authenticate it for read/write access
nebgnahz 0:54bf4b21c7fa 107 // Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
mjovanov1 5:4b238fd5f347 108 pc.printf("Trying to authenticate sector %d with default KEYA value\r\n", sector);
mjovanov1 3:08251c301e26 109 uint8_t keya[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
mjovanov1 5:4b238fd5f347 110 int blockNumber = sectorToBlock(sector);
nebgnahz 0:54bf4b21c7fa 111
nebgnahz 0:54bf4b21c7fa 112 // Start with block 4 (the first block of sector 1) since sector 0
nebgnahz 0:54bf4b21c7fa 113 // contains the manufacturer data and it's probably better just
nebgnahz 0:54bf4b21c7fa 114 // to leave it alone unless you know what you're doing
mjovanov1 5:4b238fd5f347 115 success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, blockNumber, 0, keya);
nebgnahz 0:54bf4b21c7fa 116
mjovanov1 3:08251c301e26 117 if (success)
mjovanov1 3:08251c301e26 118 {
nebgnahz 0:54bf4b21c7fa 119 // Try to read the contents of block 4
mjovanov1 3:08251c301e26 120 int respSize = 16;
mjovanov1 3:08251c301e26 121 uint8_t data[respSize];
mjovanov1 3:08251c301e26 122
mjovanov1 5:4b238fd5f347 123 success = nfc.mifareclassic_ReadDataBlock(blockNumber, data);
mjovanov1 3:08251c301e26 124
mjovanov1 3:08251c301e26 125 if (success)
mjovanov1 3:08251c301e26 126 {
mjovanov1 3:08251c301e26 127 // Data seems to have been read ... spit it out
mjovanov1 4:70acff42d8b4 128 pc.printf("Reading Block %d:\r\n\t", 128);
mjovanov1 3:08251c301e26 129 nfc.PrintHexChar(data, respSize);
mjovanov1 3:08251c301e26 130 pc.printf("\r\n");
mjovanov1 3:08251c301e26 131
mjovanov1 4:70acff42d8b4 132
mjovanov1 4:70acff42d8b4 133
mjovanov1 3:08251c301e26 134 // Wait a bit before reading the card again
mjovanov1 3:08251c301e26 135 wait(1);
mjovanov1 3:08251c301e26 136 }
mjovanov1 3:08251c301e26 137 else
mjovanov1 3:08251c301e26 138 {
mjovanov1 3:08251c301e26 139 pc.printf("Ooops ... unable to read the requested block. Try another key?\r\n");
mjovanov1 3:08251c301e26 140 }
nebgnahz 0:54bf4b21c7fa 141 }
nebgnahz 0:54bf4b21c7fa 142 else
nebgnahz 0:54bf4b21c7fa 143 {
mjovanov1 3:08251c301e26 144 pc.printf("Ooops ... authentication failed: Try another key?\r\n");
nebgnahz 0:54bf4b21c7fa 145 }
nebgnahz 0:54bf4b21c7fa 146 }
nebgnahz 0:54bf4b21c7fa 147
nebgnahz 0:54bf4b21c7fa 148 if (uidLength == 7)
nebgnahz 0:54bf4b21c7fa 149 {
nebgnahz 0:54bf4b21c7fa 150 // We probably have a Mifare Ultralight card ...
mjovanov1 3:08251c301e26 151 pc.printf("Seems to be a Mifare Ultralight tag (7 byte UID)\r\n");
nebgnahz 0:54bf4b21c7fa 152
nebgnahz 0:54bf4b21c7fa 153 // Try to read the first general-purpose user page (#4)
mjovanov1 3:08251c301e26 154 pc.printf("Reading page 4\r\n");
nebgnahz 0:54bf4b21c7fa 155 uint8_t data[32];
nebgnahz 0:54bf4b21c7fa 156 success = nfc.mifareultralight_ReadPage (4, data);
nebgnahz 0:54bf4b21c7fa 157 if (success)
nebgnahz 0:54bf4b21c7fa 158 {
nebgnahz 0:54bf4b21c7fa 159 // Data seems to have been read ... spit it out
nebgnahz 0:54bf4b21c7fa 160 nfc.PrintHexChar(data, 4);
mjovanov1 3:08251c301e26 161 pc.printf("\r\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 {
mjovanov1 3:08251c301e26 168 pc.printf("Ooops ... unable to read the requested page!?\r\n");
nebgnahz 0:54bf4b21c7fa 169 }
nebgnahz 0:54bf4b21c7fa 170 }
nebgnahz 0:54bf4b21c7fa 171 }
mjovanov1 5:4b238fd5f347 172 }
mjovanov1 5:4b238fd5f347 173
mjovanov1 5:4b238fd5f347 174 int sectorToBlock(int sectorIndex) {
mjovanov1 5:4b238fd5f347 175 if (sectorIndex < 32) {
mjovanov1 5:4b238fd5f347 176 return sectorIndex * 4;
mjovanov1 5:4b238fd5f347 177 } else {
mjovanov1 5:4b238fd5f347 178 return 32 * 4 + (sectorIndex - 32) * 16;
mjovanov1 5:4b238fd5f347 179 }
nebgnahz 0:54bf4b21c7fa 180 }