This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Fri Nov 27 15:10:25 2015 +0000
Revision:
1:6d202b62ed68
Parent:
0:674813bd5ec9
Child:
2:0648c1561eb2
add the enable/disable read/write function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:674813bd5ec9 1 /*
giovannivisentini 0:674813bd5ec9 2 * Type4NfcTagSTM24SR.cpp
giovannivisentini 0:674813bd5ec9 3 *
giovannivisentini 0:674813bd5ec9 4 * Created on: Nov 5, 2015
giovannivisentini 0:674813bd5ec9 5 * Author: giovanni visentini
giovannivisentini 0:674813bd5ec9 6 */
giovannivisentini 0:674813bd5ec9 7
giovannivisentini 0:674813bd5ec9 8 #include <Type4NfcTagSTM24SR.h>
giovannivisentini 0:674813bd5ec9 9
giovannivisentini 0:674813bd5ec9 10 /* wait 1sec, driver is configured to let 200ms for command to complete */
giovannivisentini 0:674813bd5ec9 11 /* which is enough for all commands except GetSession if RF session is already opened */
giovannivisentini 0:674813bd5ec9 12 /* Smartphone generaly release the session within the second, but customer can modify this value */
giovannivisentini 0:674813bd5ec9 13 #define OPENSESSION_NTRIALS 5
giovannivisentini 0:674813bd5ec9 14
giovannivisentini 0:674813bd5ec9 15 #define CC_FILE_LENGTH_BYTE 15
giovannivisentini 0:674813bd5ec9 16
giovannivisentini 1:6d202b62ed68 17 bool Type4NfcTagSTM24SR::openSession(bool force) {
giovannivisentini 0:674813bd5ec9 18
giovannivisentini 1:6d202b62ed68 19 if (mSessionIsOpen)
giovannivisentini 0:674813bd5ec9 20 return true;
giovannivisentini 0:674813bd5ec9 21 //else
giovannivisentini 1:6d202b62ed68 22 if (force)
giovannivisentini 0:674813bd5ec9 23 mDevice.KillSession();
giovannivisentini 0:674813bd5ec9 24
giovannivisentini 1:6d202b62ed68 25 int8_t nTrials = OPENSESSION_NTRIALS;
giovannivisentini 0:674813bd5ec9 26 NFC_StatusTypeDef status = NFC_ERROR;
giovannivisentini 1:6d202b62ed68 27 while (status != NFC_SUCCESS && nTrials) {
giovannivisentini 1:6d202b62ed68 28 status = mDevice.GetSession();
giovannivisentini 0:674813bd5ec9 29 nTrials--;
giovannivisentini 0:674813bd5ec9 30 }
giovannivisentini 0:674813bd5ec9 31
giovannivisentini 1:6d202b62ed68 32 if (status != NFC_SUCCESS) {
giovannivisentini 0:674813bd5ec9 33 return false;
giovannivisentini 1:6d202b62ed68 34 } //else
giovannivisentini 0:674813bd5ec9 35
giovannivisentini 0:674813bd5ec9 36 //Select the NFC type 4 application
giovannivisentini 1:6d202b62ed68 37 if (mDevice.SelectApplication() != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 38 return false;
giovannivisentini 0:674813bd5ec9 39
giovannivisentini 1:6d202b62ed68 40 if (mDevice.SelectCCfile() != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 41 return false;
giovannivisentini 0:674813bd5ec9 42
giovannivisentini 0:674813bd5ec9 43 uint8_t CCFile[CC_FILE_LENGTH_BYTE];
giovannivisentini 0:674813bd5ec9 44 /* read the first 15 bytes of the CC file */
giovannivisentini 1:6d202b62ed68 45 if (mDevice.ReadBinary(0x0000, CC_FILE_LENGTH_BYTE, CCFile) != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 46 return false;
giovannivisentini 0:674813bd5ec9 47
giovannivisentini 0:674813bd5ec9 48 //read the ndefFileId
giovannivisentini 1:6d202b62ed68 49 uint16_t ndefFileId = (uint16_t) ((CCFile[0x09] << 8) | CCFile[0x0A]);
giovannivisentini 1:6d202b62ed68 50 mMaxReadBytes = (uint16_t) ((CCFile[0x03] << 8) | CCFile[0x04]);
giovannivisentini 1:6d202b62ed68 51 mMaxWriteBytes = (uint16_t) ((CCFile[0x05] << 8) | CCFile[0x06]);
giovannivisentini 0:674813bd5ec9 52
giovannivisentini 0:674813bd5ec9 53 //openit
giovannivisentini 1:6d202b62ed68 54 if (mDevice.SelectNDEFfile(ndefFileId) != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 55 return false;
giovannivisentini 0:674813bd5ec9 56
giovannivisentini 1:6d202b62ed68 57 mSessionIsOpen = true;
giovannivisentini 0:674813bd5ec9 58 return true;
giovannivisentini 0:674813bd5ec9 59 }
giovannivisentini 0:674813bd5ec9 60
giovannivisentini 1:6d202b62ed68 61 bool Type4NfcTagSTM24SR::closeSession() {
giovannivisentini 0:674813bd5ec9 62
giovannivisentini 0:674813bd5ec9 63 //no open session
giovannivisentini 1:6d202b62ed68 64 if (!mSessionIsOpen)
giovannivisentini 0:674813bd5ec9 65 return true;
giovannivisentini 0:674813bd5ec9 66
giovannivisentini 0:674813bd5ec9 67 //close the CC file
giovannivisentini 1:6d202b62ed68 68 if (mDevice.Deselect() != NFC_SUCCESS)
giovannivisentini 0:674813bd5ec9 69 return false;
giovannivisentini 0:674813bd5ec9 70
giovannivisentini 1:6d202b62ed68 71 mSessionIsOpen = false;
giovannivisentini 0:674813bd5ec9 72 return true;
giovannivisentini 0:674813bd5ec9 73 }
giovannivisentini 0:674813bd5ec9 74
giovannivisentini 1:6d202b62ed68 75 bool Type4NfcTagSTM24SR::writeByte(uint8_t *buffer, uint16_t length) {
giovannivisentini 0:674813bd5ec9 76
giovannivisentini 1:6d202b62ed68 77 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 78 uint16_t offset = 0;
giovannivisentini 0:674813bd5ec9 79 bool prevSessionStatus = mSessionIsOpen;
giovannivisentini 1:6d202b62ed68 80 if (!prevSessionStatus) {
giovannivisentini 0:674813bd5ec9 81 //try to acquire a session or fail
giovannivisentini 1:6d202b62ed68 82 if (openSession(false))
giovannivisentini 0:674813bd5ec9 83 return false;
giovannivisentini 1:6d202b62ed68 84 } //if
giovannivisentini 0:674813bd5ec9 85
giovannivisentini 1:6d202b62ed68 86 if (length > mMaxWriteBytes) {
giovannivisentini 1:6d202b62ed68 87 do {
giovannivisentini 1:6d202b62ed68 88 status = mDevice.UpdateBinary(offset, mMaxWriteBytes, buffer);
giovannivisentini 0:674813bd5ec9 89 offset += mMaxWriteBytes;
giovannivisentini 0:674813bd5ec9 90 buffer += mMaxWriteBytes;
giovannivisentini 0:674813bd5ec9 91 length -= mMaxWriteBytes;
giovannivisentini 1:6d202b62ed68 92 } while (length > mMaxWriteBytes && status == NFC_SUCCESS);
giovannivisentini 1:6d202b62ed68 93 } //if
giovannivisentini 0:674813bd5ec9 94
giovannivisentini 0:674813bd5ec9 95 //finish to write the buffer
giovannivisentini 1:6d202b62ed68 96 if (status == NFC_SUCCESS && mMaxWriteBytes)
giovannivisentini 1:6d202b62ed68 97 status = mDevice.UpdateBinary(offset, length, buffer);
giovannivisentini 0:674813bd5ec9 98
giovannivisentini 1:6d202b62ed68 99 if (status == NFC_SUCCESS) {
giovannivisentini 1:6d202b62ed68 100 if (!prevSessionStatus) // if the session was closed, try close it
giovannivisentini 0:674813bd5ec9 101 return closeSession();
giovannivisentini 0:674813bd5ec9 102 else
giovannivisentini 0:674813bd5ec9 103 return true;
giovannivisentini 1:6d202b62ed68 104 } else
giovannivisentini 0:674813bd5ec9 105 return false;
giovannivisentini 0:674813bd5ec9 106 }
giovannivisentini 0:674813bd5ec9 107
giovannivisentini 1:6d202b62ed68 108 bool Type4NfcTagSTM24SR::readByte(uint16_t byteOffset, uint16_t byteLength,
giovannivisentini 1:6d202b62ed68 109 uint8_t *buffer) {
giovannivisentini 1:6d202b62ed68 110 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 111 uint16_t offset = byteOffset;
giovannivisentini 1:6d202b62ed68 112 if (byteLength > mMaxReadBytes) {
giovannivisentini 1:6d202b62ed68 113 do {
giovannivisentini 1:6d202b62ed68 114 status = mDevice.ReadBinary(offset, mMaxReadBytes, buffer);
giovannivisentini 1:6d202b62ed68 115 offset += mMaxReadBytes;
giovannivisentini 1:6d202b62ed68 116 buffer += mMaxReadBytes;
giovannivisentini 1:6d202b62ed68 117 byteLength -= mMaxReadBytes;
giovannivisentini 1:6d202b62ed68 118 } while (byteLength > mMaxWriteBytes && status == NFC_SUCCESS);
giovannivisentini 1:6d202b62ed68 119 } //if
giovannivisentini 1:6d202b62ed68 120 //finish to write the buffer
giovannivisentini 1:6d202b62ed68 121 if (status == NFC_SUCCESS && mMaxWriteBytes)
giovannivisentini 1:6d202b62ed68 122 status = mDevice.ReadBinary(offset, byteLength, buffer);
giovannivisentini 1:6d202b62ed68 123
giovannivisentini 1:6d202b62ed68 124 return status == NFC_SUCCESS;
giovannivisentini 1:6d202b62ed68 125 }
giovannivisentini 1:6d202b62ed68 126