Hello NFC enthusiasts,
The following topics will be covered in this document:
This document will be segmented into three parts:
Description.
The purpose of this project is to copy the information stored from one tag to another by making use of GPIOs to decide which tag to copy from. This way, topics such as read and write NDEF, card activation and GPIOs will be implemented.
Software configuration section:
This demonstration is based on NXP NFC Reader Library v05.02.00, NfcrdlibEx3_NFCForum project for PNEV7462B, in which some modifications are going to be made in order to carry this out. These tags are compliant with NFC Forum Type 2 Tag and ISO/IEC14443 Type A specifications.
#define PHAC_DISCLOOP_CFG_MAX_CARDS_SUPPORTED 0x02U
static phStatus_t LoadDiscoveryConfiguration()
{
...
/*Passive max typea devices*/
status = phacDiscLoop_SetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TYPEA_DEVICE_LIMIT, 2);
CHECK_STATUS(status);
}
A fix to the SW stack has to be made (Fix will be implemented in the next release):
open "phacDiscLoop_Sw_Int_A.c", line 511, change if statement as below.
if((pDataParams->sTypeATargetInfo.bTotalTagsFound > 1) && ((bTypeATagIdx) < pDataParams->sTypeATargetInfo.bTotalTagsFound))
/* Local headers */
#include <cards.h>
#include "phhalGpio.h"
#include "NfcrdlibEx3_NFCForum.h"
/*******************************************************************************
** Global Defines
*******************************************************************************/
phacDiscLoop_Sw_DataParams_t * pDiscLoop; /* Discovery loop component */
void * ppalI18092mPI;
void * ppalI18092mT;
void * palTop;
/* Variables and InitGPIOs() needed for this application */
uint8_t bTagState1;
uint8_t* value;
uint8_t* value1;
uint8_t val,val1;
uint16_t NDEFlength = 0;
void InitGPIOs(void);
/*******************************************************************************
** Main Function
*******************************************************************************/
int main (void)
{
/* Initialize section */
value=&val;
value1=&val1;
InitGPIOs();
else if((status & PH_ERR_MASK) == PHAC_DISCLOOP_MULTI_DEVICES_RESOLVED)
{
/*
* Multiple cards resolved. It enters here if DEVICE LIMIT > 1 and more than one devices are
* detected and resolved.
*/
DEBUG_PRINTF (" \n Multiple cards resolved: \n");
/* Get detected technology type */
status = phacDiscLoop_GetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TECH_DETECTED, &wTagsDetected);
CHECK_STATUS(status);
/* Get number of tags detected */
status = phacDiscLoop_GetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_NR_TAGS_FOUND, &wNumberOfTags);
CHECK_STATUS(status);
DEBUG_PRINTF ("\tNumber of tags: %d \n",wNumberOfTags);
/* Tag 1 information */
DEBUG_PRINTF ("\n Tag 1 NDEF information: \n");
status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x00);
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState1);
DEBUG_ERROR_PRINT(status);
status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);
DEBUG_ERROR_PRINT(status);
/* Tag 2 information */
DEBUG_PRINTF ("\n Tag 2 NDEF information: \n");
status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x01);
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState1);
DEBUG_ERROR_PRINT(status);
status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);
DEBUG_ERROR_PRINT(status);
DEBUG_PRINTF (" \n --------------------------------------------------------------------------------------- \n\n");
DEBUG_PRINTF (" \n Options: \n\n");
DEBUG_PRINTF (" \n 1.- Left button -(X)-( )- To copy NDEF message from Tag 1 to Tag 2 \n\n");
DEBUG_PRINTF (" \n 2.- Right button -( )-(X)- To copy NDEF message from Tag 2 to Tag 1 \n\n");
DEBUG_PRINTF (" \n --------------------------------------------------------------------------------------- \n\n");
/* Reading values from GPIOs 2 and 3 */
do
{
phhalPcr_GetGpioVal(2,value);
phhalPcr_GetGpioVal(3,value1);
}while(*value==1 && *value1==1);
/* Copy NDEF content from tag at index 0 to Tag at index 1*/
if(*value==0 && *value1==1)
{
DEBUG_PRINTF (" \n Copy NDEF from Tag 1 to Tag 2 \n");
status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x00);
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState1);
DEBUG_ERROR_PRINT(status);
status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);
DEBUG_ERROR_PRINT(status);
status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x01);
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState1);
DEBUG_ERROR_PRINT(status);
if(bTagState1 == PHAL_TOP_STATE_READWRITE)
{
status = WriteNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);
DEBUG_ERROR_PRINT(status);
}
DEBUG_PRINTF (" \n NDEF from Tag 1 to Tag 2 already copied \n");
}
/* Copy NDEF content from tag at index 1 to Tag at index 0*/
else if(*value==1 && *value1==0)
{
DEBUG_PRINTF (" \n Copy NDEF from Tag 2 to Tag 1 \n");
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState1);
status = ReadNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);
DEBUG_ERROR_PRINT(status);
status = phacDiscLoop_ActivateCard(pDataParams, PHAC_DISCLOOP_TECH_TYPE_A, 0x00);
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState1);
if(bTagState1 == PHAL_TOP_STATE_READWRITE)
{
status = WriteNdefMessage(PHAL_TOP_TAG_TYPE_T2T_TAG);
DEBUG_ERROR_PRINT(status);
}
DEBUG_PRINTF (" \n NDEF from Tag 2 to Tag 1 already copied \n");
}
DEBUG_PRINTF (" \n Please remove the tags \n\n");
DEBUG_PRINTF (" \n Press any button to continue... \n\n");
/* Reading values from GPIOs 2 and 3 */
do
{
phhalPcr_GetGpioVal(2,value);
phhalPcr_GetGpioVal(3,value1);
}while(*value==1 && *value1==1);
/* if(wNumberOfTags > 1)
{
Get 1st detected tag and activate device at index 0
for(bIndex = 0; bIndex < PHAC_DISCLOOP_PASS_POLL_MAX_TECHS_SUPPORTED; bIndex++)
{
if(PHAC_DISCLOOP_CHECK_ANDMASK(wTagsDetected, (1 << bIndex)))
{
DEBUG_PRINTF("\t Activating device @ index 0\n");
status = phacDiscLoop_ActivateCard(pDataParams, bIndex, 0);
break;
}
}
if( ((status & PH_ERR_MASK) == PHAC_DISCLOOP_DEVICE_ACTIVATED) ||
((status & PH_ERR_MASK) == PHAC_DISCLOOP_PASSIVE_TARGET_ACTIVATED))
{
Get detected technology type
status = phacDiscLoop_GetConfig(pDiscLoop, PHAC_DISCLOOP_CONFIG_TECH_DETECTED, &wTagsDetected);
CHECK_STATUS(status);
GetTagInfo(pDataParams, 0x01, wTagsDetected);
DEBUG_PRINTF("\t\t Activation successful\n");
}
else
{
DEBUG_PRINTF("\t\tCard activation failed\n");
}
}*/
/* Switch to LISTEN mode if supported after POLL mode */
}
In NfcrdlibEx3_NFCForum.h declare WriteNdefMessage().
/**
* Write NDEF message to a detected tag.
* */
phStatus_t WriteNdefMessage(
uint8_t TopTagType); /* [in] Tag type to which write NDEF */
In NfcrdlibEx3_NFCForum.c define the function WriteNdefMessage().
/**
* Writes NDEF Message to a tag
*/
phStatus_t WriteNdefMessage(uint8_t TopTagType)
{
phStatus_t status;
uint8_t bTagState;
uint16_t wDataLength = 0;
/* Configure Top layer for specified tag type */
status = phalTop_SetConfig(palTop, PHAL_TOP_CONFIG_TAG_TYPE, TopTagType);
DEBUG_ERROR_PRINT(status);
/* Check for NDEF presence */
status = phalTop_CheckNdef(palTop, &bTagState);
DEBUG_ERROR_PRINT(status);
if(bTagState == PHAL_TOP_STATE_READWRITE)
{
/* Write NDEF message */
status = phalTop_WriteNdef(palTop, baSnepAppBuffer, NDEFlength);
DEBUG_ERROR_PRINT(status);
/* Print NDEF message, if not NULL NDEF */
if(NDEFlength)
{
DEBUG_PRINTF("\tNDEF detected...\n");
DEBUG_PRINTF("\tNDEF length: %d\n", wDataLength);
DEBUG_PRINTF("\tNDEF message:\n");
//DumpBuffer(aData, wDataLength);
DumpBuffer(baSnepAppBuffer, 50);
}
else
{
DEBUG_PRINTF("\tNDEF content is NULL...\n");
}
}
else
{
DEBUG_PRINTF("\tNo NDEF content detected...\n");
}
return status;
}
In NfcrdlibEx3_NFCForum.c define InitGPIOs().
void InitGPIOs(void)
{
phhalPcr_ConfigInput(2,true,false,false,false,true,false);
phhalPcr_ConfigInput(3,true,false,false,false,true,false);
}
Hardware configuration section:
For the Hardware set up, two push buttons will be connected to GPIO_2 and GPIO_3 of PNEV7462B as follows.
Vdd will be connected to 3V3 pin on the board:
GND can be connected to any GND on the board.
Demonstration:
Each tag was previously written with a text NDEF message respectively.
Tag 1:
Text: Tag1
Language: en
Tag 2:
Text: Tag2
Language: en
Writing to a tag can be done by making use of our TagWriter app available in the play store:
NFC TagWriter by NXP - Aplicaciones de Android en Google Play
Please find the modified files attached.
I hope this is of great help!
Best regards,
Ivan.