Hello.
Im tring use nrf_dm sample with nRF5340 on nRF Connect SDK V2.9.0, with a custom board.
To create build, I use nrf5340dk board.
I got the error when I try dm with other device:
*** Booting nRF Connect SDK v2.9.0-7787b2649840 *** *** Using Zephyr OS v3.7.99-1f8f3dc29142 *** [00:00:00.021,240] <inf> remote: Starting Remote Controller [00:00:00.027,404] <inf> DM_SRV: Starting Distance Measurement sample [00:00:00.049,621] <inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002) [00:00:00.057,525] <inf> bt_hci_core: HW Variant: nRF53x (0x0003) [00:00:00.064,117] <inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 45.41337 Build 3074452168 [00:00:00.077,575] <inf> bt_hci_core: Identity: DD:15:5D:30:B6:B5 (random) [00:00:00.084,991] <inf> bt_hci_core: HCI: version 6.0 (0x0e) revision 0x206b, manufacturer 0x0059 [00:00:00.094,482] <inf> bt_hci_core: LMP: version 6.0 (0x0e) subver 0x206b [00:00:00.101,959] <inf> DM_SRV: DM Bluetooth LE Synchronization initialization [00:00:06.312,957] <err> os: ***** USAGE FAULT ***** [00:00:06.318,756] <err> os: Stack overflow (context area not valid) [00:00:06.326,080] <err> os: r0/a1: 0xed5bb548 r1/a2: 0x719aa156 r2/a3: 0xc962b81b [00:00:06.334,960] <err> os: r3/a4: 0xbe6eeaee r12/ip: 0x8155a866 r14/lr: 0xc47b98df [00:00:06.343,811] <err> os: xpsr: 0x00000000 [00:00:06.349,151] <err> os: s[ 0]: 0x20013948 s[ 1]: 0x00000000 s[ 2]: 0x0000000a s[ 3]: 0x00000017 [00:00:06.359,924] <err> os: s[ 4]: 0x20072004 s[ 5]: 0x00027461 s[ 6]: 0x20072004 s[ 7]: 0x00000017 [00:00:06.370,666] <err> os: s[ 8]: 0x20072004 s[ 9]: 0x00000200 s[10]: 0x20005898 s[11]: 0x00018f7b [00:00:06.381,164] <err> os: s[12]: 0x00000400 s[13]: 0x00000400 s[14]: 0x00000000 s[15]: 0x00000017 [00:00:06.391,601] <err> os: fpscr: 0x00000017 [00:00:06.396,820] <err> os: Faulting instruction address (r15/pc): 0x00000001 [00:00:06.404,693] <err> os: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0 [00:00:06.412,597] <err> os: Current thread: 0x20005d00 (BT RX WQ) [00:00:06.419,555] <err> os: Halting system
my prj.conf:
# # Copyright (c) 2021 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # # BT CONFIG_BT=y CONFIG_BT_CENTRAL=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_SCAN=y CONFIG_BT_SCAN_FILTER_ENABLE=y CONFIG_BT_SCAN_NAME_CNT=1 CONFIG_BT_SCAN_MANUFACTURER_DATA_CNT=1 CONFIG_BT_SCAN_WITH_IDENTITY=y CONFIG_BT_ID_MAX=1 # test CONFIG_BT_LL_SW_SPLIT=y CONFIG_BT_EXT_ADV=y CONFIG_BT_DEVICE_NAME="nRF_DM" CONFIG_BT_DDFS=y CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=40000 # Distance Measurement CONFIG_DM_MODULE=y CONFIG_MPSL=y CONFIG_MPSL_TIMESLOT_SESSION_COUNT=1 CONFIG_DM_MODULE_LOG_LEVEL_DBG=n CONFIG_DM_GPIO_DEBUG=y CONFIG_PWM=y CONFIG_NCS_SAMPLES_DEFAULTS=y CONFIG_DK_LIBRARY=y CONFIG_DM_HIGH_PRECISION_CALC=y CONFIG_HEAP_MEM_POOL_SIZE=8192 # Main stack CONFIG_MAIN_STACK_SIZE=8192 # LOG and RTT CONFIG_LOG=y CONFIG_CONSOLE=y CONFIG_RTT_CONSOLE=y CONFIG_USE_SEGGER_RTT=y CONFIG_LOG_BACKEND_RTT=y CONFIG_LOG_MODE_IMMEDIATE=y # Debug CONFIG_DEBUG_THREAD_INFO=y CONFIG_DEBUG=y CONFIG_DEBUG_OPTIMIZATIONS=y
my cpuapp.conf:
# Distance Measurement
CONFIG_DM_MODULE_RPC=y
CONFIG_DM_MODULE_RPC_CLIENT=y
CONFIG_TEST_RANDOM_GENERATOR=y
# NRF RPC
CONFIG_NRF_RPC_THREAD_POOL_SIZE=2
# Enable the CPUNET core
CONFIG_SOC_NRF53_CPUNET_ENABLE=y
# Clock
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=n
CONFIG_CLOCK_CONTROL_NRF_K32SRC_SYNTH=y
CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n
CONFIG_SOC_ENABLE_LFXO=n
CONFIG_NORDIC_QSPI_NOR=n
my cpunet.conf:
# enable NORA-B12 fem CONFIG_MPSL=y CONFIG_MPSL_FEM=y CONFIG_MPSL_FEM_SIMPLE_GPIO=y CONFIG_BT_CTLR_TX_PWR_ANTENNA=13
my main.c:
/*
* Copyright (c) 2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/** @file
* @brief Nordic Distance Measurement sample
*/
#include <stdint.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <bluetooth/scan.h>
#include <bluetooth/services/ddfs.h>
#include <dm.h>
#include "peer.h"
#include "service.h"
#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)
#define RUN_LED_BLINK_INTERVAL 1000
#define SUPPORT_DM_CODE 0xFF55AA5A
struct adv_mfg_data {
uint16_t company_code; /* Company Identifier Code. */
uint32_t support_dm_code; /* To identify the device that supports distance measurement. */
uint32_t rng_seed; /* Random seed used for generating hopping patterns. */
} __packed;
static struct adv_mfg_data mfg_data;
struct bt_le_adv_param adv_param_conn =
BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_CONNECTABLE |
BT_LE_ADV_OPT_NOTIFY_SCAN_REQ,
BT_GAP_ADV_FAST_INT_MIN_2,
BT_GAP_ADV_FAST_INT_MAX_2,
NULL);
struct bt_le_adv_param adv_param_noconn =
BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_USE_IDENTITY |
BT_LE_ADV_OPT_SCANNABLE |
BT_LE_ADV_OPT_NOTIFY_SCAN_REQ,
BT_GAP_ADV_FAST_INT_MIN_2,
BT_GAP_ADV_FAST_INT_MAX_2,
NULL);
static struct bt_le_adv_param *adv_param = &adv_param_conn;
static const struct bt_data ad[] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};
static const struct bt_data sd[] = {
BT_DATA(BT_DATA_MANUFACTURER_DATA, (unsigned char *)&mfg_data, sizeof(mfg_data)),
BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_DDFS_VAL),
};
static struct bt_le_scan_param scan_param = {
.type = BT_LE_SCAN_TYPE_ACTIVE,
.interval = BT_GAP_SCAN_FAST_INTERVAL,
.window = BT_GAP_SCAN_FAST_WINDOW,
.options = BT_LE_SCAN_OPT_NONE,
.timeout = 0,
};
static struct bt_scan_init_param scan_init = {
.connect_if_match = 0,
.scan_param = &scan_param,
.conn_param = NULL
};
static uint32_t scanner_random_share;
static struct bt_le_ext_adv *adv;
static void adv_work_handle(struct k_work *item);
static K_WORK_DEFINE(adv_work, adv_work_handle);
static void adv_update_data(void);
static uint32_t scanner_addr_to_random_share(const bt_addr_t *p_scanner_addr);
static uint32_t get_id_addr_random_share(void);
static struct bt_scan_manufacturer_data scan_mfg_data = {
.data = (unsigned char *)&mfg_data,
.data_len = sizeof(mfg_data.company_code) + sizeof(mfg_data.support_dm_code),
};
static bool data_cb(struct bt_data *data, void *user_data)
{
static struct adv_mfg_data *recv_mfg_data;
static struct dm_request req;
switch (data->type) {
case BT_DATA_MANUFACTURER_DATA:
if (sizeof(struct adv_mfg_data) == data->data_len) {
recv_mfg_data = (struct adv_mfg_data *)data->data;
bt_addr_le_copy(&req.bt_addr, user_data);
req.role = DM_ROLE_INITIATOR;
req.ranging_mode = peer_ranging_mode_get();
/* We need to make sure that we only initiate a ranging to a single peer.
* A scan response that is received by this device can be received by
* multiple other devices which can all start a ranging at the same time
* as a consequence. To prevent this, we need to make sure that we set a
* per-peer random as the random seed. This helps the ranging library to
* avoid interference from other devices trying to range at the same time.
*
* This means that the initiator and the reflector need to set the same
* value for the random seed.
*/
req.rng_seed =
sys_le32_to_cpu(recv_mfg_data->rng_seed) + scanner_random_share;
req.start_delay_us = 0;
req.extra_window_time_us = 0;
dm_request_add(&req);
}
return false;
default:
return true;
}
}
static uint32_t get_id_addr_random_share(void)
{
bt_addr_le_t addrs[CONFIG_BT_ID_MAX];
size_t count = CONFIG_BT_ID_MAX;
bt_id_get(addrs, &count);
__ASSERT(count == 1, "The sample assumes a single ID addr");
return scanner_addr_to_random_share(&addrs[0].a);
}
static uint32_t scanner_addr_to_random_share(const bt_addr_t *p_scanner_addr)
{
return (p_scanner_addr->val[0] | p_scanner_addr->val[1] << 8 |
p_scanner_addr->val[2] << 16 | p_scanner_addr->val[3] << 24) +
(p_scanner_addr->val[4] | p_scanner_addr->val[5] << 8);
}
static void scan_filter_match(struct bt_scan_device_info *device_info,
struct bt_scan_filter_match *filter_match,
bool connectable)
{
static bt_addr_le_t addr;
bt_addr_le_copy(&addr, device_info->recv_info->addr);
peer_supported_add(device_info->recv_info->addr);
bt_data_parse(device_info->adv_data, data_cb, &addr);
}
BT_SCAN_CB_INIT(scan_cb, scan_filter_match, NULL, NULL, NULL);
static void adv_scanned_cb(struct bt_le_ext_adv *adv,
struct bt_le_ext_adv_scanned_info *info)
{
static struct dm_request req;
if (peer_supported_test(info->addr)) {
bt_addr_le_copy(&req.bt_addr, info->addr);
req.role = DM_ROLE_REFLECTOR;
req.ranging_mode = peer_ranging_mode_get();
/* We need to make sure that we only initiate a ranging to a single peer.
* A scan response from this device can be received by multiple peers which can
* all start a ranging at the same time as a consequence. To prevent this,
* we need to make sure that we set a per-peer random as the random seed.
* This helps the ranging library to avoid interference from other devices
* trying to range at the same time.
*
* This means that the initiator and the reflector need to set the same value
* for the random seed.
*/
req.rng_seed = peer_rng_seed_get() + scanner_addr_to_random_share(&info->addr->a);
req.start_delay_us = 0;
req.extra_window_time_us = 0;
dm_request_add(&req);
adv_update_data();
}
}
const static struct bt_le_ext_adv_cb adv_cb = {
.scanned = adv_scanned_cb,
};
static void adv_update_data(void)
{
int err;
if (!adv) {
return;
}
mfg_data.rng_seed = peer_rng_seed_prepare();
err = bt_le_ext_adv_set_data(adv, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
if (err) {
printk("Failed setting adv data (err %d)\n", err);
}
}
static int adv_start(void)
{
int err;
struct bt_le_ext_adv_start_param ext_adv_start_param = {0};
if (adv) {
err = bt_le_ext_adv_stop(adv);
if (err) {
printk("Failed to stop extended advertising (err %d)\n", err);
return err;
}
err = bt_le_ext_adv_delete(adv);
if (err) {
printk("Failed to delete advertising set (err %d)\n", err);
return err;
}
}
err = bt_le_ext_adv_create(adv_param, &adv_cb, &adv);
if (err) {
printk("Failed to create advertising set (err %d)\n", err);
return err;
}
err = bt_le_ext_adv_set_data(adv, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
if (err) {
printk("Failed setting adv data (err %d)\n", err);
return err;
}
err = bt_le_ext_adv_start(adv, &ext_adv_start_param);
if (err) {
printk("Failed to start extended advertising (err %d)\n", err);
return err;
}
return err;
}
static int scan_start(void)
{
int err;
bt_scan_init(&scan_init);
bt_scan_cb_register(&scan_cb);
err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_MANUFACTURER_DATA, &scan_mfg_data);
if (err) {
printk("Scanning filters cannot be set (err %d)\n", err);
return err;
}
err = bt_scan_filter_enable(BT_SCAN_MANUFACTURER_DATA_FILTER, false);
if (err) {
printk("Filters cannot be turned on (err %d)\n", err);
return err;
}
scanner_random_share = get_id_addr_random_share();
err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
if (err) {
printk("Scanning failed to start (err %d)\n", err);
return err;
}
return err;
}
static void adv_work_handle(struct k_work *item)
{
adv_start();
}
static void connected(struct bt_conn *conn, uint8_t conn_err)
{
adv_param = &adv_param_noconn;
k_work_submit(&adv_work);
}
static void disconnected(struct bt_conn *conn, uint8_t reason)
{
adv_param = &adv_param_conn;
k_work_submit(&adv_work);
}
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
};
static int bt_sync_init(void)
{
/* Synchronisation is based on advertising and scanning modes.
* It occurs when SCAN_REQ and SCAN_RESP packets are exchanged.
*/
int err;
printk("DM Bluetooth LE Synchronization initialization\n");
mfg_data.company_code = sys_cpu_to_le16(CONFIG_BT_COMPANY_ID_NORDIC);
mfg_data.support_dm_code = sys_cpu_to_le32(SUPPORT_DM_CODE);
mfg_data.rng_seed = sys_cpu_to_le32(peer_rng_seed_prepare());
err = adv_start();
if (err) {
printk("Failed to start advertising (err %d)\n", err);
return err;
}
err = scan_start();
if (err) {
printk("Failed to start scanning (err %d)\n", err);
}
return err;
}
static void data_ready(struct dm_result *result)
{
if (result->status) {
peer_update(result);
}
}
static struct dm_cb dm_cb = {
.data_ready = data_ready,
};
int main(void)
{
int err;
static struct dm_init_param init_param;
printk("Starting Distance Measurement example\n");
err = peer_init();
if (err) {
printk("Peer init failed (err %d)\n", err);
return 0;
}
init_param.cb = &dm_cb;
err = dm_init(&init_param);
if (err) {
printk("Distance measurement init failed (err %d)\n", err);
return 0;
}
err = service_ddfs_init();
if (err) {
printk("DDF Service init failed (err %d)\n", err);
return 0;
}
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init failed (err %d)\n", err);
return 0;
}
err = bt_sync_init();
if (err) {
printk("Synchronisation init failed (err %d)\n", err);
return 0;
}
for (;;) {
k_sleep(K_MSEC(RUN_LED_BLINK_INTERVAL));
service_azimuth_elevation_simulation();
}
}
Someone can help me? Tanks a lot.