Milan Jovanovic
/
readMifareORG
Test example
Fork of readMifare by
main.cpp@10:1773f3d5bdda, 2016-03-17 (annotated)
- Committer:
- mjovanov1
- Date:
- Thu Mar 17 10:37:02 2016 +0000
- Revision:
- 10:1773f3d5bdda
- Parent:
- 9:be80c24599b5
- Child:
- 11:5e52e43e2977
Chained read
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nebgnahz | 0:54bf4b21c7fa | 1 | #include "mbed.h" |
nebgnahz | 0:54bf4b21c7fa | 2 | #include "Adafruit_PN532.h" |
nebgnahz | 0:54bf4b21c7fa | 3 | |
mjovanov1 | 4:70acff42d8b4 | 4 | #define MOSI p11 |
mjovanov1 | 4:70acff42d8b4 | 5 | #define MISO p12 |
mjovanov1 | 4:70acff42d8b4 | 6 | #define SCK p13 |
mjovanov1 | 4:70acff42d8b4 | 7 | #define SS p20 |
nebgnahz | 0:54bf4b21c7fa | 8 | |
nebgnahz | 0:54bf4b21c7fa | 9 | Serial pc(USBTX, USBRX); |
nebgnahz | 0:54bf4b21c7fa | 10 | Adafruit_PN532 nfc(SCK, MISO, MOSI, SS); |
nebgnahz | 0:54bf4b21c7fa | 11 | |
nebgnahz | 0:54bf4b21c7fa | 12 | void loop(void); |
mjovanov1 | 5:4b238fd5f347 | 13 | int sectorToBlock(int sectorIndex); |
nebgnahz | 0:54bf4b21c7fa | 14 | |
mjovanov1 | 6:9109b95c3e97 | 15 | int main() |
mjovanov1 | 6:9109b95c3e97 | 16 | { |
mjovanov1 | 9:be80c24599b5 | 17 | pc.printf("Hello v1.0!\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 18 | nfc.begin(); |
nebgnahz | 0:54bf4b21c7fa | 19 | |
mjovanov1 | 6:9109b95c3e97 | 20 | uint32_t versiondata = nfc.getFirmwareVersion(); |
mjovanov1 | 6:9109b95c3e97 | 21 | if (! versiondata) { |
mjovanov1 | 6:9109b95c3e97 | 22 | pc.printf("Didn't find PN53x board"); |
mjovanov1 | 6:9109b95c3e97 | 23 | while (1); |
mjovanov1 | 6:9109b95c3e97 | 24 | } |
mjovanov1 | 6:9109b95c3e97 | 25 | |
mjovanov1 | 6:9109b95c3e97 | 26 | pc.printf("Found chip PN5%2X with Firmware ver. %d.%d\r\n", versiondata >> 24, (versiondata >> 16) & 0xFF, (versiondata >> 8) & 0xFF); |
mjovanov1 | 6:9109b95c3e97 | 27 | nfc.SAMConfig(); |
mjovanov1 | 6:9109b95c3e97 | 28 | pc.printf("Waiting for an ISO14443A Card ...\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 29 | |
mjovanov1 | 6:9109b95c3e97 | 30 | while(1) { |
mjovanov1 | 6:9109b95c3e97 | 31 | loop(); |
mjovanov1 | 6:9109b95c3e97 | 32 | } |
nebgnahz | 0:54bf4b21c7fa | 33 | } |
nebgnahz | 0:54bf4b21c7fa | 34 | |
nebgnahz | 0:54bf4b21c7fa | 35 | |
mjovanov1 | 6:9109b95c3e97 | 36 | void loop(void) |
mjovanov1 | 6:9109b95c3e97 | 37 | { |
mjovanov1 | 6:9109b95c3e97 | 38 | uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID |
mjovanov1 | 6:9109b95c3e97 | 39 | uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) |
mjovanov1 | 6:9109b95c3e97 | 40 | int sector = 32; |
mjovanov1 | 6:9109b95c3e97 | 41 | |
mjovanov1 | 6:9109b95c3e97 | 42 | if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength)) { |
mjovanov1 | 6:9109b95c3e97 | 43 | // Display some basic information about the card |
mjovanov1 | 6:9109b95c3e97 | 44 | pc.printf("\r\n\r\nFound an ISO14443A card\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 45 | pc.printf(" UID Length: %d bytes", uidLength); |
mjovanov1 | 6:9109b95c3e97 | 46 | pc.printf(" UID Value: "); |
mjovanov1 | 6:9109b95c3e97 | 47 | nfc.PrintHex(uid, uidLength); |
mjovanov1 | 6:9109b95c3e97 | 48 | pc.printf("\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 49 | |
mjovanov1 | 6:9109b95c3e97 | 50 | if (uidLength == 4) { |
mjovanov1 | 6:9109b95c3e97 | 51 | pc.printf("Seems to be a Mifare Classic card (4 byte UID)\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 52 | pc.printf("Trying to authenticate sector %d with default KEYA value\r\n", sector); |
mjovanov1 | 6:9109b95c3e97 | 53 | uint8_t keya[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 }; |
mjovanov1 | 10:1773f3d5bdda | 54 | int firstBlockInSectorNumber = sectorToBlock(sector); |
mjovanov1 | 10:1773f3d5bdda | 55 | |
mjovanov1 | 10:1773f3d5bdda | 56 | uint8_t buffer[16 * 4]; |
mjovanov1 | 10:1773f3d5bdda | 57 | for(int blockOffset = 0; blockOffset < 4; blockOffset++){ |
mjovanov1 | 10:1773f3d5bdda | 58 | int blockNumber = firstBlockInSectorNumber + blockOffset; |
mjovanov1 | 10:1773f3d5bdda | 59 | int bufferLoc = 16 * blockOffset; |
mjovanov1 | 10:1773f3d5bdda | 60 | |
mjovanov1 | 10:1773f3d5bdda | 61 | if (nfc.mifareclassic_AuthenticateBlock(uid, uidLength, blockNumber, 0, keya)) { |
mjovanov1 | 10:1773f3d5bdda | 62 | uint8_t data[16]; |
mjovanov1 | 10:1773f3d5bdda | 63 | |
mjovanov1 | 10:1773f3d5bdda | 64 | if (nfc.mifareclassic_ReadDataBlock(blockNumber, data)) { |
mjovanov1 | 10:1773f3d5bdda | 65 | // Data seems to have been read ... spit it out |
mjovanov1 | 10:1773f3d5bdda | 66 | pc.printf("Reading Block %d:\r\n\t", blockNumber); |
mjovanov1 | 10:1773f3d5bdda | 67 | memcpy(buffer + bufferLoc, data, 16); |
mjovanov1 | 10:1773f3d5bdda | 68 | |
mjovanov1 | 10:1773f3d5bdda | 69 | // Wait a bit before reading the card again |
mjovanov1 | 10:1773f3d5bdda | 70 | wait(1); |
mjovanov1 | 10:1773f3d5bdda | 71 | } else { |
mjovanov1 | 10:1773f3d5bdda | 72 | pc.printf("Ooops ... unable to read the requested block. Try another key?\r\n"); |
mjovanov1 | 10:1773f3d5bdda | 73 | } |
mjovanov1 | 6:9109b95c3e97 | 74 | } else { |
mjovanov1 | 10:1773f3d5bdda | 75 | pc.printf("Ooops ... authentication failed: Try another key?\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 76 | } |
mjovanov1 | 3:08251c301e26 | 77 | } |
mjovanov1 | 10:1773f3d5bdda | 78 | printf("<FullRead>\r\n"); |
mjovanov1 | 10:1773f3d5bdda | 79 | Adafruit_PN532::PrintHexChar(buffer, 16 * 4); |
mjovanov1 | 10:1773f3d5bdda | 80 | printf("</FullRead>\r\n"); |
mjovanov1 | 6:9109b95c3e97 | 81 | } |
nebgnahz | 0:54bf4b21c7fa | 82 | } |
mjovanov1 | 5:4b238fd5f347 | 83 | } |
mjovanov1 | 6:9109b95c3e97 | 84 | |
mjovanov1 | 6:9109b95c3e97 | 85 | int sectorToBlock(int sectorIndex) |
mjovanov1 | 6:9109b95c3e97 | 86 | { |
mjovanov1 | 5:4b238fd5f347 | 87 | if (sectorIndex < 32) { |
mjovanov1 | 5:4b238fd5f347 | 88 | return sectorIndex * 4; |
mjovanov1 | 5:4b238fd5f347 | 89 | } else { |
mjovanov1 | 5:4b238fd5f347 | 90 | return 32 * 4 + (sectorIndex - 32) * 16; |
mjovanov1 | 5:4b238fd5f347 | 91 | } |
nebgnahz | 0:54bf4b21c7fa | 92 | } |