我的学号 发表于 2024-10-16 23:43

【Follow me第二季第2期】6.进阶任务之 ST25DV16 NFC 模块的使用

本帖最后由 我的学号 于 2024-10-27 21:34 编辑

<p>本次活动我在 digikey 额外下单的物料之一是来自 Adafruit 的&nbsp;<a href="https://www.adafruit.com/product/4701" target="_blank">ST25DV16K 模块</a>, 这是一款采用来自ST NFC 芯片 ST25DV16K 制作而成的小模块,附带有线圈天线,同时还留有 II2C 通信接口以及 QWIIC 接口,正好能与本次活动的主题 Arduino UR4 配合使用</p>

<p>&nbsp;</p>

<p>正面照</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>背面照:</p>

<p> &nbsp;</p>

<p>下边是一些简单记录:</p>

<p>1..芯片情况</p>

<p>供电电压 1.8V ~5.5V,支持 ISO15693 和 Type5 标签的非接触类通信;按版本不同内部有 16K 或 64K EEPROM 空间,该模块的芯片命名以 16K 为后缀,所以空间大小是 16K</p>

<p>支持 IIC 通信和 RF 接口读写数据,两种通信方式分别有自己的存储空间;可以通过 GPO 引脚触发中断传递消息</p>

<p>框图如下所示:</p>

<p> &nbsp;</p>

<p>PIN 定义</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>指令的详细说明可参考官方文档:&nbsp;<a href="https://www.st.com/en/nfc/st25dv16k.html" target="_blank">ST25DV16K</a></p>

<p>对 ST NFC 芯片系列的认识,可以观看 B站视频:<a href="https://www.bilibili.com/video/BV15e411s7mj/?spm_id_from=333.788.videopod.sections&amp;vd_source=2f4203a5b01983c985b040aa2ec11d35" target="_blank">ST 官方介绍</a></p>

<p>&nbsp;</p>

<p>2.硬件连接</p>

<p>硬件连接可以通过 UR4 上的 QWIIC 接口连接;由硬件原理图分析可知,QWIIC 本质上是 IIC 接口,可极为方便地通过 QWIIC 接线扩展连接各种 IIC 设备</p>

<p>软件实现上 Arduino 将其抽象为 Wire1 模块,而普通的的 IIC 接口用 Wire 模块连接(A4, A5)&nbsp;</p>

<p>Digikey 上 QWIIC 接线偏贵,直接TB 解决就行</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>3.软件开发</p>

<p>Adafruit 的模块介绍里边有例程和简单说明,下载打开后发现是&nbsp;ST 的例程,无法直接和 QWIIC 接口联系起来</p>

<p>一番搜索后,在 SparkFun 上找到了相似的资源:&nbsp;<a href="https://learn.sparkfun.com/tutorials/qwiic-dynamic-nfcrfid-tag-hookup-guide" target="_blank">Qwiic Dynamic NFC/RFID Tag</a>,;虽然是&nbsp;ST25DV64KC, 但可以通用</p>

<p>官方还针对模块每个例程提供了文档说明:<a href="https://docs.sparkfun.com/SparkFun_ST25DV64KC_Arduino_Library/sparkfun-st25dv64kc-arduino-library-examples/ex_01_Device_Information/" target="_blank">SparkFun ST25DV64KC Arduino Library Doc</a>, 极具参考价值</p>

<p>&nbsp;</p>

<p>4.代码片段</p>

<p>如下为往 NFC 标签写入 EEWORLD 网址的演示,代码如下:</p>

<pre>
<code class="language-cpp">//头文件定义
#include "Arduino.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "CBTimer.h"
#include "Adafruit_AHTX0.h"
#include "Arduino_LED_Matrix.h"
#include "WiFiS3.h"
#include &lt;SparkFun_ST25DV64KC_Arduino_Library.h&gt;

//宏定义

//模块全局定义
CBTimer Timer;
ArduinoLEDMatrix LedMatrix;

SFE_ST25DV64KC_NDEF StmTag;


//全局变量定义
byte u8IsrTicker =0;
byte u8LedBlinkCnt =0;
byte u8LedMatrixCnt =0;

bool bModuleInitStatus =0;

//数组定义
unsigned long u32Heart1frame[] =      //大心图案
{
    0x3184a484,
                0x24042081,
                0x100a0040
};

unsigned long u32Heart2frame[] =      //小心图案
{
                0x0001b024,
                0x81100a00,
                0x40000000
};

uint8_t u8TagValue ={0};

//////////////////////////////////////////////////////////
//函数名称:TimerInterruptHandle
//函数功能:中断处理函数
//传入参数:无
//传出参数:无
//特别说明:1s 一次中断周期
//////////////////////////////////////////////////////////
void TimerInterruptHandle()
{

    if(0 ==u8LedBlinkCnt)                     
    {
      digitalWrite(LED_BUILTIN, HIGH);
      LedMatrix.loadFrame(u32Heart1frame);   
      u8LedBlinkCnt =1;
    }
    else
    {
      digitalWrite(LED_BUILTIN, LOW);
      LedMatrix.loadFrame(u32Heart2frame);   
      u8LedBlinkCnt =0;
    }
}

void setup()
{
//LED 初始化
pinMode(LED_BUILTIN, OUTPUT);         //LED 输出模式

//测试使用
pinMode(D2, OUTPUT);

//串口初始化
Serial.begin(9600);                     //设置串口波特率

//LED 矩阵初始化
LedMatrix.begin();

//Qwiic 初始化
Wire1.begin();
bModuleInitStatus =StmTag.begin(Wire1);
while(0 ==bModuleInitStatus)
{
    Serial.println("St25dv init fail");
    delay(100);
}
Serial.println("St25dv init success");

//获取标签 ID 号
if(StmTag.getDeviceUID(u8TagValue))
{
    Serial.println("Device UID is:");
    for(uint8_t i =0; i&lt;8; i++)
    {
      if(u8TagValue &lt;0x0A)
      {
      Serial.print(F("0"));
      }
      Serial.print(u8TagValue, HEX);
      Serial.print(" ");
    }
    Serial.println();
}
else
{
    Serial.println("Could not read devive UID!");
}


//只在设置时执行
SetSt25dvUriInfo(&amp;StmTag);

//定时器中断初始化
Timer.begin(1000, TimerInterruptHandle);//1000ms 周期运行一遍函数
Serial.println("Init Finish");
}

void loop()
{

}

//////////////////////////////////////////////////////////
//函数名称:SetSt25dvUriInfo
//函数功能:设置 ST25DV 的 URi 信息
//传入参数:
//传出参数:无
//特别说明:无
//////////////////////////////////////////////////////////
void SetSt25dvUriInfo(SFE_ST25DV64KC_NDEF *tag)
{
//清零区域1 256Byte 数据
uint8_t s_u8TagMemory;
memset(s_u8TagMemory, 0 ,256);
tag-&gt;writeEEPROM(0x0, s_u8TagMemory, 256);

//写入类型5 CC 文件信息
tag-&gt;writeCCFile8Byte();

//写入类型5NDEF URI 信息
tag-&gt;writeNDEFURI("eeworld.com.cn",SFE_ST25DV_NDEF_URI_ID_CODE_HTTPS_WWW);

Serial.println("Uri info write success!");

}


</code></pre>

<p>&nbsp;</p>

<p>烧录程序后打开手机的 NFC 功能,靠近模块后会提示发现 NFC 标签,点击后浏览器会跳转到&nbsp;EEWORLD 网址</p>

<p> &nbsp;</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【Follow me第二季第2期】6.进阶任务之 ST25DV16 NFC 模块的使用