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 13:44:06 2015 +0000
Revision:
0:969a2be49f41
Child:
1:15d4a123ef6b
move the driver files in a separate library

Who changed what in which revision?

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