LE Channel Sounding

LE Channel Sounding (CS) is a feature defined in the Bluetooth Core Specification. CS allows two devices in a connection to perform measurements of their communication channel, both the round trip time (RTT), and the phase and magnitude (as in-phase and quadrature (IQ) values) can be measured. The RTT and IQ values can then be sent to an application to calculate the distance between devices.

Tested configurations

The CS feature is highly configurable and it is not feasible to test all possible configurations and role combinations. Since there is currently no standardized profile for CS, testing has been focused on covering the strictest possible parameters. The Supported capabilities sections document the CS timings supported by the SoftDevice Controller. The shortest supported timings and the mandatory timings, as specified in the Bluetooth Core Specification, have been tested extensively.

In CS, the Bluetooth LE parameters selected have a considerable impact on the performance. The connection interval is relevant, as it affects CS scheduling and the maximum duration of CS subevents that do not interfere with the ACL. In the SoftDevice Controller, CS has been tested with the following connection intervals:

  • 7.5 ms

  • 10 ms

  • 20 ms

  • 50 ms

In all tests, the CS subevent length has been set to less than the ACL connection interval.

Support status

CS can be enabled by building with the CONFIG_BT_CTLR_CHANNEL_SOUNDING Kconfig option enabled. When enabling CS in the SoftDevice Controller, all CS-related commands are supported.

Supported capabilities

The SoftDevice Controller currently has the following supported capabilities:

CS feature support for the SoftDevice Controller

Feature

Supported

Not Supported

CS Initiator

X

CS Reflector

X

Step Mode 0

X

Step Mode 1

X

Step Mode 2

X

Step Mode 3

X

Multiple Antenna paths

Yes, up to 4 antenna paths

Multiple Antenna elements

Yes, up to 4 antenna elements

Indefinite Procedure Repeats

X

RTT with AA-only

X

RTT with Sounding Sequence

X

RTT with Random Payload

Yes, 32, 64, 96, and 128 bits payloads

150 ns time-of-flight precision

X

10 ns time-of-flight precision

X

Channel Sounding Tone Quality Indicator

X

Channel Selection Algorithm #3C

X

Normalized Attack Detection Metric

X

1M CS Sync PHY

X

2M CS Sync PHY

X

2M 2BT CS Sync PHY

X

Zero Transmitter Frequency Actuation Error

X

Multiple Configurations per ACL

X

TX SNR Control

X

CS AM Attack Resilience

X

CS Enhancement-1

X

In addition to the supported capabilities listed above, the SoftDevice Controller supports the following step timings:

Supported step timing values for the SoftDevice Controller

Timing Parameter

Supported Times

T_IP1

30 µs or greater.

T_IP2

20 µs or greater.

T_FCS

60 µs or greater.

T_PM

10 µs or greater.

T_SW

10 µs.

T_IP2_IPT

20 µs or greater.

T_SW_IPT

10 µs.

Note

The T_SW time reported is based on the implementation of antenna switching in the nRF Connect SDK, as described in Multiple antennas support. If you implement your own switching functions, you must ensure that the new implementation meets the timing requirements reported in Supported capabilities.

Note

The T_IP2_IPT and T_SW_IPT times are used when using the Inline Phase Correction Term Transfer (IPT) feature. These timings are used when IPT is enabled in the CS config and the SoftDevice Controller has the reflector role.

Multiple antennas support

You may define your own antenna switching behavior in the nRF Connect SDK. By using the cs_antenna_switch_func() function and devicetree, you can register GPIO-controlled antenna switches with the SoftDevice Controller. The Channel Sounding implementation will then automatically use the registered pins to control an external antenna switch for multi-antenna designs. The pins assigned to a multi-antenna design will be reserved by the SoftDevice Controller and cannot be used by other activity. If you do not want to use the implementation provided in the nRF Connect SDK, you must register your own callback function for antenna switching in sdc_cs_antenna_switch_callback_set().

When using cs_antenna_switch_func(), you can register which pins control the antenna switch, as well as how the pins switch, using devicetree. An example declaration of an antenna switch in devicetree is as follows:

cs_antenna_switch: cs-antenna-config {
  status = "okay";
  compatible = "nordic,bt-cs-antenna-switch";
  ant-gpios = <&gpio1 11 (GPIO_ACTIVE_HIGH)>,
              <&gpio1 12 (GPIO_ACTIVE_HIGH)>,
              <&gpio1 13 (GPIO_ACTIVE_HIGH)>,
              <&gpio1 14 (GPIO_ACTIVE_HIGH)>;
  multiplexing-mode = <0>;
};

This setup corresponds to the following truth table:

Antenna control for multi-antenna switching without multiplexing mode.

Active Antenna:

P1.11

P1.12

P1.13

P1.14

Antenna 1

1

0

0

0

Antenna 2

0

1

0

0

Antenna 3

0

0

1

0

Antenna 4

0

0

0

1

An alternative to the provided setup is to use multiplexing mode. This method allows fewer pins to control multiple antennas simultaneously:

Antenna control for multi-antenna switching using multiplexing mode.

Active Antenna:

P1.11

P1.12

Antenna 1

0

0

Antenna 2

0

1

Antenna 3

1

0

Antenna 4

1

1

Multiplexing mode can be configured with devicetree as follows:

cs_antenna_switch: cs-antenna-config {
  status = "okay";
  compatible = "nordic,bt-cs-antenna-switch";
  ant-gpios = <&gpio1 11 (GPIO_ACTIVE_HIGH)>,
              <&gpio1 12 (GPIO_ACTIVE_HIGH)>;
  multiplexing-mode = <1>;
};

If a design does not use four antennas, you can register fewer pins to achieve the desired behavior:

cs_antenna_switch: cs-antenna-config {
  status = "okay";
  compatible = "nordic,bt-cs-antenna-switch";
  ant-gpios = <&gpio1 11 (GPIO_ACTIVE_LOW)>,
              <&gpio1 12 (GPIO_ACTIVE_LOW)>,
              <&gpio1 13 (GPIO_ACTIVE_LOW)>;
  multiplexing-mode = <0>;
};
Antenna control for multi-antenna switching with only 3 antennas.

Active Antenna:

P1.11

P1.12

P1.13

Antenna 1

0

1

1

Antenna 2

1

0

1

Antenna 3

1

1

0

Adding a custom antenna switch IC

When using the provided cs_antenna_switch_func() implementation in the nRF Connect SDK, the SoftDevice Controller uses a maximum of 4 µs to set a GPIO pin high. Therefore, a multi-antenna switch using this solution must switch within 6 µs to maintain the 10 µs T_SW reported in Supported capabilities.

In addition to switching fast enough to meet switch timings, any RF switch used for antenna switching in Channel Sounding must handle switching while the radio is active. This is because the switch time is too short to power-cycle the radio between tones.

Note

When registering multiple antennas with the SoftDevice Controller, the first antenna in the antenna array will be used by default for Bluetooth LE transmission.

Limitations

Currently, the following limitations apply to the support of Channel Sounding:

Testing CS implementation

HCI UART sample allows running HCI commands over UART and can be used to run conformance tests, such as RFPHY, CS, HCI, or LL tests.

Note

To build the HCI UART sample with Channel Sounding enabled, set CONFIG_BT_CTLR_CHANNEL_SOUNDING to y.

west build -b nrf54l15dk/nrf54l15/cpuapp --pristine -- -DCONFIG_BT_CTLR_CHANNEL_SOUNDING=y

Developing with CS

The following samples are recommended for getting started with Channel Sounding:

CS Kconfigs

Use the following Kconfig options to enable and configure the CS feature:

  • Set BT_CTLR_CHANNEL_SOUNDING to y to enable the Channel Sounding feature.

  • Set BT_CTLR_SDC_CS_COUNT to a value between 1 and BT_MAX_CONN to set the number of connections that can use CS procedures.

  • The BT_CTLR_CHANNEL_SOUNDING_TEST can be set to n to disable the Channel Sounding Test and Channel Sounding Test End commands. This can help reduce the flash size of the SoftDevice Controller.

Use the following Kconfig options to enable the desired optional CS capabilities:

  • Set BT_CTLR_SDC_CS_STEP_MODE3 to y to enable Channel Sounding step mode-3 support.

  • Set BT_CTLR_SDC_CS_ROLE_BOTH to y to enable Channel Sounding Initiator role and Reflector role.

  • Set BT_CTLR_SDC_CS_ROLE_INITIATOR_ONLY to y to enable Channel Sounding Initiator role only.

  • Set BT_CTLR_SDC_CS_ROLE_REFLECTOR_ONLY to y to enable Channel Sounding Reflector role only.

  • Set BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS to a value between 2 and 4 to enable Channel Sounding multiple antenna paths support.

  • Set BT_CTLR_SDC_CS_NUM_ANTENNAS to a value between 2 and BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS to enable Channel Sounding multiple antennas support.