ST25DV NFC调试记录

文章讲述了在STM32微控制器上进行NFC硬件层适配,包括IIC驱动的初始化和时序实现。接着介绍了如何按照NFC标准写入NDEF数据到EEPROM,并提到了FTM模式用于MCU与手机的直接通信,强调了FTM库移植和CRC实现的重要性。最后,指出ST25DV库的一个潜在问题在于读取内存大小的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        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;
}
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值