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
PN532/examples/android_hce/android_hce.ino@0:db8030e71f55, 2016-09-13 (annotated)
- Committer:
- dotnfc
- Date:
- Tue Sep 13 06:01:19 2016 +0000
- Revision:
- 0:db8030e71f55
first commit
Who changed what in which revision?
User | Revision | Line number | New 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 | } |