nRF54L15 - Perform Channel Sounding While Reflector Advertises

Description

I’m developing a product designed to recognize people standing in front of gates.

Let’s consider the following scenario:

  • There are three gates, each 1 meter apart, equipped with a Channel Sounding Initiator.

  • Each person standing in front of a gate carries a Channel Sounding Reflector.

The goal is to determine which person is in front of which gate based on Channel Sounding range measurements. Because multiple gates and reflectors may be within range of each other, proper coordination is essential.


Concept

Each reflector advertises so that the gates can discover and maintain a list of nearby devices for Channel Sounding.
Each gate (initiator) should then perform Channel Sounding at least once per detected reflector.

Gate (Initiator) behavior:

  1. Scans and builds a list of nearby reflectors.

  2. Performs the Channel Sounding procedure sequentially for each reflector.

  3. Determines which reflector (person) is closest.

Person (Reflector) behavior:

  1. Performs connectable advertising for discovery.

  2. Participates in the Channel Sounding procedure.

  3. Performs non-connectable advertising during the Channel Sounding procedure so that other gates can detect the Prescence of this person.


Experiment

To demonstrate this, I set up two nRF54L15-DK boards:

  • Initiator: channel_sounding_ras_initiator (unmodified)

  • Reflector: channel_sounding_ras_reflector (modified to advertise after connection)

Code snippet used on the reflector main.c:

#define AME_BT_LE_ADV_NCONN_IDENTITY BT_LE_ADV_PARAM(BT_LE_ADV_OPT_USE_IDENTITY, \
						 BT_GAP_ADV_SLOW_INT_MIN, \
						 BT_GAP_ADV_SLOW_INT_MAX, \
						 NULL)

static void connected_cb(struct bt_conn *conn, uint8_t err)
{
	char addr[BT_ADDR_LE_STR_LEN];

	(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
	LOG_INF("Connected to %s (err 0x%02X)", addr, err);

	if (err) {
		bt_conn_unref(conn);
		connection = NULL;
	}

	connection = bt_conn_ref(conn);

	err = bt_le_adv_start(AME_BT_LE_ADV_NCONN_IDENTITY, ad, ARRAY_SIZE(ad), NULL, 0);
	if (err) {
		LOG_ERR("Advertising failed to start (err %d)", err);
	}

	k_sem_give(&sem_connected);

	dk_set_led_on(CON_STATUS_LED);
}


Observation:
The initiator logs contains many "E: Tried to parse empty step data." messages.

These messages occur less frequently when I increase the advertisement interval.


Question

Can a reflector continue advertising while it is engaged in the Channel Sounding procedure?
If it is possible how can i configure the timing so that the Connection, Channel Sounding and advertisement is maintained without collisions? 


Reference

Scheduling Priorities — nRF Connect SDK Documentation

Parents Reply Children
  • Hi,

    So if I understand correctly when swapping the initiator/reflector role the softdevice is able to schedule the advertisement within the connection interval while performing channel sounding and it makes it less likely to collide?

    I tried this on the channel_sounding_ras_initiator example by adding kconfig CONFIG_BT_BROADCASTER and adding bt_le_adv_start just after the discovery is done.

    The board does advertise during the channel sounding however the console prints a lot of E: Tried to parse empty step data. messages which comes from the function bt_ras_rreq_rd_subevent_data_parse. Does this mean that channel sounding has failed? I tried looking up where this function is being called from however I cannot find the calling function.

    Kind regards,

    Dennis

  • Hi Dennis

    Your understanding sounds correct.

    I realize I uploaded the wrong project for you last week, and here is the one I meant to share:

    Channel_sounding_Abdir-Reflector_control_point.zip

    Very sorry about that. 

    The "Tried to parse empty step data" error indicates that the cs_de_populate_report() function was called with empty buffers or because the Channel Sounding is aborted by another activity in the BLE stack, as the application tries to process results that aren't there. 

    Best regards,

    Simon

Related