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:
Tue Jan 19 08:08:00 2016 +0000
Revision:
16:b0d62f4b185a
Parent:
12:d1f5eaa85deb
Child:
19:0b65a5813059
more roubust interrupt handle

Who changed what in which revision?

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