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
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 .
Type4NfcTagSTM24SR.cpp@1:6d202b62ed68, 2015-11-27 (annotated)
- 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?
| User | Revision | Line number | New 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 |
