单片机基于ST25DV动态标签的无线通信
在物联网产品的开发过程中物联网设备非接触式向外界提供可变的交换信息非常有必要比如路由器向手机提供可配置的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(iST25DV_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 }