【Follow me第二季第2期】6.进阶任务之 ST25DV16 NFC 模块的使用
本帖最后由 我的学号 于 2024-10-27 21:34 编辑<p>本次活动我在 digikey 额外下单的物料之一是来自 Adafruit 的 <a href="https://www.adafruit.com/product/4701" target="_blank">ST25DV16K 模块</a>, 这是一款采用来自ST NFC 芯片 ST25DV16K 制作而成的小模块,附带有线圈天线,同时还留有 II2C 通信接口以及 QWIIC 接口,正好能与本次活动的主题 Arduino UR4 配合使用</p>
<p> </p>
<p>正面照</p>
<p> </p>
<p> </p>
<p>背面照:</p>
<p> </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> </p>
<p>PIN 定义</p>
<p> </p>
<p> </p>
<p> </p>
<p>指令的详细说明可参考官方文档: <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&vd_source=2f4203a5b01983c985b040aa2ec11d35" target="_blank">ST 官方介绍</a></p>
<p> </p>
<p>2.硬件连接</p>
<p>硬件连接可以通过 UR4 上的 QWIIC 接口连接;由硬件原理图分析可知,QWIIC 本质上是 IIC 接口,可极为方便地通过 QWIIC 接线扩展连接各种 IIC 设备</p>
<p>软件实现上 Arduino 将其抽象为 Wire1 模块,而普通的的 IIC 接口用 Wire 模块连接(A4, A5) </p>
<p>Digikey 上 QWIIC 接线偏贵,直接TB 解决就行</p>
<p> </p>
<p> </p>
<p>3.软件开发</p>
<p>Adafruit 的模块介绍里边有例程和简单说明,下载打开后发现是 ST 的例程,无法直接和 QWIIC 接口联系起来</p>
<p>一番搜索后,在 SparkFun 上找到了相似的资源: <a href="https://learn.sparkfun.com/tutorials/qwiic-dynamic-nfcrfid-tag-hookup-guide" target="_blank">Qwiic Dynamic NFC/RFID Tag</a>,;虽然是 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> </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 <SparkFun_ST25DV64KC_Arduino_Library.h>
//宏定义
//模块全局定义
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<8; i++)
{
if(u8TagValue <0x0A)
{
Serial.print(F("0"));
}
Serial.print(u8TagValue, HEX);
Serial.print(" ");
}
Serial.println();
}
else
{
Serial.println("Could not read devive UID!");
}
//只在设置时执行
SetSt25dvUriInfo(&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->writeEEPROM(0x0, s_u8TagMemory, 256);
//写入类型5 CC 文件信息
tag->writeCCFile8Byte();
//写入类型5NDEF URI 信息
tag->writeNDEFURI("eeworld.com.cn",SFE_ST25DV_NDEF_URI_ID_CODE_HTTPS_WWW);
Serial.println("Uri info write success!");
}
</code></pre>
<p> </p>
<p>烧录程序后打开手机的 NFC 功能,靠近模块后会提示发现 NFC 标签,点击后浏览器会跳转到 EEWORLD 网址</p>
<p> </p>
<p> </p>
页:
[1]