在物联网产品的开发过程中,物联网设备非接触式向外界提供可变的交换信息非常有必要,
比如路由器向手机提供可配置的WiFi信息,巡检点向手机提供动态的传感器数据等等。
该系列是在高频率范围 (13.56 MHz) 内运行的NFC Forum Type 5动态标签。利用I2C有线链路,任何NFC智能手机或NFC/RFID HF专业读卡器以及MCU均可以访问存储在这些标签中的数据。
ST25DV-I2C标签提供快写、快速传输模式、增强I²C功能、能量捕获、低功耗模式以及密码保护。这些标签的集成度和性价比极高,可提供丰富的功能集,适用于各种应用。
此外,开发人员可从评估板、软件工具、移动应用和其他资源构成的完整生态系统中受益,从而加快应用开发速度。
基于stm32f2使用硬件i2c将st25dv当做一个eeprom与外界交换数据。
#ifndef __DYNAMIC_LABEL_H__
#define __DYNAMIC_LABEL_H__
#include "st25dv.h"
#include "tagtype5_wrapper.h"
#include "lib_NDEF_Text.h"
#include "comtypes.h"
void Dynamic_Label_Init(void);
void Dynamic_Label_Get_UID(uint8_t*data,uint8_t len);
void Dynamic_Label_Write(uint8_t*data,uint8_t len);
void Dynamic_Label_Read(uint8_t*data,uint8_t*len);
#endif
#include "dynamic_label.h"
#define RW_RETRY_CNT (10)
//开关使能
#define DYLA_ENABLE
__IO BOOLEAN is_i2c2_init = FALSE;
//复用nfc lable为eeprom存储系统信息
//初始化st25dv并配置协议ISO 15693 and NFC T5T
void Dynamic_Label_Init(void)
{
#ifdef DYLA_ENABLE
ST25DV_PROTECTION_ZONE i;
ST25DV_RF_PROT_ZONE RfProtZone;
//Init ST25DV driver
while( BSP_NFCTAG_Init( ) != NFCTAG_OK );
// Reset Mailbox enable to allow write to EEPROM
BSP_NFCTAG_GetExtended_Drv()->ResetMBEN_Dyn( );
// Check if no NDEF detected, init mem in Tag Type 5
if( NfcType5_NDEFDetection( ) != NDEF_OK )
{
CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE;
CCFileStruct.Version = NFCT5_VERSION_V1_0;
CCFileStruct.MemorySize = ( ST25DV_MAX_SIZE / 8 ) & 0xFF;
CCFileStruct.TT5Tag = 0x05;
// Init of the Type Tag 5 component (M24LR)
while( NfcType5_TT5Init( ) != NFCTAG_OK );
}
//开RF只读保护,最好还要加密码
RfProtZone.PasswdCtrl = ST25DV_NOT_PROTECTED;
RfProtZone.RWprotection = ST25DV_READ_PROT;
for(i=ST25DV_PROT_ZONE1;i <= ST25DV_PROT_ZONE4;i++)
{
BSP_NFCTAG_GetExtended_Drv()->WriteRFZxSS(i,RfProtZone);
}
is_i2c2_init = TRUE;
#endif
}
//获取NFC的UID,用于发现识别
void Dynamic_Label_Get_UID(uint8_t*data,uint8_t len)
{
#ifdef DYLA_ENABLE
ST25DV_UID uid;
if(len != 8) return;
if(BSP_NFCTAG_GetExtended_Drv()->ReadUID(&uid) != NFCTAG_OK) return;
data[0] = uid.MsbUid >> 24;
data[1] = uid.MsbUid >> 16;
data[2] = uid.MsbUid >> 8;
data[3] = uid.MsbUid & 0xFF;
data[4] = uid.LsbUid >> 24;
data[5] = uid.LsbUid >> 16;
data[6] = uid.LsbUid >> 8;
data[7] = uid.LsbUid & 0xFF;
#endif
}
//以NDEF消息方式向NFC片内EEPROM写入数据
void Dynamic_Label_Write(uint8_t*data,uint8_t len)
{
#ifdef DYLA_ENABLE
uint8_t cnt = 0;
while(NDEF_WriteText(data,len) != NDEF_OK && cnt < RW_RETRY_CNT)
{
HAL_Delay(100);
cnt++;
}
#if 0
uint8_t test[30];
NfcTag_ReadNDEF(test);
USART1_SendBuf(test,30);
#endif
#if 0
while(1)
{
uint8_t content[128];
uint8_t contentlen = 0;
memset(content,0,sizeof(content));
Dynamic_Label_Read(content,&contentlen);
USART1_SendBuf(content,contentlen);
HAL_Delay(1000);
}
#endif
#endif
}
//读取NFC片内数据
void Dynamic_Label_Read(uint8_t*data,uint8_t*len)
{
#ifdef DYLA_ENABLE
uint8_t cnt = 0;
while(NfcTag_ReadNDEF_New(data,len) != NDEF_OK && cnt < RW_RETRY_CNT)
{
HAL_Delay(100);
cnt++;
}
#endif
}