1、硬件层适配,主要是iic驱动的适配
只要按如下的进行适配相应实现即可
IO.Init = NFCMEM_IO_Init;//iic相关初始化
IO.DeInit = NFCMEM_IO_DeInit;
IO.IsReady = NFCMEM_IO_IsDeviceReady;//iic设备是否ready
IO.Read = NFCMEM_IO_MemRead;//iic read
IO.Write = (ST25DV_Write_Func)NFCMEM_IO_MemWrite;//iic write
IO.GetTick = NFCMEM_IO_Tick;
st有提供了完善的nfc驱动参考,提供的iic实现是基于硬件iic的,要在非st mcu上实现的话需要自行移植实现iic时序
iic 写时序
iic 读时序
iic ready判断
模拟iic通信时io设置为PP输出时可通信,但逻辑分析仪解包异常,修改为OD输出可通信同时逻辑分析仪解包正常。
2、适配iic硬件驱动后按nfc的标准规定NDEF写nfc
NDEF其实是按一定格式组织tlv二进制数据写到eeprom,因此iic驱动没问题后可尝试写入读取验证nfc的eeprom可读可写。
/* 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 = ( ST25DVXXKC_MAX_SIZE / 8 ) & 0xFF;
CCFileStruct.TT5Tag = 0x05;
/* Init of the Type Tag 5 component (M24LR) */
while( NfcType5_TT5Init( ) != NFCTAG_OK );
}
没用到extmemeorysize,因此ST25DVXXKC_MAX_SIZE取值最大0x200,取值更大的话会导致后续NDEF_Write一直失败
3、FTM模式,该模式可以方便直接让mcu和手机等直接相互通信,可以用来传输文件如epaper更新图片显示或者固件升级等作用
st有专门为ftm写了一个ftm协议库,只需移植ftm库后就可以方便的通过手机app和mcu相关通信,ftm移植需要注意crc的实现,同时iic的速率大于200Khz。
4、 st的st25dv库的bug
int32_t ST25DVxxKC_ReadMemSize(const ST25DVxxKC_Object_t *const pObj, ST25DVxxKC_MEM_SIZE_t *const pSizeInfo)
{
uint8_t memsize_msb;
uint8_t memsize_lsb;
int32_t status;
/* Read actual value of MEM_SIZE register */
status = ST25DVxxKC_GetMEM_SIZE_LSB(&(pObj->Ctx), &memsize_lsb);
if(status == NFCTAG_OK)
{
status = ST25DVxxKC_GetMEM_SIZE_MSB(&(pObj->Ctx), &memsize_msb);
if(status == NFCTAG_OK)
{
status = ST25DVxxKC_GetBLK_SIZE(&(pObj->Ctx), &(pSizeInfo->BlockSize));
if(status != NFCTAG_OK)//!=要改为==
{
/* Extract Memory information */
pSizeInfo->Mem_Size = memsize_msb;
pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) |memsize_lsb;
}
}
}
return status;
}