Hello,
I am developing an NFC application using the nRF Connect SDK v2.6.0 and the nRF Toolchain v2.7.0. During development, I tested my application on the nRF52840 DevKit (built with the target nrf52840dk_nrf52840) and the nfc_callback function works as expected. However, when I switch to my final hardware—which uses the nRF52832 (building with the target nrf52dk_nrf52832)—I can still read the NFC tag, but the nfc_callback function is never called.
The codebase is essentially the same as the peripheral_hids_keyboard sample from the SDK, and the only difference is the target board selection. Below is the app_nfc.c file for reference. Are there any specific configurations or known differences on the nRF52832 that might prevent the callback from being triggered?
/*
* Copyright (c) 2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#if CONFIG_NFC_OOB_PAIRING
#include "app_nfc.h"
#include <nfc_t2t_lib.h>
static struct bt_le_oob oob_local;
static uint8_t ndef_msg_buf[256]; /* Buffer used to hold an NFC NDEF message. */
void nfc_field_detected(void);
void nfc_field_lost(void);
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);
printk("\nNFC event: %d", event);
switch (event) {
case NFC_T2T_EVENT_FIELD_ON:
case NFC_T2T_EVENT_DATA_READ:
nfc_field_detected();
break;
case NFC_T2T_EVENT_FIELD_OFF:
nfc_field_lost();
break;
default:
break;
}
}
int nfc_ndef_le_oob_msg_encode(uint8_t *buffer, uint32_t *len)
{
int err;
struct nfc_ndef_le_oob_rec_payload_desc rec_payload;
err = bt_le_oob_get_local(BT_ID_DEFAULT, &oob_local);
if (err) {
printk("Error while fetching local OOB data: %d\n", err);
}
memset(&rec_payload, 0, sizeof(rec_payload));
rec_payload.addr = &oob_local.addr;
rec_payload.le_sc_data = &oob_local.le_sc_data;
rec_payload.local_name = bt_get_name();
rec_payload.le_role = NFC_NDEF_LE_OOB_REC_LE_ROLE(
NFC_NDEF_LE_OOB_REC_LE_ROLE_PERIPH_ONLY);
rec_payload.appearance = NFC_NDEF_LE_OOB_REC_APPEARANCE(
CONFIG_BT_DEVICE_APPEARANCE);
rec_payload.flags = NFC_NDEF_LE_OOB_REC_FLAGS(BT_LE_AD_NO_BREDR);
/* Create NFC NDEF message description, capacity - 1 record */
NFC_NDEF_MSG_DEF(nfc_le_oob_msg, 1);
/* Create NFC NDEF LE OOB Record description without record ID field */
NFC_NDEF_LE_OOB_RECORD_DESC_DEF(nfc_le_oob_rec, 0, &rec_payload);
/* Add LE OOB Record as lone record to message */
err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_le_oob_msg),
&NFC_NDEF_LE_OOB_RECORD_DESC(nfc_le_oob_rec));
if (err < 0) {
printk("Error while adding LE OOB record: %d\n", err);
return err;
}
err = nfc_ndef_msg_encode(&NFC_NDEF_MSG(nfc_le_oob_msg),
buffer,
len);
if (err < 0) {
printk("Error during NDEF message encoding: %d\n", err);
return err;
}
return 0;
}
void app_nfc_init(void)
{
uint32_t len = sizeof(ndef_msg_buf);
printk("NFC configuration start\n");
/* Set up NFC */
int ret = nfc_t2t_setup(nfc_callback, NULL);
printk("nfc_t2t_setup %d", ret);
if (ret < 0) {
printk("Cannot setup NFC T2T library!\n");
}
/* Prepare an NDEF message with LE OOB record. */
ret = nfc_ndef_le_oob_msg_encode(ndef_msg_buf, &len);
printk("nfc_t2t_setup %d", ret);
if (ret < 0) {
printk("Cannot encode BLE pair message!\n");
}
/* Set created message as the NFC payload */
ret = nfc_t2t_payload_set(ndef_msg_buf, len);
printk("nfc_t2t_setup %d", ret);
if (ret < 0) {
printk("Cannot set payload!\n");
}
/* Start sensing NFC field */
ret = nfc_t2t_emulation_start();
printk("nfc_t2t_setup %d", ret);
if (ret < 0) {
printk("Cannot start emulation!\n");
}
printk("NFC configuration done\n");
}
struct bt_le_oob *app_nfc_oob_data_get(void)
{
return &oob_local;
}
#endif
Thank you!