PN532 Driver library This library provides an abstract API to drive the pn532 nfc chip, with I2C/HSU/SPI interface. Its based on the Seeed Studio's Arduino version.

Dependents:   PN532_ReadUid Nfctest2

Committer:
dotnfc
Date:
Tue Sep 13 06:01:19 2016 +0000
Revision:
0:db8030e71f55
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dotnfc 0:db8030e71f55 1 #include <SPI.h>
dotnfc 0:db8030e71f55 2 #include <PN532_SPI.h>
dotnfc 0:db8030e71f55 3 #include <PN532Interface.h>
dotnfc 0:db8030e71f55 4 #include <PN532.h>
dotnfc 0:db8030e71f55 5
dotnfc 0:db8030e71f55 6 PN532_SPI pn532spi(SPI, 10);
dotnfc 0:db8030e71f55 7 PN532 nfc(pn532spi);
dotnfc 0:db8030e71f55 8
dotnfc 0:db8030e71f55 9
dotnfc 0:db8030e71f55 10 void setup()
dotnfc 0:db8030e71f55 11 {
dotnfc 0:db8030e71f55 12 Serial.begin(115200);
dotnfc 0:db8030e71f55 13 Serial.println("-------Peer to Peer HCE--------");
dotnfc 0:db8030e71f55 14
dotnfc 0:db8030e71f55 15 nfc.begin();
dotnfc 0:db8030e71f55 16
dotnfc 0:db8030e71f55 17 uint32_t versiondata = nfc.getFirmwareVersion();
dotnfc 0:db8030e71f55 18 if (! versiondata) {
dotnfc 0:db8030e71f55 19 Serial.print("Didn't find PN53x board");
dotnfc 0:db8030e71f55 20 while (1); // halt
dotnfc 0:db8030e71f55 21 }
dotnfc 0:db8030e71f55 22
dotnfc 0:db8030e71f55 23 // Got ok data, print it out!
dotnfc 0:db8030e71f55 24 Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
dotnfc 0:db8030e71f55 25 Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
dotnfc 0:db8030e71f55 26 Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
dotnfc 0:db8030e71f55 27
dotnfc 0:db8030e71f55 28 // Set the max number of retry attempts to read from a card
dotnfc 0:db8030e71f55 29 // This prevents us from waiting forever for a card, which is
dotnfc 0:db8030e71f55 30 // the default behaviour of the PN532.
dotnfc 0:db8030e71f55 31 //nfc.setPassiveActivationRetries(0xFF);
dotnfc 0:db8030e71f55 32
dotnfc 0:db8030e71f55 33 // configure board to read RFID tags
dotnfc 0:db8030e71f55 34 nfc.SAMConfig();
dotnfc 0:db8030e71f55 35 }
dotnfc 0:db8030e71f55 36
dotnfc 0:db8030e71f55 37 void loop()
dotnfc 0:db8030e71f55 38 {
dotnfc 0:db8030e71f55 39 bool success;
dotnfc 0:db8030e71f55 40
dotnfc 0:db8030e71f55 41 uint8_t responseLength = 32;
dotnfc 0:db8030e71f55 42
dotnfc 0:db8030e71f55 43 Serial.println("Waiting for an ISO14443A card");
dotnfc 0:db8030e71f55 44
dotnfc 0:db8030e71f55 45 // set shield to inListPassiveTarget
dotnfc 0:db8030e71f55 46 success = nfc.inListPassiveTarget();
dotnfc 0:db8030e71f55 47
dotnfc 0:db8030e71f55 48 if(success) {
dotnfc 0:db8030e71f55 49
dotnfc 0:db8030e71f55 50 Serial.println("Found something!");
dotnfc 0:db8030e71f55 51
dotnfc 0:db8030e71f55 52 uint8_t selectApdu[] = { 0x00, /* CLA */
dotnfc 0:db8030e71f55 53 0xA4, /* INS */
dotnfc 0:db8030e71f55 54 0x04, /* P1 */
dotnfc 0:db8030e71f55 55 0x00, /* P2 */
dotnfc 0:db8030e71f55 56 0x07, /* Length of AID */
dotnfc 0:db8030e71f55 57 0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /* AID defined on Android App */
dotnfc 0:db8030e71f55 58 0x00 /* Le */ };
dotnfc 0:db8030e71f55 59
dotnfc 0:db8030e71f55 60 uint8_t response[32];
dotnfc 0:db8030e71f55 61
dotnfc 0:db8030e71f55 62 success = nfc.inDataExchange(selectApdu, sizeof(selectApdu), response, &responseLength);
dotnfc 0:db8030e71f55 63
dotnfc 0:db8030e71f55 64 if(success) {
dotnfc 0:db8030e71f55 65
dotnfc 0:db8030e71f55 66 Serial.print("responseLength: "); Serial.println(responseLength);
dotnfc 0:db8030e71f55 67
dotnfc 0:db8030e71f55 68 nfc.PrintHexChar(response, responseLength);
dotnfc 0:db8030e71f55 69
dotnfc 0:db8030e71f55 70 do {
dotnfc 0:db8030e71f55 71 uint8_t apdu[] = "Hello from Arduino";
dotnfc 0:db8030e71f55 72 uint8_t back[32];
dotnfc 0:db8030e71f55 73 uint8_t length = 32;
dotnfc 0:db8030e71f55 74
dotnfc 0:db8030e71f55 75 success = nfc.inDataExchange(apdu, sizeof(apdu), back, &length);
dotnfc 0:db8030e71f55 76
dotnfc 0:db8030e71f55 77 if(success) {
dotnfc 0:db8030e71f55 78
dotnfc 0:db8030e71f55 79 Serial.print("responseLength: "); Serial.println(length);
dotnfc 0:db8030e71f55 80
dotnfc 0:db8030e71f55 81 nfc.PrintHexChar(back, length);
dotnfc 0:db8030e71f55 82 }
dotnfc 0:db8030e71f55 83 else {
dotnfc 0:db8030e71f55 84
dotnfc 0:db8030e71f55 85 Serial.println("Broken connection?");
dotnfc 0:db8030e71f55 86 }
dotnfc 0:db8030e71f55 87 }
dotnfc 0:db8030e71f55 88 while(success);
dotnfc 0:db8030e71f55 89 }
dotnfc 0:db8030e71f55 90 else {
dotnfc 0:db8030e71f55 91
dotnfc 0:db8030e71f55 92 Serial.println("Failed sending SELECT AID");
dotnfc 0:db8030e71f55 93 }
dotnfc 0:db8030e71f55 94 }
dotnfc 0:db8030e71f55 95 else {
dotnfc 0:db8030e71f55 96
dotnfc 0:db8030e71f55 97 Serial.println("Didn't find anything!");
dotnfc 0:db8030e71f55 98 }
dotnfc 0:db8030e71f55 99
dotnfc 0:db8030e71f55 100 delay(1000);
dotnfc 0:db8030e71f55 101 }
dotnfc 0:db8030e71f55 102
dotnfc 0:db8030e71f55 103 void printResponse(uint8_t *response, uint8_t responseLength) {
dotnfc 0:db8030e71f55 104
dotnfc 0:db8030e71f55 105 String respBuffer;
dotnfc 0:db8030e71f55 106
dotnfc 0:db8030e71f55 107 for (int i = 0; i < responseLength; i++) {
dotnfc 0:db8030e71f55 108
dotnfc 0:db8030e71f55 109 if (response[i] < 0x10)
dotnfc 0:db8030e71f55 110 respBuffer = respBuffer + "0"; //Adds leading zeros if hex value is smaller than 0x10
dotnfc 0:db8030e71f55 111
dotnfc 0:db8030e71f55 112 respBuffer = respBuffer + String(response[i], HEX) + " ";
dotnfc 0:db8030e71f55 113 }
dotnfc 0:db8030e71f55 114
dotnfc 0:db8030e71f55 115 Serial.print("response: "); Serial.println(respBuffer);
dotnfc 0:db8030e71f55 116 }
dotnfc 0:db8030e71f55 117
dotnfc 0:db8030e71f55 118 void setupNFC() {
dotnfc 0:db8030e71f55 119
dotnfc 0:db8030e71f55 120 nfc.begin();
dotnfc 0:db8030e71f55 121
dotnfc 0:db8030e71f55 122 uint32_t versiondata = nfc.getFirmwareVersion();
dotnfc 0:db8030e71f55 123 if (! versiondata) {
dotnfc 0:db8030e71f55 124 Serial.print("Didn't find PN53x board");
dotnfc 0:db8030e71f55 125 while (1); // halt
dotnfc 0:db8030e71f55 126 }
dotnfc 0:db8030e71f55 127
dotnfc 0:db8030e71f55 128 // Got ok data, print it out!
dotnfc 0:db8030e71f55 129 Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
dotnfc 0:db8030e71f55 130 Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
dotnfc 0:db8030e71f55 131 Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
dotnfc 0:db8030e71f55 132
dotnfc 0:db8030e71f55 133 // configure board to read RFID tags
dotnfc 0:db8030e71f55 134 nfc.SAMConfig();
dotnfc 0:db8030e71f55 135 }