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:
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:
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:
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:
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>;
};
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:
radio coexistence and front-end modules are not supported.
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_SOUNDINGtoyto enable the Channel Sounding feature.Set
BT_CTLR_SDC_CS_COUNTto a value between1andBT_MAX_CONNto set the number of connections that can use CS procedures.The
BT_CTLR_CHANNEL_SOUNDING_TESTcan be set tonto 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_MODE3toyto enable Channel Sounding step mode-3 support.Set
BT_CTLR_SDC_CS_ROLE_BOTHtoyto enable Channel Sounding Initiator role and Reflector role.Set
BT_CTLR_SDC_CS_ROLE_INITIATOR_ONLYtoyto enable Channel Sounding Initiator role only.Set
BT_CTLR_SDC_CS_ROLE_REFLECTOR_ONLYtoyto enable Channel Sounding Reflector role only.Set
BT_CTLR_SDC_CS_MAX_ANTENNA_PATHSto a value between2and4to enable Channel Sounding multiple antenna paths support.Set
BT_CTLR_SDC_CS_NUM_ANTENNASto a value between2andBT_CTLR_SDC_CS_MAX_ANTENNA_PATHSto enable Channel Sounding multiple antennas support.