pn532 / Mbed 2 deprecated pn532_rfid_reader

Dependencies:   mbed pn532

Fork of pn532_rfid_reader by Lucas Christian

Committer:
lucasec
Date:
Mon Mar 13 15:32:29 2017 +0000
Revision:
0:4980924c4867
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucasec 0:4980924c4867 1 #include "mbed.h"
lucasec 0:4980924c4867 2 #include "pn532/pn532.h"
lucasec 0:4980924c4867 3
lucasec 0:4980924c4867 4 #define NOTE_A4 440
lucasec 0:4980924c4867 5 #define NOTE_G7 3136
lucasec 0:4980924c4867 6
lucasec 0:4980924c4867 7 BusOut leds(LED1, LED2, LED3, LED4);
lucasec 0:4980924c4867 8 PN532 rfid(p5, p6, p7, p8);
lucasec 0:4980924c4867 9 Timer readTimer;
lucasec 0:4980924c4867 10 PwmOut speaker(p21);
lucasec 0:4980924c4867 11
lucasec 0:4980924c4867 12 void loop();
lucasec 0:4980924c4867 13
lucasec 0:4980924c4867 14 int main() {
lucasec 0:4980924c4867 15 printf("Hello!\r\n");
lucasec 0:4980924c4867 16
lucasec 0:4980924c4867 17 uint32_t versiondata = rfid.getFirmwareVersion();
lucasec 0:4980924c4867 18 if (!versiondata) {
lucasec 0:4980924c4867 19 printf("Didn't find PN53x board\r\n");
lucasec 0:4980924c4867 20 while (1); // halt
lucasec 0:4980924c4867 21 }
lucasec 0:4980924c4867 22
lucasec 0:4980924c4867 23 printf("Found chip PN5%lx\r\n", ((versiondata>>24) & 0xFF));
lucasec 0:4980924c4867 24 printf("Firmware ver. %lu.%lu\r\n", (versiondata>>16) & 0xFF,
lucasec 0:4980924c4867 25 (versiondata>>8) & 0xFF);
lucasec 0:4980924c4867 26
lucasec 0:4980924c4867 27 rfid.SAMConfig();
lucasec 0:4980924c4867 28
lucasec 0:4980924c4867 29 printf("Waiting for an ISO14443A Card ...\r\n");
lucasec 0:4980924c4867 30
lucasec 0:4980924c4867 31 while (1) {
lucasec 0:4980924c4867 32 loop();
lucasec 0:4980924c4867 33 }
lucasec 0:4980924c4867 34 }
lucasec 0:4980924c4867 35
lucasec 0:4980924c4867 36 void beep(uint16_t note, uint16_t duration) {
lucasec 0:4980924c4867 37 speaker.period(1.0/float(note));
lucasec 0:4980924c4867 38 speaker = 0.25;
lucasec 0:4980924c4867 39 wait_ms(duration);
lucasec 0:4980924c4867 40 speaker = 0;
lucasec 0:4980924c4867 41 }
lucasec 0:4980924c4867 42
lucasec 0:4980924c4867 43 void loop() {
lucasec 0:4980924c4867 44 uint8_t success, i;
lucasec 0:4980924c4867 45 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID
lucasec 0:4980924c4867 46 uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
lucasec 0:4980924c4867 47 static uint8_t lastUID[7];
lucasec 0:4980924c4867 48 static uint8_t lastUIDLength;
lucasec 0:4980924c4867 49 uint8_t newCardFound;
lucasec 0:4980924c4867 50
lucasec 0:4980924c4867 51 // Wait for an ISO14443A type cards (Mifare, etc.). When one is found
lucasec 0:4980924c4867 52 // 'uid' will be populated with the UID, and uidLength will indicate
lucasec 0:4980924c4867 53 // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
lucasec 0:4980924c4867 54 success = rfid.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
lucasec 0:4980924c4867 55
lucasec 0:4980924c4867 56 // Compare and see if we are seeing a new card
lucasec 0:4980924c4867 57 newCardFound = 0;
lucasec 0:4980924c4867 58 if (success) {
lucasec 0:4980924c4867 59 if (readTimer.read_ms() > 400) {
lucasec 0:4980924c4867 60 newCardFound = 1;
lucasec 0:4980924c4867 61 }
lucasec 0:4980924c4867 62 readTimer.reset();
lucasec 0:4980924c4867 63
lucasec 0:4980924c4867 64 if (uidLength != lastUIDLength) {
lucasec 0:4980924c4867 65 newCardFound = 1;
lucasec 0:4980924c4867 66 } else {
lucasec 0:4980924c4867 67 for (i = 0; i < uidLength; i++) {
lucasec 0:4980924c4867 68 if (uid[i] != lastUID[i]) {
lucasec 0:4980924c4867 69 newCardFound = 1;
lucasec 0:4980924c4867 70 break;
lucasec 0:4980924c4867 71 }
lucasec 0:4980924c4867 72 }
lucasec 0:4980924c4867 73 }
lucasec 0:4980924c4867 74 }
lucasec 0:4980924c4867 75
lucasec 0:4980924c4867 76 if (newCardFound) {
lucasec 0:4980924c4867 77 for (i = 0; i < uidLength; i++) {
lucasec 0:4980924c4867 78 lastUID[i] = uid[i];
lucasec 0:4980924c4867 79 }
lucasec 0:4980924c4867 80 lastUIDLength = uidLength;
lucasec 0:4980924c4867 81
lucasec 0:4980924c4867 82 leds = 0xF;
lucasec 0:4980924c4867 83
lucasec 0:4980924c4867 84 if (uidLength == 4) {
lucasec 0:4980924c4867 85 // We probably have a Mifare Classic card ...
lucasec 0:4980924c4867 86 uint32_t cardid = uid[0];
lucasec 0:4980924c4867 87 cardid <<= 8;
lucasec 0:4980924c4867 88 cardid |= uid[1];
lucasec 0:4980924c4867 89 cardid <<= 8;
lucasec 0:4980924c4867 90 cardid |= uid[2];
lucasec 0:4980924c4867 91 cardid <<= 8;
lucasec 0:4980924c4867 92 cardid |= uid[3];
lucasec 0:4980924c4867 93
lucasec 0:4980924c4867 94
lucasec 0:4980924c4867 95 // Now we need to try to authenticate it for read/write access
lucasec 0:4980924c4867 96 // Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
lucasec 0:4980924c4867 97 uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
lucasec 0:4980924c4867 98
lucasec 0:4980924c4867 99 // Start with block 4 (the first block of sector 1) since sector 0
lucasec 0:4980924c4867 100 // contains the manufacturer data and it's probably better just
lucasec 0:4980924c4867 101 // to leave it alone unless you know what you're doing
lucasec 0:4980924c4867 102 success = rfid.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya);
lucasec 0:4980924c4867 103
lucasec 0:4980924c4867 104 if (success) {
lucasec 0:4980924c4867 105 uint8_t data[16];
lucasec 0:4980924c4867 106
lucasec 0:4980924c4867 107 // If you want to write something to block 4 to test with, uncomment
lucasec 0:4980924c4867 108 // the following line and this text should be read back in a minute
lucasec 0:4980924c4867 109 // memcpy(data, (const uint8_t[]){ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE, 0xC, 0xE, 4, 1, 8, 0 }, sizeof data);
lucasec 0:4980924c4867 110 // success = rfid.mifareclassic_WriteDataBlock (4, data);
lucasec 0:4980924c4867 111
lucasec 0:4980924c4867 112 // Try to read the contents of block 4
lucasec 0:4980924c4867 113 success = rfid.mifareclassic_ReadDataBlock(4, data);
lucasec 0:4980924c4867 114
lucasec 0:4980924c4867 115 // printf("Seems to be a Mifare Classic card #%lu\r\n", cardid);
lucasec 0:4980924c4867 116 if (success) {
lucasec 0:4980924c4867 117 // Data seems to have been read ... spit it out
lucasec 0:4980924c4867 118 leds = 0x6;
lucasec 0:4980924c4867 119 beep(NOTE_G7, 200);
lucasec 0:4980924c4867 120
lucasec 0:4980924c4867 121 // Display some basic information about the card
lucasec 0:4980924c4867 122 printf("Found an ISO14443A card\r\n");
lucasec 0:4980924c4867 123 printf(" UID Length: %d bytes\r\n", uidLength);
lucasec 0:4980924c4867 124 printf(" UID Value: ");
lucasec 0:4980924c4867 125 rfid.PrintHex(uid, uidLength);
lucasec 0:4980924c4867 126
lucasec 0:4980924c4867 127 printf("Seems to be a Mifare Classic card #%lu\r\n", cardid);
lucasec 0:4980924c4867 128
lucasec 0:4980924c4867 129 printf("Reading Block 4: ");
lucasec 0:4980924c4867 130 rfid.PrintHexChar(data, 16);
lucasec 0:4980924c4867 131 printf("\r\n");
lucasec 0:4980924c4867 132 } else {
lucasec 0:4980924c4867 133 leds = 0x9;
lucasec 0:4980924c4867 134 beep(NOTE_A4, 800);
lucasec 0:4980924c4867 135
lucasec 0:4980924c4867 136 printf("Found an ISO14443A card\r\n");
lucasec 0:4980924c4867 137 printf(" UID Length: %d bytes\r\n", uidLength);
lucasec 0:4980924c4867 138 printf(" UID Value: ");
lucasec 0:4980924c4867 139 rfid.PrintHex(uid, uidLength);
lucasec 0:4980924c4867 140
lucasec 0:4980924c4867 141 printf("Seems to be a Mifare Classic card #%lu\r\n", cardid);
lucasec 0:4980924c4867 142 printf("Ooops ... unable to read the requested block. Try another key?\r\n");
lucasec 0:4980924c4867 143 printf("\r\n");
lucasec 0:4980924c4867 144 }
lucasec 0:4980924c4867 145 } else {
lucasec 0:4980924c4867 146 leds = 0x9;
lucasec 0:4980924c4867 147 beep(NOTE_A4, 800);
lucasec 0:4980924c4867 148
lucasec 0:4980924c4867 149 printf("Found an ISO14443A card\r\n");
lucasec 0:4980924c4867 150 printf(" UID Length: %d bytes\r\n", uidLength);
lucasec 0:4980924c4867 151 printf(" UID Value: ");
lucasec 0:4980924c4867 152 rfid.PrintHex(uid, uidLength);
lucasec 0:4980924c4867 153
lucasec 0:4980924c4867 154 printf("Seems to be a Mifare Classic card #%lu\r\n", cardid);
lucasec 0:4980924c4867 155 printf("Ooops ... authentication failed: Try another key?\r\n");
lucasec 0:4980924c4867 156 printf("\r\n");
lucasec 0:4980924c4867 157 }
lucasec 0:4980924c4867 158 } else {
lucasec 0:4980924c4867 159 leds = 0x9;
lucasec 0:4980924c4867 160 beep(NOTE_A4, 800);
lucasec 0:4980924c4867 161
lucasec 0:4980924c4867 162 printf("Found an ISO14443A card\r\n");
lucasec 0:4980924c4867 163 printf(" UID Length: %d bytes\r\n", uidLength);
lucasec 0:4980924c4867 164 printf(" UID Value: ");
lucasec 0:4980924c4867 165 rfid.PrintHex(uid, uidLength);
lucasec 0:4980924c4867 166
lucasec 0:4980924c4867 167 printf("Unsupported card type\r\n");
lucasec 0:4980924c4867 168 printf("\r\n");
lucasec 0:4980924c4867 169 }
lucasec 0:4980924c4867 170
lucasec 0:4980924c4867 171 wait_ms(200);
lucasec 0:4980924c4867 172 leds = 0;
lucasec 0:4980924c4867 173
lucasec 0:4980924c4867 174 readTimer.reset();
lucasec 0:4980924c4867 175 readTimer.start();
lucasec 0:4980924c4867 176 }
lucasec 0:4980924c4867 177 }