Porting from Arduino Platform to mbed KL25Z. Original Source: https://github.com/adafruit/Adafruit-PN532
Fork of readMifare by
Diff: main.cpp
- Revision:
- 0:54bf4b21c7fa
- Child:
- 1:fb72a2f7cab5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Sep 19 05:04:15 2014 +0000 @@ -0,0 +1,201 @@ +// readMifare code adapted from Adafruit-PN532 library. +// see: https://github.com/adafruit/Adafruit-PN532 +// +// Original Author : Adafruit Industries +// Modified By : Ben Zhang <benzh@eecs.berkeley.edu> +// Date : 2014/09/17 + +/**************************************************************************/ +/*! + This example will wait for any ISO14443A card or tag, and + depending on the size of the UID will attempt to read from it. + + If the card has a 4-byte UID it is probably a Mifare + Classic card, and the following steps are taken: + + - Authenticate block 4 (the first block of Sector 1) using + the default KEYA of 0XFF 0XFF 0XFF 0XFF 0XFF 0XFF + - If authentication succeeds, we can then read any of the + 4 blocks in that sector (though only block 4 is read here) + + If the card has a 7-byte UID it is probably a Mifare + Ultralight card, and the 4 byte pages can be read directly. + Page 4 is read by default since this is the first 'general- + purpose' page on the tags. + + +This is an example sketch for the Adafruit PN532 NFC/RFID breakout boards +This library works with the Adafruit NFC breakout + ----> https://www.adafruit.com/products/364 + +Check out the links above for our tutorials and wiring diagrams +These chips use SPI to communicate, 4 required to interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +*/ +/**************************************************************************/ + +#include "mbed.h" +#include "Adafruit_PN532.h" + +#define SS PTD0 +// PTD1 is also LED_BLUE +#define SCK PTD1 +#define MOSI PTD2 +#define MISO PTD3 + +DigitalOut red(LED_RED); +DigitalOut green(LED_GREEN); + +Serial pc(USBTX, USBRX); +Adafruit_PN532 nfc(SCK, MISO, MOSI, SS); + +void loop(void); + +int main() { + pc.printf("Hello!\n"); + // By default, red + green = 1; red = 0; + + + nfc.begin(); + + uint32_t versiondata = nfc.getFirmwareVersion(); + if (! versiondata) { + pc.printf("Didn't find PN53x board"); + while (1); // halt + } + // Got ok data, print it out! + pc.printf("Found chip PN5%2X with Firmware ver. %d.%d\n", + versiondata >> 24, + (versiondata >> 16) & 0xFF, + (versiondata >> 8) & 0xFF); + + // configure board to read RFID tags + nfc.SAMConfig(); + + pc.printf("Waiting for an ISO14443A Card ...\n"); + + while(1) { loop(); } +} + + +void loop(void) { + // Turn back to red + green = 1; red = 0; + + uint8_t success; + uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // Buffer to store the returned UID + uint8_t uidLength; // Length of the UID (4 or 7 bytes depending on ISO14443A card type) + + // Wait for an ISO14443A type cards (Mifare, etc.). When one is found + // 'uid' will be populated with the UID, and uidLength will indicate + // if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight) + success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); + + if (success) { + // Turn off to indicate Card swipe + green = 1; red = 1; + // Display some basic information about the card + pc.printf("\n\nFound an ISO14443A card\n"); + pc.printf(" UID Length: %d bytes", uidLength); + pc.printf(" UID Value: "); + nfc.PrintHex(uid, uidLength); + pc.printf("\n"); + + if (uidLength == 4) + { + // We probably have a Mifare Classic card ... + pc.printf("Seems to be a Mifare Classic card (4 byte UID)\n"); + + // Now we need to try to authenticate it for read/write access + // Try with the factory default KeyA: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF + pc.printf("Trying to authenticate block 4 with default KEYA value\n"); + uint8_t keya[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + + // Start with block 4 (the first block of sector 1) since sector 0 + // contains the manufacturer data and it's probably better just + // to leave it alone unless you know what you're doing + success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 4, 0, keya); + + if (success) + { + // Turn green to indicate success + green = 0; red = 1; + pc.printf("Sector 1 (Blocks 4..7) has been authenticated\n"); + uint8_t data[16]; + + // If you want to write something to block 4 to test with, remove + // the definition of data above, and uncomment the following lines + /************************************************************************ + uint8_t data[16] = { 'b', 'e', 'n', ' ', 'z', 'h', 'a', 'n', 'g' }; + success = nfc.mifareclassic_WriteDataBlock (4, data); + if (success) + { + // Data seems to have been read ... spit it out + pc.printf("Data Written to Block 4:\n\t"); + nfc.PrintHexChar(data, 16); + pc.printf("\n"); + + // Wait a bit before reading the card again + wait(1); + } + else + { + pc.printf("Ooops ... unable to write the requested block.\n"); + } + return; + ************************************************************************/ + + // Try to read the contents of block 4 + success = nfc.mifareclassic_ReadDataBlock(4, data); + + if (success) + { + // Data seems to have been read ... spit it out + pc.printf("Reading Block 4:\n\t"); + nfc.PrintHexChar(data, 16); + pc.printf("\n"); + + // Wait a bit before reading the card again + wait(1); + } + else + { + pc.printf("Ooops ... unable to read the requested block. Try another key?\n"); + } + } + else + { + pc.printf("Ooops ... authentication failed: Try another key?\n"); + } + } + + if (uidLength == 7) + { + // We probably have a Mifare Ultralight card ... + pc.printf("Seems to be a Mifare Ultralight tag (7 byte UID)\n"); + + // Try to read the first general-purpose user page (#4) + pc.printf("Reading page 4\n"); + uint8_t data[32]; + success = nfc.mifareultralight_ReadPage (4, data); + if (success) + { + // Data seems to have been read ... spit it out + nfc.PrintHexChar(data, 4); + pc.printf("\n"); + + // Wait a bit before reading the card again + wait(1); + } + else + { + pc.printf("Ooops ... unable to read the requested page!?\n"); + } + } + } +} \ No newline at end of file