简介
该项目是Funpack第二季第六期任务三:使用板卡的NFC功能,模拟出一个自定义功能的卡片,使用手机靠近并能读取卡片信息。
板卡
nRF7002 DK是nRF7002 Wi-Fi 6协同IC的开发评估板,它包含了在单板上开发所需要的所有元器件。开发板采用nRF5340多协议SoC作为主处理器,配合nRF7002 Wi-Fi协同芯片。可以同时支持低功耗蓝牙和Wi-Fi 应用的开发,并实现如 OFDMA、波束成形和目标唤醒时间等多项 Wi-Fi 6 功能。
板上的nRF5340是支持低功耗蓝牙、蓝牙Mesh、NFC、Thread和Zigbee的双核蓝牙5.3 SoC,并且蓝牙测向可实现所有到达角(AoA)和出发角(AoD)的测量功能。此外,它支持低功耗蓝牙音频,2 Mbps高吞吐量、广播扩展和长距离。像蓝牙Mesh、Thread和Zigbee这样的Mesh协议可以与低功耗蓝牙同时运行,从而使智能手机能够配网、入网、配置和控制Mesh节点。还支持NFC、ANT、802.15.4和2.4 GHz专有协议。
设计思路
任务三是利用nrf5340中的NFC功能实现,因而无关板卡WiFi和蓝牙部分。
NFC通讯中,两个设备一个工作在被动模式下,一个工作在主动模式下。被动模式的设备被主动模式的设备读取、写入信息。一般NFC卡片都是被动模式的设备。
因此,我们将nRF5340编程为NFC被动模式,并存储一些字符信息,由手机NFC读取。
流程图与主要代码
流程
/*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#include <zephyr/kernel.h>
#include <zephyr/sys/reboot.h>
#include <nfc_t2t_lib.h>
#include <nfc/ndef/msg.h>
#include <nfc/ndef/text_rec.h>
#include <dk_buttons_and_leds.h>
#define REC_COUNT 1
#define BUF_SIZE 128
static const uint8_t data[] = {
'H', 'e', 'l', 'l', 'o', ' ', 'F', 'u','n','p','a','c','k','2','-','6','!'
};
static const uint8_t code[] = {'e', 'n'};
/* Buffer used to hold an NFC NDEF message. */
static uint8_t msg_buf[BUF_SIZE];
static void callback(void *context,
nfc_t2t_event_t event,
const uint8_t *data,
size_t data_length)
{
ARG_UNUSED(context);
ARG_UNUSED(data);
ARG_UNUSED(data_length);
}
int main(void)
{
uint32_t len = sizeof(msg_buf);
nfc_t2t_setup(callback, NULL);
//创建RECORD
NFC_NDEF_TEXT_RECORD_DESC_DEF(rec,UTF_8,code,sizeof(code),data,sizeof(data));
//创建MESSAGE
NFC_NDEF_MSG_DEF(text_msg, REC_COUNT);
//将RECORD添加入MESSAGE
nfc_ndef_msg_record_add(&NFC_NDEF_MSG(text_msg),&NFC_NDEF_TEXT_RECORD_DESC(rec));
//编码MESSAGE
nfc_ndef_msg_encode(&NFC_NDEF_MSG(text_msg),msg_buf,&len);
//设置NFC Type 2 Tag Payload
nfc_t2t_payload_set(msg_buf, len);
//启动NFC Type 2 Tag模拟
nfc_t2t_emulation_start();
return 0;
}
原理说明
在初始化后nfc t2t后,首先通过宏NFC_NDEF_TEXT_RECORD_DESC_DEF创建了ndef的record,record中填入我们自定义的字符串。
然后通过宏NFC_NDEF_MSG_DEF创建ndef message,再通过函数nfc_ndef_msg_record_add将record加入message。
接着用函数nfc_ndef_msg_encode对message进行编码,存入数据缓冲,用函数nfc_t2t_payload_set设置nfc t2t payload指向存储编码数据的缓冲区。
最后用函数nfc_t2t_emulation_start启动nfc t2t模拟。这时板卡就可以被识别为一个nfc tag。
NFC技术使用的频率是13.56MHz。这个频率被称为“高频”,因为它比一些其他无线技术使用的频率高。NFC设备需要非常接近才能进行通信,通常只有几厘米的距离。
NFC设备使用的是被动和主动模式。在被动模式下,标签只是等待读取器/写入器的信号。当读取器/写入器靠近标签时,标签会接收到一个电磁场,并回复一个包含存储在标签上的信息的信号。在主动模式下,读取器/写入器会发送一个信号,标签会接收到这个信号并回复一个响应。
当手机靠近读取nfc tag的时候,手机发出NFC射频信号,tag感应到信号后,利用感应能量,将自身数据回传给手机,这样就能够从手机端获取tag中我们填入的自定义字符串。
功能演示
在板卡上插入NFC天线,下载运行程序。
开启手机NFC功能,打开手机App NFC Tools。
手机贴近板卡NFC天线,手机App上会弹出提示:检测到NFC标签。
手机页面显示标签详细技术信息,包括自定义的字符串“Hello,Funpack2-x!"
心得体会
参加本次活动,了解到了nordic最新的nrf connect sdk基于zephyr的开发方式。一开始在搭建环境的过程中颇费周折。学习了nrf nfc库的使用。以后有机会再详细研究wifi和蓝牙部分。
希望funpack越办越好!