Funpack4-1 基于DWM3001CDK的NFC控制器
该项目使用了DWM3001CDK,实现了NFC控制器的设计,它的主要功能为:通过板子上的NFC功能,对板卡上的led灯进行不同的效果展示。
标签
嵌入式系统
Funpack活动
DWM3001CDK
NFC控制器
反正都一样
更新2025-04-08
15

image.png

项目介绍

这里是我参加Funpack第四季第一期活动的任务总结报告,我所完成的是任务一,点灯!使用导线缠绕成NFC线圈连接在板上,通过刷卡控制板卡上的RGB LED,并实现切换至少4种不同灯效,(如色彩渐变,呼吸/流水效果等)

  1. 下载相关软件
    • 访问 Qorvo 官方网站或相关资源页面,下载以下软件:
      • IDE:如 Segger Embedded Studio,用于编写和调试代码。
      • J-Link 工具:用于硬件调试和程序烧录。
      • SDK 开发包:包含示例代码和开发所需的库文件
  2. 安装软件
    • 安装下载的 IDE、J-Link 工具和 SDK 开发包
  3. 连接开发板
    • 将 DWM3001CDK 开发板通过 USB 线连接到电脑
    • 确保电脑能够正确识别开发板。开发板有两个 USB 端口,分别用于 J-Link 和 DWM3001C USB 接口
  4. 检查开发板信息
    • 在设备管理器中检查开发板的连接状态,确保其被正确识别
  5. 查看示例代码
    • 打开 SDK,浏览其中提供的示例代码,如 NFC、LED 等
    • 示例代码可以帮助你快速了解如何使用开发板的各种功能
  6. 根据需求修改代码
    • 根据项目需求,对示例代码进行修改
    • 例如,你可以修改代码以实现特定的 UWB 定位功能
  7. 调试和测试
    • 使用 IDE 的调试工具,对修改后的代码进行调试
    • 测试开发板的功能,确保其按预期工作

硬件介绍

Qorvo DWM3001CDK 是一款专为 Qorvo DW3110 IC 设计的开发套件,用于评估和开发基于 DWM3001C 的全集成超宽带(UWB)模块。

核心功能适用于评估 TWR(Two-Way Ranging)或 TDoA(Time Difference of Arrival)标签的硬件性能。可用于构建评估型实时定位系统。Apple U1 和 U2 芯片 互操作,符合 FiRa™ PHY 和 MAC 规范,可与其他 FiRa™ 设备兼容。两个微型 USB 端口一个用于 J-Link,提供 SWD 和 UART 接口,一个直接连接到 DWM3001C USB 接口供电方式:可通过 USB 端口、Raspberry Pi 接口、电池或外部电源供电。Raspberry Pi 兼容接头:26 引脚接头,兼容 Raspberry Pi。GPIO 和接口访问:提供对所有 DWM3001C GPIO 和接口的访问。硬件特性,复位和用户定义按钮与 LED:用于开发和调试。模块电流测量:通过 VCC 路径上的排针测量模块电流。支持 UWB RF 频段:支持频段 5 (6.5 GHz) 和频段 9 (8 GHz)。nRF52833 SoC:带有蓝牙® 5.2 功能。集成天线:两根天线,分别用于 BLE 和 UWB。标准兼容性:符合 IEEE 802.15.4-2015 和 IEEE 802.15.4z BPRF 标准。

因为该板卡上并没有nfc的线圈,只预留了nfc的接口,所以需要我们自己焊接个线圈上去,随便拿个杜板线多绕几圈,头尾焊接上接口上就行了,圈数不能太少,nfc需要一定的磁通量

软件介绍

未命名绘图 (1).jpg

可以看上出流程还是比较简单的,只要将各个功能的例程结合在一起基本就可以解决了

image.png

下载得到sdk中,可以根据该路径得到nfc的例程,该例程原先功能是,手机靠近后,nfc跳出弹窗,显示hello world文本。

image.png image.png

在官方提供的例程,并不是每个都适配我们的板卡,我们需要修改一部分,比如说这里的全局宏定义,从原先的pca10040修改为pca10100,主控nRF52833就是pca10100,这样在board.h文件里,就会包含对的头文件。

因为有led灯的不同展示方式,我们可以往nfc程序里移植pwm部分代码。

static nrf_drv_pwm_t m_pwm0 = NRF_DRV_PWM_INSTANCE(0);
// This is for tracking PWM instances being used, so we can unintialize only
// the relevant ones when switching from one demo to another.
#define USED_PWM(idx) (1UL << idx)
static uint8_t m_used = 0;
static uint16_t const m_demo1_top = 10000;
static uint16_t const m_demo1_step = 200;
static uint8_t m_demo1_phase;
static nrf_pwm_values_individual_t m_demo1_seq_values;
static nrf_pwm_sequence_t const m_demo1_seq =
{
.values.p_individual = &m_demo1_seq_values,
.length = NRF_PWM_VALUES_LENGTH(m_demo1_seq_values),
.repeats = 0,
.end_delay = 0
};
static void demo1_handler(nrf_drv_pwm_evt_type_t event_type)
{
if (event_type == NRF_DRV_PWM_EVT_FINISHED)
{
uint8_t channel = m_demo1_phase >> 1;
bool down = m_demo1_phase & 1;
bool next_phase = false;
uint16_t * p_channels = (uint16_t *)&m_demo1_seq_values;
uint16_t value = p_channels[channel];
if (down)
{
value -= m_demo1_step;
if (value == 0)
{
next_phase = true;
}
}
else
{
value += m_demo1_step;
if (value >= m_demo1_top)
{
next_phase = true;
}
}
p_channels[channel] = value;

if (next_phase)
{
if (++m_demo1_phase >= 2 * NRF_PWM_CHANNEL_COUNT)
{
m_demo1_phase = 0;
}
}
}
}
static void demo1(void)
{
NRF_LOG_INFO("Demo 1");

/*
* This demo plays back a sequence with different values for individual
* channels (LED 1 - LED 4). Only four values are used (one per channel).
* Every time the values are loaded into the compare registers, they are
* updated in the provided event handler. The values are updated in such
* a way that increase and decrease of the light intensity can be observed
* continuously on succeeding channels (one second per channel).
*/
nrf_drv_pwm_config_t const config0 =
{
.output_pins =
{
BSP_LED_0 | NRF_DRV_PWM_PIN_INVERTED, // channel 0
BSP_LED_1 | NRF_DRV_PWM_PIN_INVERTED, // channel 1
BSP_LED_3 | NRF_DRV_PWM_PIN_INVERTED, // channel 2
BSP_LED_2 | NRF_DRV_PWM_PIN_INVERTED // channel 3
},
.irq_priority = APP_IRQ_PRIORITY_LOWEST,
.base_clock = NRF_PWM_CLK_1MHz,
.count_mode = NRF_PWM_MODE_UP,
.top_value = m_demo1_top,
.load_mode = NRF_PWM_LOAD_INDIVIDUAL,
.step_mode = NRF_PWM_STEP_AUTO
};
APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, demo1_handler));
m_used |= USED_PWM(0);

m_demo1_seq_values.channel_0 = 0;
m_demo1_seq_values.channel_1 = 0;
m_demo1_seq_values.channel_2 = 0;
m_demo1_seq_values.channel_3 = 0;
m_demo1_phase = 0;

(void)nrf_drv_pwm_simple_playback(&m_pwm0, &m_demo1_seq, 1,
NRF_DRV_PWM_FLAG_LOOP);
}

这段代码实现了一个基于 Nordic Semiconductor nRF52 系列芯片的 PWM(脉冲宽度调制)示例,用于控制 LED 的亮度变化。PWM 实例初始化定义了PWM 实例(m_pwm0),对应 nRF52 芯片上的PWM 外设。使用 USED_PWM 宏来跟踪哪些 PWM 实例正在使用,以便在切换示例时正确地初始化和去初始化。其中的demo1通过 PWM 控制四个 LED(LED 1 - LED 4)的亮度变化。使用事件处理函数 demo1_handler 动态更新每个通道的 PWM 值,实现亮度的逐渐增加和减少。每个通道的亮度变化周期为 1 秒。


image.png

我们在驱动代码移过去后,同时要在nfc的board.c代码中,加上使能pwm部分,原先的nfc代码中是没有的,同样从pwm的驱动代码中复制即可。

/**
* @brief Callback function for handling NFC events.
*/
static void nfc_callback(void * p_context, nfc_t2t_event_t event, const uint8_t * p_data, size_t data_length)
{
(void)p_context;

switch (event)
{
case NFC_T2T_EVENT_FIELD_ON:
//bsp_board_led_on(BSP_BOARD_LED_0);
break;
case NFC_T2T_EVENT_FIELD_OFF:
//bsp_board_led_off(BSP_BOARD_LED_0);
bsp_evt_handler();
break;
default:
break;
}
}

这段代码是一个 NFC(近场通信)回调函数 nfc_callback,用于处理 NFC Type 2 标签(T2T)事件。NFC 场检测:通过 NFC_T2T_EVENT_FIELD_ONNFC_T2T_EVENT_FIELD_OFF 事件,检测 NFC 场的存在和消失。LED 指示:可以使用 LED 来指示 NFC 场的状态(注释掉的代码部分)。事件处理:在 NFC 场消失时,调用 bsp_evt_handler() 函数,用于处理与 NFC 场消失相关的系统事件或其他逻辑,这里则是对led展示效果的改变。

static void bsp_evt_handler()
{
void (* const demos[])(void) =
{
demo1,
demo2,
demo3,
demo4,
demo5
};
uint8_t const demo_idx_max = (sizeof(demos) / sizeof(demos[0])) - 1;
static uint8_t demo_idx = 0;

if (demo_idx < demo_idx_max)
{
++demo_idx;
}
else
{
demo_idx = 0;
}

if (m_used & USED_PWM(0))
{
nrf_drv_pwm_uninit(&m_pwm0);
}
if (m_used & USED_PWM(1))
{
nrf_drv_pwm_uninit(&m_pwm1);
}
if (m_used & USED_PWM(2))
{
nrf_drv_pwm_uninit(&m_pwm2);
}
m_used = 0;

demos[demo_idx]();
}

nfc添加上这段代码,这也是从pwm驱动代码里面复制来,小小修改下的,主要就是配合nfc的事件回调函数实现切换led展示效果。

效果展示

image.png

总结

在本次活动中,学习了如何使用nfc。在过程中遇到的问题,通过百度搜索都能找到适合的答案,使自我得到了提升,感谢硬禾学堂平台。

附件下载
DWM3001CDK程序.zip
任务程序
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号