这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【nFR54L15Zephyr】实现NFC功能

共1条 1/1 1 跳转至

【nFR54L15Zephyr】实现NFC功能

高工
2026-05-05 21:54:56     打赏

【前言】

NRF54L16-DK开发板配置的NFC天线,可以实现NFC的功能

【开发环境】

SDK版本:nRF Connect SDK v3.2.4

Toolchains:NRF3.2.4

【工程创建】

的nrf connect中的create a new application中新建一个基于nrf shell的sample

【工程修改】

1、prj.conf

CONFIG_DK_LIBRARY=y

# NFC T2T 配置
CONFIG_NFC_T2T_NRFXLIB=y
CONFIG_NFC_NDEF=y
CONFIG_NFC_NDEF_MSG=y
CONFIG_NFC_NDEF_RECORD=y
CONFIG_NFC_NDEF_TEXT_RECORD=y

# 日志配置
CONFIG_LOG=y
CONFIG_LOG_MODE_DEFERRED=y
CONFIG_LOG_PRINTK=y

2、main.c

1、引入头文件

#include <nfc_t2t_lib.h>
#include <nfc/ndef/msg.h>
#include <nfc/ndef/text_rec.h>
#include <dk_buttons_and_leds.h>

2. 常量定义

#define MAX_REC_COUNT 1
#define NDEF_MSG_BUF_SIZE 128

#define RUN_STATUS_LED DK_LED1    // 状态指示 LED
#define NFC_FIELD_LED  DK_LED2    // NFC 场检测 LED

#define STATUS_LED_INTERVAL K_MSEC(1000)

3、NDEF 文本消息编码

static const uint8_t en_payload[] = {
    'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
static const uint8_t en_code[] = {'e', 'n'};

4、NFC 回调函数

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);  // 检测到 NFC 场
        break;
    case NFC_T2T_EVENT_FIELD_OFF:
        dk_set_led_off(NFC_FIELD_LED); // NFC 场移除
        break;
    default:
        break;
    }
}

5、NDEF 文本编码函数

static int nfc_text_encode(uint8_t *buffer, uint32_t *len,
                           const uint8_t *payload, size_t payload_len,
                           const uint8_t *lang_code, size_t lang_code_len,
                           nfc_ndef_text_rec_utf_type_t encoding)
{
    NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_text_rec,
                                  encoding,
                                  lang_code, lang_code_len,
                                  payload, payload_len);

    NFC_NDEF_MSG_DEF(nfc_text_msg, MAX_REC_COUNT);

    if (nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg),
                                &NFC_NDEF_TEXT_RECORD_DESC(nfc_text_rec)) < 0) {
        return -1;
    }

    if (nfc_ndef_msg_encode(&NFC_NDEF_MSG(nfc_text_msg), buffer, len) < 0) {
        return -1;
    }

    return 0;
}

6、NFC 初始化函数

static int start_nfc(void)
{
    uint32_t len;
    uint8_t ndef_msg_buf[NDEF_MSG_BUF_SIZE];

    /* 设置 NFC 回调 */
    if (nfc_t2t_setup(nfc_callback, NULL) < 0) {
        return -1;
    }

    /* 编码 NDEF 消息 */
    len = sizeof(ndef_msg_buf);
    if (nfc_text_encode(ndef_msg_buf, &len,
                        en_payload, sizeof(en_payload),
                        en_code, sizeof(en_code), UTF_8) < 0) {
        return -1;
    }

    /* 设置 NFC 载荷 */
    if (nfc_t2t_payload_set(ndef_msg_buf, len) < 0) {
        return -1;
    }

    /* 启动 NFC 模拟 */
    if (nfc_t2t_emulation_start() < 0) {
        return -1;
    }

    return 0;
}

7、主函数集成

int main(void)
{
    int err;

    printk("Starting NFC NDEF sample\n");

    /* 初始化 LED */
    err = dk_leds_init();
    if (err) {
        printk("LEDs init failed (err %d)\n", err);
        return 1;
    }

    /* 启动 NFC */
    if (start_nfc() < 0) {
        printk("Cannot start NFC!\n");
    }

    while (true) {
        /* 状态 LED 闪烁 */
        k_sleep(STATUS_LED_INTERVAL);
    }

    return 0;
}

【工程配置】

添加编译配置如下:

image.png编译后结果如下:

image.png

使用west flash后,打印日志如下:

image.png

【测试效果】

测试工具为PTX IOT Config Tool

image.png

image.png

【总结】

NRF54L15-DK可以实现NFC功能,并且可以传输信息。






关键词: nFR54L15Zephyr      NFC    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]