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 .

Revision:
0:674813bd5ec9
Child:
1:6d202b62ed68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Type4NfcTagSTM24SR.cpp	Thu Nov 19 08:50:18 2015 +0000
@@ -0,0 +1,110 @@
+/*
+ * Type4NfcTagSTM24SR.cpp
+ *
+ *  Created on: Nov 5, 2015
+ *      Author: giovanni visentini
+ */
+
+#include <Type4NfcTagSTM24SR.h>
+
+/* wait 1sec, driver is configured to let 200ms for command to complete */
+/* which is enough for all commands except GetSession if RF session is already opened */
+/* Smartphone generaly release the session within the second, but customer can modify this value */
+#define OPENSESSION_NTRIALS 5
+
+#define CC_FILE_LENGTH_BYTE 15
+
+bool Type4NfcTagSTM24SR::openSession(bool force){
+
+	if(mSessionIsOpen)
+		return true;
+	//else
+	if(force)
+		mDevice.KillSession();
+
+
+	int8_t nTrials=OPENSESSION_NTRIALS;
+	NFC_StatusTypeDef status = NFC_ERROR;
+	while(status != NFC_OK && nTrials){
+		status = mDevice.GetSession( );
+		nTrials--;
+	}
+
+	if (status != NFC_OK){
+		return false;
+	}//else
+
+	//Select the NFC type 4 application
+	if(mDevice.SelectApplication()!=NFC_OK)
+		return false;
+
+	if(mDevice.SelectCCfile()!=NFC_OK)
+		return false;
+
+	uint8_t CCFile[CC_FILE_LENGTH_BYTE];
+	/* read the first 15 bytes of the CC file */
+	if(mDevice.ReadBinary(0x0000,CC_FILE_LENGTH_BYTE,CCFile)!=NFC_OK)
+		return false;
+
+	//read the ndefFileId
+	uint16_t ndefFileId = (uint16_t) ((CCFile[0x09]<<8) | CCFile[0x0A]);
+	mMaxReadBytes = (uint16_t) ((CCFile[0x03]<<8) | CCFile[0x04]);
+	mMaxWriteBytes =(uint16_t) ((CCFile[0x05]<<8) | CCFile[0x06]);
+
+	//openit
+	if(mDevice.SelectNDEFfile(ndefFileId)!=NFC_OK)
+		return false;
+
+	mSessionIsOpen=true;
+	return true;
+}
+
+
+bool Type4NfcTagSTM24SR::closeSession(){
+
+	//no open session
+	if(!mSessionIsOpen)
+		return true;
+
+	//close the CC file
+	if(mDevice.Deselect()!=NFC_OK)
+		return false;
+
+	mSessionIsOpen=false;
+	return true;
+}
+
+bool Type4NfcTagSTM24SR::writeByte(uint8_t *buffer,uint16_t length){
+
+	NFC_StatusTypeDef status=NFC_OK;
+	uint16_t offset=0;
+	bool prevSessionStatus = mSessionIsOpen;
+	if(!prevSessionStatus){
+		//try to acquire a session or fail
+		if(openSession(false))
+			return false;
+	}//if
+
+	if( length > mMaxWriteBytes){
+		do{
+			status = mDevice.UpdateBinary (  offset, mMaxWriteBytes , buffer);
+			offset += mMaxWriteBytes;
+			buffer += mMaxWriteBytes;
+			length -= mMaxWriteBytes;
+		}while( length > mMaxWriteBytes && status == NFC_OK);
+	}//if
+
+	//finish to write the buffer
+	if( status == NFC_OK && mMaxWriteBytes)
+		status = mDevice.UpdateBinary (  offset,length  , buffer);
+
+	if(status==NFC_OK){
+		if(!prevSessionStatus) // if the session was closed, try close it
+			return closeSession();
+		else
+			return true;
+	}else
+		return false;
+
+}
+