Firmware library for the X-NUCLEO-NFC01A1 Dynamic NFC Tag board.

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.

Firmware Library

Class X_NUCLEO_NFC01A1 is intended to represent the Dynamic NFC Tag Expansion Board with the same name.
It provides an API to access to the M24SR component and to the three onboard LEDs.
It is intentionally implemented as a singleton because only one X_NUCLEO_NFC01A1 at a time might be deployed in a HW component stack.
The library also provides an implementation of the NDEF library API for M24SR, providing an simple way to read/write NDEF formatted messages from/to the M24SR dynamic NFC tag.

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Thu Dec 03 14:56:13 2015 +0000
Revision:
1:15d4a123ef6b
Parent:
0:969a2be49f41
Add License

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 1:15d4a123ef6b 1 /**
giovannivisentini 1:15d4a123ef6b 2 ******************************************************************************
giovannivisentini 1:15d4a123ef6b 3 * @file Type4NfcTagSTM24SR.cpp
giovannivisentini 1:15d4a123ef6b 4 * @date 05/11/2015
giovannivisentini 1:15d4a123ef6b 5 * @brief wrapper class for use the NDefLib library for write/read ndef message
giovannivisentini 1:15d4a123ef6b 6 ******************************************************************************
giovannivisentini 1:15d4a123ef6b 7 *
giovannivisentini 1:15d4a123ef6b 8 * COPYRIGHT(c) 2015 STMicroelectronics
giovannivisentini 1:15d4a123ef6b 9 *
giovannivisentini 1:15d4a123ef6b 10 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 1:15d4a123ef6b 11 * are permitted provided that the following conditions are met:
giovannivisentini 1:15d4a123ef6b 12 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 1:15d4a123ef6b 13 * this list of conditions and the following disclaimer.
giovannivisentini 1:15d4a123ef6b 14 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 1:15d4a123ef6b 15 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 1:15d4a123ef6b 16 * and/or other materials provided with the distribution.
giovannivisentini 1:15d4a123ef6b 17 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 1:15d4a123ef6b 18 * may be used to endorse or promote products derived from this software
giovannivisentini 1:15d4a123ef6b 19 * without specific prior written permission.
giovannivisentini 1:15d4a123ef6b 20 *
giovannivisentini 1:15d4a123ef6b 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 1:15d4a123ef6b 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 1:15d4a123ef6b 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 1:15d4a123ef6b 24 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 1:15d4a123ef6b 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 1:15d4a123ef6b 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 1:15d4a123ef6b 27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 1:15d4a123ef6b 28 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 1:15d4a123ef6b 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 1:15d4a123ef6b 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 1:15d4a123ef6b 31 *
giovannivisentini 1:15d4a123ef6b 32 ******************************************************************************
giovannivisentini 1:15d4a123ef6b 33 */
giovannivisentini 0:969a2be49f41 34
giovannivisentini 0:969a2be49f41 35 #include <Type4NfcTagSTM24SR.h>
giovannivisentini 0:969a2be49f41 36
giovannivisentini 0:969a2be49f41 37 /* wait 1sec, driver is configured to let 200ms for command to complete */
giovannivisentini 0:969a2be49f41 38 /* which is enough for all commands except GetSession if RF session is already opened */
giovannivisentini 0:969a2be49f41 39 /* Smartphone generaly release the session within the second, but customer can modify this value */
giovannivisentini 0:969a2be49f41 40 #define OPENSESSION_NTRIALS 5
giovannivisentini 0:969a2be49f41 41
giovannivisentini 0:969a2be49f41 42 #define CC_FILE_LENGTH_BYTE 15
giovannivisentini 0:969a2be49f41 43
giovannivisentini 0:969a2be49f41 44 bool Type4NfcTagSTM24SR::openSession(bool force) {
giovannivisentini 0:969a2be49f41 45
giovannivisentini 0:969a2be49f41 46 if (isSessionOpen())
giovannivisentini 0:969a2be49f41 47 return true;
giovannivisentini 0:969a2be49f41 48 //else
giovannivisentini 0:969a2be49f41 49 if (force)
giovannivisentini 0:969a2be49f41 50 mDevice.KillSession();
giovannivisentini 0:969a2be49f41 51
giovannivisentini 0:969a2be49f41 52 int8_t nTrials = OPENSESSION_NTRIALS;
giovannivisentini 0:969a2be49f41 53 NFC_StatusTypeDef status = NFC_ERROR;
giovannivisentini 0:969a2be49f41 54 while (status != NFC_SUCCESS && nTrials) {
giovannivisentini 0:969a2be49f41 55 status = mDevice.GetSession();
giovannivisentini 0:969a2be49f41 56 nTrials--;
giovannivisentini 0:969a2be49f41 57 }
giovannivisentini 0:969a2be49f41 58
giovannivisentini 0:969a2be49f41 59 if (status != NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 60 return false;
giovannivisentini 0:969a2be49f41 61 } //else
giovannivisentini 0:969a2be49f41 62
giovannivisentini 0:969a2be49f41 63 //Select the NFC type 4 application
giovannivisentini 0:969a2be49f41 64 if (mDevice.SelectApplication() != NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 65 return false;
giovannivisentini 0:969a2be49f41 66
giovannivisentini 0:969a2be49f41 67 if (mDevice.SelectCCfile() != NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 68 return false;
giovannivisentini 0:969a2be49f41 69
giovannivisentini 0:969a2be49f41 70 uint8_t CCFile[CC_FILE_LENGTH_BYTE];
giovannivisentini 0:969a2be49f41 71 /* read the first 15 bytes of the CC file */
giovannivisentini 0:969a2be49f41 72 if (mDevice.ReadBinary(0x0000, CC_FILE_LENGTH_BYTE, CCFile) != NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 73 return false;
giovannivisentini 0:969a2be49f41 74
giovannivisentini 0:969a2be49f41 75 //read the ndefFileId
giovannivisentini 0:969a2be49f41 76 uint16_t ndefFileId = (uint16_t) ((CCFile[0x09] << 8) | CCFile[0x0A]);
giovannivisentini 0:969a2be49f41 77 mMaxReadBytes = (uint16_t) ((CCFile[0x03] << 8) | CCFile[0x04]);
giovannivisentini 0:969a2be49f41 78 mMaxWriteBytes = (uint16_t) ((CCFile[0x05] << 8) | CCFile[0x06]);
giovannivisentini 0:969a2be49f41 79
giovannivisentini 0:969a2be49f41 80 //openit
giovannivisentini 0:969a2be49f41 81 if (mDevice.SelectNDEFfile(ndefFileId) != NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 82 return false;
giovannivisentini 0:969a2be49f41 83
giovannivisentini 0:969a2be49f41 84 Type4NfcTag::openSession();
giovannivisentini 0:969a2be49f41 85 return true;
giovannivisentini 0:969a2be49f41 86 }
giovannivisentini 0:969a2be49f41 87
giovannivisentini 0:969a2be49f41 88 bool Type4NfcTagSTM24SR::closeSession() {
giovannivisentini 0:969a2be49f41 89
giovannivisentini 0:969a2be49f41 90 //no open session
giovannivisentini 0:969a2be49f41 91 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 92 return true;
giovannivisentini 0:969a2be49f41 93
giovannivisentini 0:969a2be49f41 94 //close the CC file
giovannivisentini 0:969a2be49f41 95 if (mDevice.Deselect() != NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 96 return false;
giovannivisentini 0:969a2be49f41 97
giovannivisentini 0:969a2be49f41 98 Type4NfcTag::closeSession();
giovannivisentini 0:969a2be49f41 99 return true;
giovannivisentini 0:969a2be49f41 100 }
giovannivisentini 0:969a2be49f41 101
giovannivisentini 0:969a2be49f41 102 bool Type4NfcTagSTM24SR::writeByte(const uint8_t *buffer, uint16_t length, uint16_t offset) {
giovannivisentini 0:969a2be49f41 103
giovannivisentini 0:969a2be49f41 104 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 105 bool prevSessionStatus = isSessionOpen();
giovannivisentini 0:969a2be49f41 106 if (!prevSessionStatus) {
giovannivisentini 0:969a2be49f41 107 //try to acquire a session or fail
giovannivisentini 0:969a2be49f41 108 if (openSession(false))
giovannivisentini 0:969a2be49f41 109 return false;
giovannivisentini 0:969a2be49f41 110 } //if
giovannivisentini 0:969a2be49f41 111
giovannivisentini 0:969a2be49f41 112 if (length > mMaxWriteBytes) {
giovannivisentini 0:969a2be49f41 113 do {
giovannivisentini 0:969a2be49f41 114 status = mDevice.UpdateBinary(offset, mMaxWriteBytes,(uint8_t*) buffer);
giovannivisentini 0:969a2be49f41 115 offset += mMaxWriteBytes;
giovannivisentini 0:969a2be49f41 116 buffer += mMaxWriteBytes;
giovannivisentini 0:969a2be49f41 117 length -= mMaxWriteBytes;
giovannivisentini 0:969a2be49f41 118 } while (length > mMaxWriteBytes && status == NFC_SUCCESS);
giovannivisentini 0:969a2be49f41 119 } //if
giovannivisentini 0:969a2be49f41 120
giovannivisentini 0:969a2be49f41 121 //finish to write the buffer
giovannivisentini 0:969a2be49f41 122 if (status == NFC_SUCCESS && mMaxWriteBytes)
giovannivisentini 0:969a2be49f41 123 status = mDevice.UpdateBinary(offset, length,(uint8_t*) buffer);
giovannivisentini 0:969a2be49f41 124
giovannivisentini 0:969a2be49f41 125 if (status == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 126 if (!prevSessionStatus) // if the session was closed, try close it
giovannivisentini 0:969a2be49f41 127 return closeSession();
giovannivisentini 0:969a2be49f41 128 else
giovannivisentini 0:969a2be49f41 129 return true;
giovannivisentini 0:969a2be49f41 130 } else
giovannivisentini 0:969a2be49f41 131 return false;
giovannivisentini 0:969a2be49f41 132 }
giovannivisentini 0:969a2be49f41 133
giovannivisentini 0:969a2be49f41 134 bool Type4NfcTagSTM24SR::readByte(uint16_t byteOffset, uint16_t byteLength,
giovannivisentini 0:969a2be49f41 135 uint8_t *buffer) {
giovannivisentini 0:969a2be49f41 136 NFC_StatusTypeDef status = NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 137 uint16_t offset = byteOffset;
giovannivisentini 0:969a2be49f41 138 if (byteLength > mMaxReadBytes) {
giovannivisentini 0:969a2be49f41 139 do {
giovannivisentini 0:969a2be49f41 140 status = mDevice.ReadBinary(offset, mMaxReadBytes, buffer);
giovannivisentini 0:969a2be49f41 141 offset += mMaxReadBytes;
giovannivisentini 0:969a2be49f41 142 buffer += mMaxReadBytes;
giovannivisentini 0:969a2be49f41 143 byteLength -= mMaxReadBytes;
giovannivisentini 0:969a2be49f41 144 } while (byteLength > mMaxWriteBytes && status == NFC_SUCCESS);
giovannivisentini 0:969a2be49f41 145 } //if
giovannivisentini 0:969a2be49f41 146 //finish to write the buffer
giovannivisentini 0:969a2be49f41 147 if (status == NFC_SUCCESS && mMaxWriteBytes)
giovannivisentini 0:969a2be49f41 148 status = mDevice.ReadBinary(offset, byteLength, buffer);
giovannivisentini 0:969a2be49f41 149
giovannivisentini 0:969a2be49f41 150 return status == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 151 }
giovannivisentini 0:969a2be49f41 152