开发板介绍
该DK支持低功耗Wi-Fi 应用的开发,并实现多项Wi-Fi 6功能,如OFDMA、波束成形和目标唤醒时间(TWT)。
nRF7002是可以配合Nordic现有产品一起使用的协同IC,提供无缝连接和基于Wi-Fi的定位(本地Wi-Fi集线器的SSID嗅探)。nRF7002可配合nRF52®和nRF53®系列蓝牙系统级芯片(SoC),以及nRF91®系列蜂窝物联网系统级封装(SiP)产品。nRF7002也可以与非Nordic的主机设备结合使用。
它可以通过SPI或QSPI与主机通信,并带有额外的共存功能,可与其他协议如蓝牙、Thread或Zigbee无缝共存。Nordic的nRF Connect SDK集成并支持nRF7002。
环境配置
安装 nRF 命令行工具
按照手动安装步骤安装 nRF Connect SDK
安装 VS 代码
安装 nRF Connect 扩展包
如何从 Marketplace 和 VS Code 安装
要手动安装 nRF Connect for VS Code 扩展包,请使用以下选项之一:
- 访问 Visual Studio 代码市场。
- 直接在 VS Code 中打开扩展侧边栏并搜索扩展包。搜索关键词 nRF Connect for VS Code
如何打开扩展
安装将 nRF Connect 图标添加到 Visual Studio Code 的活动栏中。
单击该图标可打开扩展程序。
这将打开“添加构建配置”页面。
- 在应用程序视图中,单击包含要编辑的文件的构建文件夹。
- 单击右侧的菜单图标,或右键单击构建文件夹。
- 单击编辑构建配置。
- 编辑配置后,单击“构建配置”保存更改并使用新配置重建应用程序。
最终效果如下:
任务描述
使用板卡的NFC功能,模拟出一个自定义功能的卡片,使用手机靠近并能读取卡片信息。
模拟NFC写入bilibili的app信息,并用LED显示状态
任务分析
NFC关键技术
NFC是一种基于RFID(射频识别)的短距离无线通信技术,可以实现电子设备之间的非接触式点对点数据传输
• NFC工作在13.56 MHz的频率,属于全球免许可的ISM波段
• NFC设备可以产生射频场,也可以利用外部射频场进行感应电源
• NFC有三种工作模式:主动模式、被动模式和双向模式
1.主动模式下,NFC设备可以作为读卡器,发出射频场去识别和读写其他NFC设备或标签;
2. 被动模式下,NFC设备被模拟成一张卡,只在其他设备发出的射频场中被动响应,被读写信息;
3. 双向模式下,NFC设备双方都主动发出射频场来建立点对点的通信
NFC兼容ISO/IEC 14443、ISO/IEC 15693、ISO/IEC 18092等国际标准,以及索尼的FeliCaTM标准
NFC论坛定义了五种类型的NFC标签,分别为Type 1、Type 2、Type 3、Type 4和Type 5
不同类型的标签有不同的内存大小、数据速率、防冲突机制等特性
NFC的应用场景包括移动支付、身份认证、文件传输、卡模拟、嵌入式体验等
NFC可以提供便捷、安全、创新的用户体验,连接物理世界和数字世界
设计思路:
NFC功能通过板卡的主处理器nRF5340配合一片柔性NFC天线实现,实现模拟一个NFC标签,实现跳转到BILIBILI APP的功能。
核心功能包括两个部分
1. NFC模拟配置,写入app的包信息,配置好中断响应。
2. 响应指示,正常响应时,LED给出指示,代表NFC正常工作。熄灭时,NFC非工作状态。
流程图:
查找bilibili 的包名
1. 数据线连接手机,注意是调试模式哈,不然电脑无权访问手机
2. 电脑端Crtl+R 输入cmd 回车
输入 adb devices 检验是否成功连接手机
输入 adb shell 进入手机的shell
输入 pm list packages 显示所有应用包名
可以看到bilibili的包名 tv.danmaku.bili
对应定义 如下图
static const uint8_t android_pkg_name[] = {
't', 'v', '.', 'd', 'a', 'n', 'm', 'a', 'k', 'u', '.', 'b', 'i', 'l', 'i'
};
核心代码与解释
-
模拟NFC
/* Configure LED-pins as outputs */
err = dk_leds_init();
if (err) {
printk("Cannot init LEDs!\n");
goto fail;
}
/* Set up NFC */
err = nfc_t2t_setup(nfc_callback, NULL);
if (err) {
printk("Cannot setup NFC T2T library!\n");
goto fail;
}
代码解释如下:实现一个 NFC 启动应用程序的示例,
• 调用 dk_leds_init 函数,初始化 LED 引脚为输出模式,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。
• 判断 err 变量是否为 0,如果不为 0,表示初始化 LED 失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。
• 调用 nfc_t2t_setup 函数,设置 NFC 类型 2 标签(T2T)库的回调函数和上下文参数,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。
• 判断 err 变量是否为 0,如果不为 0,表示设置 NFC T2T 库失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。
- NFC信息写入
/* Encode launch app data */
err = nfc_launchapp_msg_encode(android_pkg_name,
sizeof(android_pkg_name),
universal_link,
sizeof(universal_link),
ndef_msg_buf,
&len);
if (err) {
printk("Cannot encode message!\n");
goto fail;
}
/* Set created message as the NFC payload */
err = nfc_t2t_payload_set(ndef_msg_buf, len);
if (err) {
printk("Cannot set payload!\n");
goto fail;
}
/* Start sensing NFC field */
err = nfc_t2t_emulation_start();
if (err) {
printk("Cannot start emulation!\n");
goto fail;
}
代码解释如下:编码启动应用程序的数据,并将其设置为 NFC 负载,然后开始模拟 NFC 标签的感应场和数据交换过程
• 调用 nfc_launchapp_msg_encode 函数,根据 Android 应用程序包名和通用链接生成一个 NDEF 消息,并存储在 ndef_msg_buf 数组中,同时更新 len 变量为消息的实际长度,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。
• 判断 err 变量是否为 0,如果不为 0,表示编码消息失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。
• 调用 nfc_t2t_payload_set 函数,将创建的 NDEF 消息设置为 NFC T2T 库的负载数据,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。
• 判断 err 变量是否为 0,如果不为 0,表示设置负载失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。
• 调用 nfc_t2t_emulation_start 函数,开始模拟 NFC T2T 标签的感应场和数据交换过程,如果成功返回 0,否则返回错误代码,并赋值给 err 变量。
• 判断 err 变量是否为 0,如果不为 0,表示启动模拟失败,调用 printk 函数输出错误信息,并跳转到 fail 标签处结束程序。
-
状态显示
static void nfc_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);
switch (event) {
case NFC_T2T_EVENT_FIELD_ON:
dk_set_led_on(NFC_FIELD_LED);
break;
case NFC_T2T_EVENT_FIELD_OFF:
dk_set_led_off(NFC_FIELD_LED);
break;
default:
break;
}
}
context 是一个指针,用于传递用户定义的上下文数据;
event 是一个枚举类型,表示 NFC T2T 库的事件类型;
data 是一个指针,指向事件相关的数据;
data_length 是一个整数,表示数据的长度。
使用 ARG_UNUSED 宏标记 context、data 和 data_length 这三个参数在函数中未使用,以避免编译器产生警告。
使用 switch 语句根据 event 参数的值执行不同的操作:
如果 event 为 NFC_T2T_EVENT_FIELD_ON,表示 NFC 感应场已开启,调用 dk_set_led_on 函数将 NFC_FIELD_LED 灯打开;
如果 event 为 NFC_T2T_EVENT_FIELD_OFF,表示 NFC 感应场已关闭,调用 dk_set_led_off 函数将 NFC_FIELD_LED 灯关闭;
如果 event 为其他值,不执行任何操作。
手机靠近NFC天线时 LED会亮起来,离开时LED会熄灭。