Can nRF52833 perform PAwR while also syncing to another PAwR device

Hi Nordic team,

We are developing two types of devices based on the Zephyr examples:

  1. periodic_adv_rsp

  2. periodic_sync_rsp

Our design uses the following PAwR configuration:

  • SUBEVENTS_INTERVAL = 20 (25ms)

  • NUM_SUBEVENTS = 5

  • Interval min/max = 100 (125ms)

  • Response slots = 1

We have modified the periodic_adv_rsp example so that it also syncs to another PAwR advertiser, but does not send any response back — it simply listens. In other words, this advertiser is also acting as a PAwR observer.

Here’s how we handle syncing:

  • When scanning, upon detecting a periodic advertiser, we call bt_le_per_adv_sync_create.

  • In the sync callback, we use bt_le_per_adv_sync_subevent to subscribe to all 5 subevents.

/*
 * Copyright (c) 2023 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/bluetooth/att.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/hci.h>

#include <zephyr/sys/util.h>
#include <zephyr/sys/byteorder.h>
#include <zephyr/logging/log.h>
#include <zephyr/drivers/flash.h>

#include <nrfx.h>
#include <dk_buttons_and_leds.h>

LOG_MODULE_REGISTER(main_app, CONFIG_MAIN_APP_LOG_LEVEL);

#define NUM_SUBEVENTS 		5
#define SUBEVENTS_INTERVAL 	20
#define PACKET_SIZE   		48
#define NAME_LEN      		30

#define DEVICE_NAME			CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN		(sizeof(DEVICE_NAME) - 1)

#define UWB_THREAD_STACK_SIZE 4096
#define UWB_THREAD_PRIORITY   5

K_THREAD_STACK_DEFINE(uwb_stack, UWB_THREAD_STACK_SIZE);
struct k_thread uwb_thread_data;
uint64_t eui64_from_device = 0;

static bool         per_adv_found;
static bt_addr_le_t per_addr;
static uint16_t per_adv_sync_timeout;
static uint8_t      per_sid;
static struct bt_le_per_adv_sync *default_sync;


static K_SEM_DEFINE(sem_per_adv, 0, 1);
static K_SEM_DEFINE(sem_per_sync, 0, 1);
static K_SEM_DEFINE(sem_per_sync_lost, 0, 1);

static K_SEM_DEFINE(sem_connected, 0, 1);
static K_SEM_DEFINE(sem_discovered, 0, 1);
static K_SEM_DEFINE(sem_written, 0, 1);
static K_SEM_DEFINE(sem_disconnected, 0, 1);

struct k_poll_event events[] = {
	K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_SEM_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY,
					&sem_connected, 0),
	K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_SEM_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY,
					&sem_per_adv, 0),
	K_POLL_EVENT_STATIC_INITIALIZER(K_POLL_TYPE_SEM_AVAILABLE, K_POLL_MODE_NOTIFY_ONLY,
					&sem_per_sync_lost, 0),
};

static struct bt_uuid_128 pawr_char_uuid =
	BT_UUID_INIT_128(BT_UUID_128_ENCODE(0x12345678, 0x1234, 0x5678, 0x1234, 0x56789abcdef1));
static uint16_t pawr_attr_handle;
static const struct bt_le_per_adv_param per_adv_params = {
	.interval_min = (SUBEVENTS_INTERVAL * NUM_SUBEVENTS),
	.interval_max = (SUBEVENTS_INTERVAL * NUM_SUBEVENTS),
	.options = 0,
	.num_subevents = NUM_SUBEVENTS,
	.subevent_interval = SUBEVENTS_INTERVAL,
	.response_slot_delay = SUBEVENTS_INTERVAL - 2,
	.response_slot_spacing = 5,
	.num_response_slots = 1,
};

static struct bt_le_per_adv_subevent_data_params subevent_data_params[NUM_SUBEVENTS];
static struct net_buf_simple bufs[NUM_SUBEVENTS];
static uint8_t backing_store[NUM_SUBEVENTS][PACKET_SIZE];

BUILD_ASSERT(ARRAY_SIZE(bufs) == ARRAY_SIZE(subevent_data_params));
BUILD_ASSERT(ARRAY_SIZE(backing_store) == ARRAY_SIZE(subevent_data_params));

static uint32_t counter;
static uint32_t recv_counter;

struct bt_le_adv_param adv_param_noconn =
	BT_LE_ADV_PARAM_INIT(BT_LE_ADV_OPT_EXT_ADV,
			     BT_GAP_ADV_FAST_INT_MIN_1,
			     BT_GAP_ADV_FAST_INT_MAX_1,
			     NULL);

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 struct bt_le_scan_param scan_param = {
	.type     = BT_LE_SCAN_TYPE_ACTIVE,
	.interval = BT_GAP_SCAN_FAST_INTERVAL_MIN,
	.window   = BT_GAP_SCAN_FAST_WINDOW,
	.options  = BT_LE_SCAN_OPT_FILTER_DUPLICATE,
	.timeout  = 0,
};

static const char *phy2str(uint8_t phy)
{
	switch (phy) {
	case 0: return "No packets";
	case BT_GAP_LE_PHY_1M: return "LE 1M";
	case BT_GAP_LE_PHY_2M: return "LE 2M";
	case BT_GAP_LE_PHY_CODED: return "LE Coded";
	default: return "Unknown";
	}
}

static void request_cb(struct bt_le_ext_adv *adv, const struct bt_le_per_adv_data_request *request)
{
	int err;
	uint8_t to_send;
	struct net_buf_simple *buf;

	to_send = MIN(request->count, ARRAY_SIZE(subevent_data_params));

	for (size_t i = 0; i < to_send; i++) {
		buf = &bufs[i];
		buf->data[buf->len - 1] = (counter++) & 0xFF;

		subevent_data_params[i].subevent =
			(request->start + i) % per_adv_params.num_subevents;
		subevent_data_params[i].response_slot_start = 0;
		subevent_data_params[i].response_slot_count = 1;
		subevent_data_params[i].data = buf;
	}

	err = bt_le_per_adv_set_subevent_data(adv, to_send, subevent_data_params);
	if (err) {
		LOG_ERR("Failed to set subevent data (err %d)", err);
	} else {
		// LOG_INF("Subevent data set %u", counter);
	}
}

static bool print_ad_field(struct bt_data *data, void *user_data)
{
	ARG_UNUSED(user_data);

	LOG_DBG("Type: 0x%02X Len: %u", data->type, data->data_len);
	LOG_HEXDUMP_DBG(data->data, data->data_len, "response_cb");

	uint64_t eui64_tag;
	memcpy(&eui64_tag, &data->data[8], sizeof(eui64_tag));

	if (user_data) {
		memcpy(user_data, &eui64_tag, sizeof(eui64_tag));
	}

	return true;
}

static struct bt_conn *default_conn;

static void response_cb(struct bt_le_ext_adv *adv, struct bt_le_per_adv_response_info *info,
		     			struct net_buf_simple *buf)
{
	if (buf) {
		uint64_t eui64_tag_response = 0;
		bt_data_parse(buf, print_ad_field, &eui64_tag_response);
		LOG_INF("Response %llX: subevent %d, slot %d", eui64_tag_response, info->subevent, info->response_slot);
	}
}

static const struct bt_le_ext_adv_cb adv_cb = {
	.pawr_data_request = request_cb,
	.pawr_response = response_cb,
};

void connected_cb(struct bt_conn *conn, uint8_t err)
{
	LOG_INF("Connected (err 0x%02X)", err);

	__ASSERT(conn == default_conn, "Unexpected connected callback");

	if (err) {
		bt_conn_unref(default_conn);
		default_conn = NULL;
	}
}

void disconnected_cb(struct bt_conn *conn, uint8_t reason)
{
	LOG_INF("Disconnected, reason 0x%02X %s", reason, bt_hci_err_to_str(reason));

	k_sem_give(&sem_disconnected);
}

void remote_info_available_cb(struct bt_conn *conn, struct bt_conn_remote_info *remote_info)
{
	/* Need to wait for remote info before initiating PAST */
	k_sem_give(&sem_connected);
}

BT_CONN_CB_DEFINE(conn_cb) = {
	.connected = connected_cb,
	.disconnected = disconnected_cb,
	.remote_info_available = remote_info_available_cb,
};

static bool data_cb(struct bt_data *data, void *user_data)
{
	char *name = user_data;
	uint8_t len;

	switch (data->type) {
	case BT_DATA_NAME_SHORTENED:
	case BT_DATA_NAME_COMPLETE:
		len = MIN(data->data_len, NAME_LEN - 1);
		memcpy(name, data->data, len);
		name[len] = '\0';
		return true;

	default:
		return true;
	}
}

static void scan_recv(const struct bt_le_scan_recv_info *info,
					struct net_buf_simple *buf)
{
	char le_addr[BT_ADDR_LE_STR_LEN];
	char name[NAME_LEN];
	int err;

	if (default_conn) {
		return;
	}

	(void)memset(name, 0, sizeof(name));
	bt_data_parse(buf, data_cb, name);

	bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));
	LOG_INF("[DEVICE]: %s, AD evt type %u, Tx Pwr: %i, RSSI %i %s "
	       "C:%u S:%u D:%u SR:%u E:%u Prim: %s, Secn: %s, "
	       "Interval: 0x%04x (%u ms), SID: %u",
	       le_addr, info->adv_type, info->tx_power, info->rssi, name,
	       (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) != 0,
	       (info->adv_props & BT_GAP_ADV_PROP_SCANNABLE) != 0,
	       (info->adv_props & BT_GAP_ADV_PROP_DIRECTED) != 0,
	       (info->adv_props & BT_GAP_ADV_PROP_SCAN_RESPONSE) != 0,
	       (info->adv_props & BT_GAP_ADV_PROP_EXT_ADV) != 0,
	       phy2str(info->primary_phy), phy2str(info->secondary_phy),
	       info->interval, info->interval * 5 / 4, info->sid);

	// /* We're only interested in connectable events */
	// if (info->adv_type != BT_GAP_ADV_TYPE_ADV_IND && info->adv_type != BT_GAP_ADV_TYPE_ADV_DIRECT_IND) {
	// 	return;
	// }

	if (strcmp(name, "PAwR sync sample") == 0) {
		LOG_INF("Found PAwR sync sample");

		if (bt_le_scan_stop()) {
			LOG_INF("Stop scan error");
			return;
		}
		LOG_INF("Connect to tag");

		err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, BT_LE_CONN_PARAM_DEFAULT,
					&default_conn);
		if (err) {
			LOG_ERR("Create conn to %s failed (%u)", le_addr, err);
		}
	} else if (strcmp(name, "PAwR adv sample") == 0) {
		LOG_INF("Found PAwR adv sample");

		if (bt_le_scan_stop()) {
			LOG_INF("Stop scan error");
			return;
		}

		if (info->interval) {
			LOG_INF("Found int: %u", info->interval);
		}

		if (!per_adv_found && info->interval) {
			uint32_t interval_us;
			uint32_t timeout;

			per_adv_found = true;
			recv_counter = 0;

			/* Add retries and convert to unit in 10's of ms */
			interval_us = BT_GAP_PER_ADV_INTERVAL_TO_US(info->interval);

			timeout = BT_GAP_US_TO_PER_ADV_SYNC_TIMEOUT(interval_us);

			/* 4 attempts */
			timeout *= 4;

			/* Enforce restraints */
			per_adv_sync_timeout =
				CLAMP(timeout, BT_GAP_PER_ADV_MIN_TIMEOUT, BT_GAP_PER_ADV_MAX_TIMEOUT);

			per_sid = info->sid;
			bt_addr_le_copy(&per_addr, info->addr);

			LOG_INF("per_adv_found: %u", per_adv_found);
			k_sem_give(&sem_per_adv);
		}
	}
}

static struct bt_le_scan_cb scan_callbacks = {
	.recv = scan_recv,
};

static void sync_cb(struct bt_le_per_adv_sync *sync,
		    struct bt_le_per_adv_sync_synced_info *info)
{
	char le_addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));

	LOG_INF("PER_ADV_SYNC[%u]: [DEVICE]: %s synced, "
	       "Interval 0x%04x (%u ms), PHY %s",
	       bt_le_per_adv_sync_get_index(sync), le_addr,
	       info->interval, info->interval * 5 / 4, phy2str(info->phy));


	struct bt_le_per_adv_sync_subevent_params params;
	uint8_t subevents[256];
	int err;
	LOG_INF("Synced to %s with %d subevents", le_addr, info->num_subevents);

	default_sync = sync;

	for (size_t i = 0; i < info->num_subevents; i++) {
		subevents[i] = i;
	}

	params.properties = 0;
	params.num_subevents = info->num_subevents;
	params.subevents = subevents;

	err = bt_le_per_adv_sync_subevent(sync, &params);
	if (err) {
		LOG_ERR("Failed to set subevents to sync to (err %d)", err);
	} else {
		LOG_INF("Changed sync to all subevents %u", info->num_subevents);
	}

	k_sem_give(&sem_per_sync);
}

static void term_cb(struct bt_le_per_adv_sync *sync,
		    const struct bt_le_per_adv_sync_term_info *info)
{
	char le_addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));

	LOG_INF("PER_ADV_SYNC[%u]: [DEVICE]: %s sync terminated",
	       bt_le_per_adv_sync_get_index(sync), le_addr);

	k_sem_give(&sem_per_sync_lost);
}

static void recv_cb(struct bt_le_per_adv_sync *sync,
		    const struct bt_le_per_adv_sync_recv_info *info,
		    struct net_buf_simple *buf)
{
	char le_addr[BT_ADDR_LE_STR_LEN];
	char data_str[129];
	static int64_t last_ticks = 0;
	int64_t now_ticks = k_uptime_ticks();

	bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));
	bin2hex(buf->data, buf->len, data_str, sizeof(data_str));

	if (buf->len == PACKET_SIZE) {
		LOG_INF("Ticks: %5lld Sub: %u, Count: %u,[DEVICE]: %s, tx_power %i, "
			"RSSI %i, CTE %u, data length %u, data: %s", (now_ticks - last_ticks), info->subevent,
			info->periodic_event_counter, le_addr, info->tx_power,
			info->rssi, info->cte_type, buf->len, data_str);

		// if (recv_counter > 0 && ((now_ticks - last_ticks) > 4096)) {
		// 	LOG_INF("Delete Periodic Advertising?: %u", recv_counter);
		// 	int err = bt_le_per_adv_sync_delete(default_sync);
		// 	if (err) {
		// 		LOG_INF("Deleting Periodic Advertising Sync failed (err %d)", err);
		// 	}
		// }

		last_ticks = now_ticks;
	}

	if (buf && buf->len) {
		LOG_HEXDUMP_DBG(buf->data, buf->len, "Recieved Data");
		recv_counter++;
	} else if (buf) {
		LOG_INF("Received empty indication: subevent %d", info->subevent);
	} else {
		LOG_WRN("Failed to receive indication: subevent %d", info->subevent);
	}
}

static struct bt_le_per_adv_sync_cb sync_callbacks = {
	.synced = sync_cb,
	.term = term_cb,
	.recv = recv_cb
};

static uint8_t discover_func(struct bt_conn *conn, const struct bt_gatt_attr *attr,
			     struct bt_gatt_discover_params *params)
{
	struct bt_gatt_chrc *chrc;
	char str[BT_UUID_STR_LEN];

	LOG_INF("Discovery: attr %p", attr);

	if (!attr) {
		return BT_GATT_ITER_STOP;
	}

	chrc = (struct bt_gatt_chrc *)attr->user_data;

	bt_uuid_to_str(chrc->uuid, str, sizeof(str));
	LOG_INF("UUID %s", str);

	if (!bt_uuid_cmp(chrc->uuid, &pawr_char_uuid.uuid)) {
		pawr_attr_handle = chrc->value_handle;

		LOG_INF("Characteristic handle: %d", pawr_attr_handle);

		k_sem_give(&sem_discovered);
	}

	return BT_GATT_ITER_STOP;
}

static void write_func(struct bt_conn *conn, uint8_t err, struct bt_gatt_write_params *params)
{
	if (err) {
		LOG_ERR("Write failed (err %d)", err);
		return;
	}

	k_sem_give(&sem_written);
}

void init_bufs(void)
{
	for (size_t i = 0; i < ARRAY_SIZE(backing_store); i++) {
		backing_store[i][0] = ARRAY_SIZE(backing_store[i]) - 1;
		backing_store[i][1] = BT_DATA_MANUFACTURER_DATA;
		backing_store[i][2] = 0x59; /* Nordic */
		backing_store[i][3] = 0x00;

		memcpy(&backing_store[i][4], &eui64_from_device, sizeof(eui64_from_device));

		for (size_t j = 12; j < PACKET_SIZE; j++) {
			backing_store[i][j] = 0x00;
		}

		net_buf_simple_init_with_data(&bufs[i], &backing_store[i],
					      ARRAY_SIZE(backing_store[i]));
	}
}

struct pawr_timing {
	uint8_t subevent;
	uint8_t response_slot;
} __packed;

static uint8_t num_synced;

int main(void)
{
	int err;
	struct bt_le_ext_adv *pawr_adv;
	struct bt_gatt_discover_params discover_params;
	struct bt_gatt_write_params write_params;
	struct pawr_timing sync_config;
	struct bt_le_per_adv_sync_param sync_create_param;
	struct bt_le_per_adv_sync *sync;

	dk_leds_init();

	init_bufs();

	LOG_INF("Starting Periodic Advertising Demo");

	/* Initialize the Bluetooth Subsystem */
	err = bt_enable(NULL);
	if (err) {
		LOG_ERR("Bluetooth init failed (err %d)", err);
		return 0;
	}

	err = bt_le_scan_cb_register(&scan_callbacks);
	if (err) {
		LOG_ERR("Failed to register scanning callbacks (err %d)", err);
		return 0;
	}

	/* Create a non-connectable advertising set */
	err = bt_le_ext_adv_create(&adv_param_noconn, &adv_cb, &pawr_adv);
	if (err) {
		LOG_ERR("Failed to create advertising set (err %d)", err);
		return 0;
	}

	/* Set periodic advertising parameters */
	err = bt_le_per_adv_set_param(pawr_adv, &per_adv_params);
	if (err) {
		LOG_ERR("Failed to set periodic advertising parameters (err %d)", err);
		return 0;
	}

	/* Enable Periodic Advertising */
	LOG_INF("Start Periodic Advertising");
	err = bt_le_per_adv_start(pawr_adv);
	if (err) {
		LOG_ERR("Failed to enable periodic advertising (err %d)", err);
		return 0;
	}

	/* Set extended advertising parameters */
	err = bt_le_ext_adv_set_data(pawr_adv, ad, ARRAY_SIZE(ad), NULL, 0);
	if (err) {
		LOG_ERR("Failed setting adv data (err %d)", err);
		return err;
	}

	LOG_INF("Start Extended Advertising");
	err = bt_le_ext_adv_start(pawr_adv, BT_LE_EXT_ADV_START_DEFAULT);
	if (err) {
		LOG_ERR("Failed to start extended advertising (err %d)", err);
		return 0;
	}

	LOG_INF("Periodic Advertising callbacks register...");
	bt_le_per_adv_sync_cb_register(&sync_callbacks);
	LOG_INF("Success.");

	while (true) {
		/* Enable continuous scanning */
		bt_le_scan_stop();
		err = bt_le_scan_start(&scan_param, NULL);
		if (err) {
			LOG_ERR("Scanning failed to start (err %d)", err);
			return 0;
		}

		LOG_INF("Scanning successfully started");

		/* Wait for either remote info available or involuntary disconnect */
		k_poll(events, ARRAY_SIZE(events), K_FOREVER);
		if (events[0].state == K_POLL_STATE_SEM_AVAILABLE) {
			k_poll_signal_reset(events[0].signal);
			events[0].state = K_POLL_STATE_NOT_READY;

			err = bt_le_per_adv_set_info_transfer(pawr_adv, default_conn, 0);
			if (err) {
				LOG_ERR("Failed to send PAST (err %d)", err);
				goto disconnect;
			}

			LOG_INF("PAST sent");

			discover_params.uuid = &pawr_char_uuid.uuid;
			discover_params.func = discover_func;
			discover_params.start_handle = BT_ATT_FIRST_ATTRIBUTE_HANDLE;
			discover_params.end_handle = BT_ATT_LAST_ATTRIBUTE_HANDLE;
			discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC;
			err = bt_gatt_discover(default_conn, &discover_params);
			if (err) {
				LOG_ERR("Discovery failed (err %d)", err);
				goto disconnect;
			}

			LOG_INF("Discovery started");

			err = k_sem_take(&sem_discovered, K_SECONDS(10));
			if (err) {
				LOG_ERR("Timed out during GATT discovery");
				goto disconnect;
			}

			sync_config.subevent = num_synced % NUM_SUBEVENTS;
			sync_config.response_slot = num_synced / NUM_SUBEVENTS;
			num_synced++;

			write_params.func = write_func;
			write_params.handle = pawr_attr_handle;
			write_params.offset = 0;
			write_params.data = &sync_config;
			write_params.length = sizeof(sync_config);

			err = bt_gatt_write(default_conn, &write_params);
			if (err) {
				LOG_ERR("Write failed (err %d)", err);
				num_synced--;
				goto disconnect;
			}

			LOG_INF("Write started");

			err = k_sem_take(&sem_written, K_SECONDS(10));
			if (err) {
				LOG_ERR("Timed out during GATT write");
				num_synced--;
				goto disconnect;
			}

			LOG_INF("PAwR config written to sync %d, disconnecting", num_synced - 1);

	disconnect:
			/* Adding delay (2ms * interval value, using 2ms intead of the 1.25ms
			* used by controller) to ensure sync is established before
			* disconnection.
			*/
			k_sleep(K_MSEC(per_adv_params.interval_max * 2));

			err = bt_conn_disconnect(default_conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
			if (err != 0 && err != -ENOTCONN) {
				return 0;
			}

			k_sem_take(&sem_disconnected, K_FOREVER);

			bt_conn_unref(default_conn);
			default_conn = NULL;
		}

		if (events[1].state == K_POLL_STATE_SEM_AVAILABLE) {
			k_poll_signal_reset(events[1].signal);
			events[1].state = K_POLL_STATE_NOT_READY;
			LOG_INF("Found periodic advertising.");
		
			bt_addr_le_copy(&sync_create_param.addr, &per_addr);
			sync_create_param.options = 0;
			sync_create_param.sid = per_sid;
			sync_create_param.skip = 1;
			sync_create_param.timeout = per_adv_sync_timeout;

			LOG_INF("Creating Periodic Advertising Sync Timeout: %u (unit of 10ms)", sync_create_param.timeout);
			err = bt_le_per_adv_sync_create(&sync_create_param, &sync);
			if (err) {
				LOG_INF("failed (err %d)", err);
				return 0;
			}
			LOG_INF("success.");

			err = k_sem_take(&sem_per_sync, K_MSEC(per_adv_sync_timeout*10));
			if (err) {
				LOG_INF("Waiting for periodic sync failed (err %d)", err);
				per_adv_found = false;
				err = bt_le_per_adv_sync_delete(sync);
				if (err) {
					LOG_INF("Deleting Periodic Advertising Sync failed (err %d)", err);
					return 0;
				}
				LOG_INF("Deleting Periodic Advertising Sync done");
				continue;
			}

			LOG_INF("Sync done.");
		}

		if (events[2].state == K_POLL_STATE_SEM_AVAILABLE) {
			k_poll_signal_reset(events[2].signal);
			events[2].state = K_POLL_STATE_NOT_READY;
			LOG_INF("Periodic sync lost, retrying...");
			per_adv_found = false;
			continue;
		}
	}

	return 0;
}

Everything works as expected in many cases, but we notice a strange issue:

[00:01:02.955,718] <inf> main_app: Ticks:   819 Sub: 1, Count: 562,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5
[00:01:02.980,743] <inf> main_app: Ticks:   819 Sub: 2, Count: 562,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6
[00:01:03.005,737] <inf> main_app: Ticks:   819 Sub: 3, Count: 562,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7
[00:01:03.030,731] <inf> main_app: Ticks:   820 Sub: 4, Count: 562,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8
[00:01:03.055,725] <inf> main_app: Ticks:   819 Sub: 0, Count: 563,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f9
[00:01:03.080,749] <inf> main_app: Ticks:   819 Sub: 1, Count: 563,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa
[00:01:03.105,743] <inf> main_app: Ticks:   819 Sub: 2, Count: 563,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb
[00:01:03.130,737] <inf> main_app: Ticks:   820 Sub: 3, Count: 563,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc
[00:01:03.155,731] <inf> main_app: Ticks:   819 Sub: 4, Count: 563,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd
[00:01:03.180,755] <inf> main_app: Ticks:   819 Sub: 0, Count: 564,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe
[00:01:03.205,749] <inf> main_app: Ticks:   819 Sub: 1, Count: 564,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff
[00:01:03.230,743] <inf> main_app: Ticks:   820 Sub: 2, Count: 564,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
[00:01:03.255,737] <inf> main_app: Ticks:   819 Sub: 3, Count: 564,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
[00:01:03.280,761] <inf> main_app: Ticks:   819 Sub: 4, Count: 564,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002
[00:01:03.305,755] <inf> main_app: Ticks:   819 Sub: 0, Count: 565,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003
[00:01:03.330,749] <inf> main_app: Ticks:   820 Sub: 1, Count: 565,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
[00:01:03.380,767] <inf> main_app: Ticks:  1638 Sub: 3, Count: 565,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006
[00:01:03.405,761] <inf> main_app: Ticks:   819 Sub: 4, Count: 565,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007
[00:01:03.430,755] <inf> main_app: Ticks:   820 Sub: 0, Count: 566,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008
[00:01:03.505,828] <inf> main_app: Ticks:  2459 Sub: 3, Count: 566,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b
[00:01:03.780,792] <inf> main_app: Ticks:  9010 Sub: 4, Count: 568,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016
[00:01:04.055,816] <inf> main_app: Ticks:  9012 Sub: 0, Count: 571,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021
[00:01:04.330,841] <inf> main_app: Ticks:  9012 Sub: 1, Count: 573,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c
[00:01:04.605,865] <inf> main_app: Ticks:  9012 Sub: 2, Count: 575,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037
[00:01:04.880,859] <inf> main_app: Ticks:  9012 Sub: 3, Count: 577,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042
[00:01:05.155,883] <inf> main_app: Ticks:  9012 Sub: 4, Count: 579,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d
[00:01:05.430,908] <inf> main_app: Ticks:  9011 Sub: 0, Count: 582,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058
[00:01:05.705,963] <inf> main_app: Ticks:  9014 Sub: 1, Count: 584,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063
[00:01:05.980,957] <inf> main_app: Ticks:  9010 Sub: 2, Count: 586,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000006e
[00:01:06.256,011] <inf> main_app: Ticks:  9013 Sub: 3, Count: 588,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079
[00:01:06.530,975] <inf> main_app: Ticks:  9010 Sub: 4, Count: 590,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084
[00:01:06.805,999] <inf> main_app: Ticks:  9012 Sub: 0, Count: 593,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f
[00:01:07.081,024] <inf> main_app: Ticks:  9012 Sub: 1, Count: 595,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a
[00:01:07.356,048] <inf> main_app: Ticks:  9012 Sub: 2, Count: 597,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5
[00:01:07.631,103] <inf> main_app: Ticks:  9013 Sub: 3, Count: 599,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0
[00:01:07.906,066] <inf> main_app: Ticks:  9010 Sub: 4, Count: 601,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb
[00:01:08.181,091] <inf> main_app: Ticks:  9012 Sub: 0, Count: 604,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c6
[00:01:08.456,085] <inf> main_app: Ticks:  9012 Sub: 1, Count: 606,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1
[00:01:08.731,109] <inf> main_app: Ticks:  9011 Sub: 2, Count: 608,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc
[00:01:09.006,134] <inf> main_app: Ticks:  9013 Sub: 3, Count: 610,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7
[00:01:09.281,158] <inf> main_app: Ticks:  9011 Sub: 4, Count: 612,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2
[00:01:09.556,213] <inf> main_app: Ticks:  9014 Sub: 0, Count: 615,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fd
[00:01:09.831,207] <inf> main_app: Ticks:  9010 Sub: 1, Count: 617,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008
[00:01:10.106,201] <inf> main_app: Ticks:  9012 Sub: 2, Count: 619,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013
[00:01:10.381,225] <inf> main_app: Ticks:  9012 Sub: 3, Count: 621,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e
[00:01:10.656,250] <inf> main_app: Ticks:  9011 Sub: 4, Count: 623,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029
[00:01:10.931,274] <inf> main_app: Ticks:  9012 Sub: 0, Count: 626,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034
[00:01:11.206,329] <inf> main_app: Ticks:  9013 Sub: 1, Count: 628,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f
[00:01:11.481,292] <inf> main_app: Ticks:  9011 Sub: 2, Count: 630,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000004a
[00:01:11.756,317] <inf> main_app: Ticks:  9012 Sub: 3, Count: 632,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055
[00:01:12.031,341] <inf> main_app: Ticks:  9011 Sub: 4, Count: 634,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060
[00:01:12.306,365] <inf> main_app: Ticks:  9012 Sub: 0, Count: 637,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b
[00:01:12.581,390] <inf> main_app: Ticks:  9012 Sub: 1, Count: 639,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076
[00:01:12.856,384] <inf> main_app: Ticks:  9012 Sub: 2, Count: 641,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081
[00:01:13.131,408] <inf> main_app: Ticks:  9011 Sub: 3, Count: 643,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -38, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c
[00:01:13.406,433] <inf> main_app: Ticks:  9012 Sub: 4, Count: 645,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097
[00:01:13.681,457] <inf> main_app: Ticks:  9012 Sub: 0, Count: 648,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -44, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a2
[00:01:13.956,512] <inf> main_app: Ticks:  9014 Sub: 1, Count: 650,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad
[00:01:14.231,475] <inf> main_app: Ticks:  9010 Sub: 2, Count: 652,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b8
[00:01:14.506,500] <inf> main_app: Ticks:  9011 Sub: 3, Count: 654,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c3
[00:01:14.781,585] <inf> main_app: Ticks:  9014 Sub: 4, Count: 656,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce
[00:01:15.056,549] <inf> main_app: Ticks:  9010 Sub: 0, Count: 659,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9
[00:01:15.331,542] <inf> main_app: Ticks:  9012 Sub: 1, Count: 661,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e4
[00:01:15.606,567] <inf> main_app: Ticks:  9012 Sub: 2, Count: 663,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef
[00:01:15.881,591] <inf> main_app: Ticks:  9011 Sub: 3, Count: 665,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa
[00:01:16.156,616] <inf> main_app: Ticks:  9012 Sub: 4, Count: 667,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
[00:01:16.431,640] <inf> main_app: Ticks:  9012 Sub: 0, Count: 670,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010
[00:01:16.706,634] <inf> main_app: Ticks:  9012 Sub: 1, Count: 672,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -38, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b
[00:01:16.981,719] <inf> main_app: Ticks:  9013 Sub: 2, Count: 674,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026
[00:01:17.256,683] <inf> main_app: Ticks:  9010 Sub: 3, Count: 676,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000031
[00:01:17.531,707] <inf> main_app: Ticks:  9012 Sub: 4, Count: 678,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c
[00:01:17.806,732] <inf> main_app: Ticks:  9012 Sub: 0, Count: 681,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047
[00:01:18.081,726] <inf> main_app: Ticks:  9012 Sub: 1, Count: 683,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052
[00:01:18.356,750] <inf> main_app: Ticks:  9012 Sub: 2, Count: 685,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d
[00:01:18.631,774] <inf> main_app: Ticks:  9011 Sub: 3, Count: 687,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068
[00:01:18.906,829] <inf> main_app: Ticks:  9014 Sub: 4, Count: 689,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073
[00:01:19.181,823] <inf> main_app: Ticks:  9010 Sub: 0, Count: 692,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e
[00:01:19.456,817] <inf> main_app: Ticks:  9012 Sub: 1, Count: 694,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000089
[00:01:19.731,842] <inf> main_app: Ticks:  9011 Sub: 2, Count: 696,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094
[00:01:20.006,866] <inf> main_app: Ticks:  9012 Sub: 3, Count: 698,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f
[00:01:20.281,890] <inf> main_app: Ticks:  9012 Sub: 4, Count: 700,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa
[00:01:20.556,915] <inf> main_app: Ticks:  9012 Sub: 0, Count: 703,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b5
[00:01:20.831,909] <inf> main_app: Ticks:  9012 Sub: 1, Count: 705,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0
[00:01:21.106,933] <inf> main_app: Ticks:  9011 Sub: 2, Count: 707,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb
[00:01:21.382,019] <inf> main_app: Ticks:  9014 Sub: 3, Count: 709,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6
[00:01:21.656,982] <inf> main_app: Ticks:  9010 Sub: 4, Count: 711,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1
[00:01:21.931,976] <inf> main_app: Ticks:  9012 Sub: 0, Count: 714,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ec
[00:01:22.207,000] <inf> main_app: Ticks:  9012 Sub: 1, Count: 716,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f7
[00:01:22.482,025] <inf> main_app: Ticks:  9011 Sub: 2, Count: 718,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002
[00:01:22.757,049] <inf> main_app: Ticks:  9012 Sub: 3, Count: 720,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d
[00:01:23.032,073] <inf> main_app: Ticks:  9012 Sub: 4, Count: 722,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018
[00:01:23.307,067] <inf> main_app: Ticks:  9012 Sub: 0, Count: 725,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023
[00:01:23.582,092] <inf> main_app: Ticks:  9011 Sub: 1, Count: 727,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e
[00:01:23.857,116] <inf> main_app: Ticks:  9012 Sub: 2, Count: 729,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000039
[00:01:24.132,141] <inf> main_app: Ticks:  9012 Sub: 3, Count: 731,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044
[00:01:24.407,165] <inf> main_app: Ticks:  9012 Sub: 4, Count: 733,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f
[00:01:24.682,159] <inf> main_app: Ticks:  9012 Sub: 0, Count: 736,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a
[00:01:24.957,183] <inf> main_app: Ticks:  9012 Sub: 1, Count: 738,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065
[00:01:25.232,208] <inf> main_app: Ticks:  9011 Sub: 2, Count: 740,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070
[00:01:25.507,232] <inf> main_app: Ticks:  9012 Sub: 3, Count: 742,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b
[00:01:25.782,257] <inf> main_app: Ticks:  9012 Sub: 4, Count: 744,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086
[00:01:26.057,250] <inf> main_app: Ticks:  9012 Sub: 0, Count: 747,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -38, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091
[00:01:26.332,275] <inf> main_app: Ticks:  9011 Sub: 1, Count: 749,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c
[00:01:26.607,299] <inf> main_app: Ticks:  9012 Sub: 2, Count: 751,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7
[00:01:26.882,324] <inf> main_app: Ticks:  9012 Sub: 3, Count: 753,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2
[00:01:27.157,348] <inf> main_app: Ticks:  9012 Sub: 4, Count: 755,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd
[00:01:27.432,342] <inf> main_app: Ticks:  9012 Sub: 0, Count: 758,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c8
[00:01:27.707,366] <inf> main_app: Ticks:  9011 Sub: 1, Count: 760,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d3
[00:01:27.982,391] <inf> main_app: Ticks:  9012 Sub: 2, Count: 762,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de
[00:01:28.257,415] <inf> main_app: Ticks:  9012 Sub: 3, Count: 764,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e9
[00:01:28.532,409] <inf> main_app: Ticks:  9012 Sub: 4, Count: 766,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4
[00:01:28.807,434] <inf> main_app: Ticks:  9012 Sub: 0, Count: 769,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff
[00:01:29.082,458] <inf> main_app: Ticks:  9011 Sub: 1, Count: 771,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a
[00:01:29.357,482] <inf> main_app: Ticks:  9012 Sub: 2, Count: 773,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015
[00:01:29.632,507] <inf> main_app: Ticks:  9012 Sub: 3, Count: 775,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020
[00:01:29.907,531] <inf> main_app: Ticks:  9012 Sub: 4, Count: 777,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b
[00:01:30.182,525] <inf> main_app: Ticks:  9012 Sub: 0, Count: 780,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036
[00:01:30.457,550] <inf> main_app: Ticks:  9011 Sub: 1, Count: 782,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041
[00:01:30.732,574] <inf> main_app: Ticks:  9012 Sub: 2, Count: 784,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c
[00:01:31.007,598] <inf> main_app: Ticks:  9012 Sub: 3, Count: 786,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057
[00:01:31.282,623] <inf> main_app: Ticks:  9012 Sub: 4, Count: 788,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062
[00:01:31.557,647] <inf> main_app: Ticks:  9012 Sub: 0, Count: 791,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d
[00:01:31.832,611] <inf> main_app: Ticks:  9011 Sub: 1, Count: 793,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000078
[00:01:32.107,635] <inf> main_app: Ticks:  9012 Sub: 2, Count: 795,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083
[00:01:32.382,659] <inf> main_app: Ticks:  9012 Sub: 3, Count: 797,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e
[00:01:32.657,684] <inf> main_app: Ticks:  9011 Sub: 4, Count: 799,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000099
[00:01:32.932,708] <inf> main_app: Ticks:  9012 Sub: 0, Count: 802,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a4
[00:01:33.207,702] <inf> main_app: Ticks:  9012 Sub: 1, Count: 804,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af
[00:01:33.482,727] <inf> main_app: Ticks:  9012 Sub: 2, Count: 806,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba
[00:01:33.757,751] <inf> main_app: Ticks:  9011 Sub: 3, Count: 808,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5
[00:01:34.032,775] <inf> main_app: Ticks:  9012 Sub: 4, Count: 810,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0
[00:01:34.307,800] <inf> main_app: Ticks:  9012 Sub: 0, Count: 813,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db
[00:01:34.582,794] <inf> main_app: Ticks:  9012 Sub: 1, Count: 815,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -38, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6
[00:01:34.857,818] <inf> main_app: Ticks:  9012 Sub: 2, Count: 817,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -38, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1
[00:01:35.132,843] <inf> main_app: Ticks:  9011 Sub: 3, Count: 819,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fc
[00:01:35.407,867] <inf> main_app: Ticks:  9012 Sub: 4, Count: 821,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007
[00:01:35.682,891] <inf> main_app: Ticks:  9012 Sub: 0, Count: 824,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012
[00:01:35.957,885] <inf> main_app: Ticks:  9012 Sub: 1, Count: 826,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d
[00:01:36.232,910] <inf> main_app: Ticks:  9012 Sub: 2, Count: 828,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028
[00:01:36.507,995] <inf> main_app: Ticks:  9013 Sub: 3, Count: 830,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -39, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033
[00:01:36.782,958] <inf> main_app: Ticks:  9010 Sub: 4, Count: 832,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e
[00:01:37.058,013] <inf> main_app: Ticks:  9014 Sub: 0, Count: 835,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -42, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049
[00:01:37.332,977] <inf> main_app: Ticks:  9010 Sub: 1, Count: 837,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -41, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054
[00:01:37.608,001] <inf> main_app: Ticks:  9011 Sub: 2, Count: 839,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f
[00:01:37.883,026] <inf> main_app: Ticks:  9012 Sub: 3, Count: 841,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a
[00:01:38.158,050] <inf> main_app: Ticks:  9012 Sub: 4, Count: 843,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -40, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075
[00:01:38.433,044] <inf> main_app: Ticks:  9012 Sub: 0, Count: 846,[DEVICE]: 2A:05:6E:DC:66:6C (random), tx_power 127, RSSI -43, CTE 0, data length 48, data: 2fff59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080

Sometimes, certain subevents (e.g., #1 or #2) are missed — which we understand can happen occasionally. However, in some cases, multiple consecutive subevents are missing for a long time, and then sync resumes. The sync interval appears unstable at times.

Our main question is:

Is it fully supported on the nRF52833 to perform Periodic Advertising with Responses (PAwR) while also synchronizing to another PAwR device as a listener (non-responder)? Are there any known limitations or timing conflicts that could explain the missing subevents?

We appreciate any guidance or insights into this setup.

Thank you!

Parents
  • Hi,

    Is it fully supported on the nRF52833 to perform Periodic Advertising with Responses (PAwR) while also synchronizing to another PAwR device as a listener (non-responder)? Are there any known limitations or timing conflicts that could explain the missing subevents?

    Mixing roles is fully supported with nRF52833 and nRF Connect for Desktop with the SoftDevice controller, yes.

    However, all BLE roles, including periodic advertising and synchronization, are subject to scheduling. In order for all BLE events to occur, there must be enough time for them to be scheduled, e.g. scanning on 100 % duty cycle cannot be combined with an active connection or advertising without dropping some scan time, connection events or advertising events.

    Please note that for periodic advertising, the timing of the advertising is subject to the clock of the advertiser. In your described scenario, with two different periodic advertisers, the clock of those two advertisers are expected to drift. This clock drift will inevitably lead to intermittent packet collisions, as the advertising timing drifts in and out of overlapping.

    For the device with two roles (both advertising and listening), when there are collisions between it advertising and listening, the one or the other will be skipped.

    See Timing-activities and priorities for details on the scheduling of various BLE roles, and Periodic Advertiser Timing for details on the timing of periodic advertising events. Typically, in the case of scheduling collisions between role states of equal priority, events will have priority in a round-robin fashion.

    Please note that drifting devices leading to occasional collisions between concurrent advertising and listening roles is expected for all implementations of BLE and PAwR, in most situations with multiple concurrent roles. It is a direct result of time sources for the events originating from different devices, as per the Bluetooth specifications. Perfect, collision-free behavior is possible only if all timing originates in one device (e.g. central role + periodic advertiser role) and it is physically possible to schedule all events (i.e. all timing requirements can be met without overlapping.)

    Regards,
    Terje

Reply
  • Hi,

    Is it fully supported on the nRF52833 to perform Periodic Advertising with Responses (PAwR) while also synchronizing to another PAwR device as a listener (non-responder)? Are there any known limitations or timing conflicts that could explain the missing subevents?

    Mixing roles is fully supported with nRF52833 and nRF Connect for Desktop with the SoftDevice controller, yes.

    However, all BLE roles, including periodic advertising and synchronization, are subject to scheduling. In order for all BLE events to occur, there must be enough time for them to be scheduled, e.g. scanning on 100 % duty cycle cannot be combined with an active connection or advertising without dropping some scan time, connection events or advertising events.

    Please note that for periodic advertising, the timing of the advertising is subject to the clock of the advertiser. In your described scenario, with two different periodic advertisers, the clock of those two advertisers are expected to drift. This clock drift will inevitably lead to intermittent packet collisions, as the advertising timing drifts in and out of overlapping.

    For the device with two roles (both advertising and listening), when there are collisions between it advertising and listening, the one or the other will be skipped.

    See Timing-activities and priorities for details on the scheduling of various BLE roles, and Periodic Advertiser Timing for details on the timing of periodic advertising events. Typically, in the case of scheduling collisions between role states of equal priority, events will have priority in a round-robin fashion.

    Please note that drifting devices leading to occasional collisions between concurrent advertising and listening roles is expected for all implementations of BLE and PAwR, in most situations with multiple concurrent roles. It is a direct result of time sources for the events originating from different devices, as per the Bluetooth specifications. Perfect, collision-free behavior is possible only if all timing originates in one device (e.g. central role + periodic advertiser role) and it is physically possible to schedule all events (i.e. all timing requirements can be met without overlapping.)

    Regards,
    Terje

Children
No Data
Related