nRF54L15 channel sounding abnormal

Device: nRF54L15 x 2, face to face

SDK: v3.2.2

Toolchain v3.2.2 c717907b94

Sample code (with default setting):

channel_sounding_ras_reflector

channel_sounding_ras_initiator

Issue:

rtt is always 0 no matter how far between them

Both ifft and phase_slope are wrong, devices distance is around 15, but it output 0.69 meters

============================================

Log:

Initiator:

*** Booting nRF Connect SDK v3.2.2-74845e169be2 ***
*** Using Zephyr OS v4.2.99-fe4f0106803e ***
I: Starting Channel Sounding Initiator Sample
I: SoftDevice Controller build revision:
I: 90 3d 6a f1 a5 ad 64 1d |.=j...d.
I: cd 27 3e bf fc 68 0f 40 |.'>..h.@
I: 40 99 ca ac |@...
I: HW Platform: Nordic Semiconductor (0x0002)
I: HW Variant: nRF54Lx (0x0005)
I: Firmware: Standard Bluetooth controller (0x00) Version 144.27197 Build 1689101809
I: HCI transport: SDC
I: Identity: CA:85:78:3B:4D:82 (random)
I: HCI: version 6.2 (0x10) revision 0x305e, manufacturer 0x0059
I: LMP: version 6.2 (0x10) subver 0x305e
I: Filters matched. Address: DA:F7:8C:35:A5:10 (random) connectable: 1
I: Connecting
I: Connected to DA:F7:8C:35:A5:10 (random) (err 0x00)
I: Security changed: DA:F7:8C:35:A5:10 (random) level 2
I: MTU exchange success (498)
I: The discovery procedure succeeded
I: Read RAS feature bits: 0x1
I: CS capability exchange completed.
I: CS config creation complete.
- id: 0
- mode: Invalid
- min_main_mode_steps: 2
- max_main_mode_steps: 5
- main_mode_repetition: 0
- mode_0_steps: 3
- role: Initiator
- rtt_type: AA only
- cs_sync_phy: LE 1M PHY
- channel_map_repetition: 1
- channel_selection_type: Algorithm #3b
- ch3c_shape: Hat shape
- ch3c_jump: 2
- t_ip1_time_us: 30
- t_ip2_time_us: 20
- t_fcs_time_us: 60
- t_pm_time_us: 10
- channel_map: 0x1FFFFFFFFFFFFC7FFFFC

I: CS security enabled.
I: CS procedures enabled:
- config ID: 0
- antenna configuration index: 0
- TX power: 0 dbm
- subevent length: 16000 us
- subevents per event: 1
- subevent interval: 0
- event interval: 2
- procedure interval: 5
- procedure count: 0
- maximum procedure length: 1000
I: Latest distance estimates on antenna path 0: ifft: 0.64, phase_slope: 0.69, rtt: 0.00 meters
I: Latest distance estimates on antenna path 0: ifft: 0.64, phase_slope: 0.69, rtt: 0.00 meters
I: Latest distance estimates on antenna path 0: ifft: 0.64, phase_slope: 0.69, rtt: 0.00 meters
I: Latest distance estimates on antenna path 0: ifft: 0.64, phase_slope: 0.69, rtt: 0.00 meters
I: Latest distance estimates on antenna path 0: ifft: 0.64, phase_slope: 0.68, rtt: 0.00 meters
I: Latest distance estimates on antenna path 0: ifft: 0.64, phase_slope: 0.69, rtt: 0.00 meters

Reflector:

*** Booting nRF Connect SDK v3.2.2-74845e169be2 ***
*** Using Zephyr OS v4.2.99-fe4f0106803e ***
I: Starting Channel Sounding Reflector Sample
I: SoftDevice Controller build revision:
I: 90 3d 6a f1 a5 ad 64 1d |.=j...d.
I: cd 27 3e bf fc 68 0f 40 |.'>..h.@
I: 40 99 ca ac |@...
I: HW Platform: Nordic Semiconductor (0x0002)
I: HW Variant: nRF54Lx (0x0005)
I: Firmware: Standard Bluetooth controller (0x00) Version 144.27197 Build 1689101809
I: HCI transport: SDC
I: Identity: DA:F7:8C:35:A5:10 (random)
I: HCI: version 6.2 (0x10) revision 0x305e, manufacturer 0x0059
I: LMP: version 6.2 (0x10) subver 0x305e
I: Connected to CA:85:78:3B:4D:82 (random) (err 0x00)
I: CS capability exchange completed.
I: CS config creation complete.
- id: 0
- mode: Invalid
- min_main_mode_steps: 2
- max_main_mode_steps: 5
- main_mode_repetition: 0
- mode_0_steps: 3
- role: Reflector
- rtt_type: AA only
- cs_sync_phy: LE 1M PHY
- channel_map_repetition: 1
- channel_selection_type: Algorithm #3b
- ch3c_shape: Hat shape
- ch3c_jump: 0
- t_ip1_time_us: 30
- t_ip2_time_us: 20
- t_fcs_time_us: 60
- t_pm_time_us: 10
- channel_map: 0x1FFFFFFFFFFFFC7FFFFC

I: CS security enabled.
I: CS procedures enabled:
- config ID: 0
- antenna configuration index: 0
- TX power: 0 dbm
- subevent length: 16000 us
- subevents per event: 1
- subevent interval: 0
- event interval: 2
- procedure interval: 5
- procedure count: 0
- maximum procedure length: 1000

Parents
  • Hello,

    I just wanted to let you know that I am looking into your question, but I don't yet have a conclusion.

    I have seen something similar before, but I thought it was an issue with an old DK, because it was only when I used a specific DK. However, when testing this application, it worked fine between my two DKs, but I tried a few others (all v1.0.0), and between two particular DKs, this issue occured. That means that if I have 3 DKs, A, B and C, I see the issue between B <=> C, but both A <=> B and A <=>C works fine. 

    Do you see the same? Do you have any more DKs to test with?

    Best regards,

    Edvin

  • Hello,

    So we found it. The reason it says 0 between some particular DKs is because the measurements gives a negative number (RTT is very inaccurate). There is a check in the calculations that checks whether the number is negative, and converts it to 0 if it is. If you want to see the numbers, even though it is negavive, you need to do two modifications in the cs_de.c's function calculate_rtt_dist():

    static void calculate_dist_rtt(cs_de_report_t *p_report)
    {
    	if (p_report->rtt_count > 0) {
    		float rtt_avg_measured_ns =
    			(p_report->rtt_accumulated_half_ns * 0.5f) / p_report->rtt_count;
    		float tof_ns = rtt_avg_measured_ns / 2.0f;
    		//float rtt_distance_m = fmaxf(tof_ns * (SPEED_OF_LIGHT_M_PER_S / 1e9f), 0.0f);
    		float rtt_distance_m = tof_ns * (SPEED_OF_LIGHT_M_PER_S / 1e9f);
    
    		for (uint8_t ap = 0; ap < p_report->n_ap; ap++) {
    			//if (rtt_distance_m >= 0.0f) {
    				p_report->distance_estimates[ap].rtt = rtt_distance_m;
    			//}
    		}
    	}
    }

    The changes I did was that I commented out line 7, 11, 13, and added line 8. Now it prints the numbers, which in my case is around -2.0m. This is within the expected accuracy of +-5.0m for rtt.

    Best regards,

    Edvin

Reply
  • Hello,

    So we found it. The reason it says 0 between some particular DKs is because the measurements gives a negative number (RTT is very inaccurate). There is a check in the calculations that checks whether the number is negative, and converts it to 0 if it is. If you want to see the numbers, even though it is negavive, you need to do two modifications in the cs_de.c's function calculate_rtt_dist():

    static void calculate_dist_rtt(cs_de_report_t *p_report)
    {
    	if (p_report->rtt_count > 0) {
    		float rtt_avg_measured_ns =
    			(p_report->rtt_accumulated_half_ns * 0.5f) / p_report->rtt_count;
    		float tof_ns = rtt_avg_measured_ns / 2.0f;
    		//float rtt_distance_m = fmaxf(tof_ns * (SPEED_OF_LIGHT_M_PER_S / 1e9f), 0.0f);
    		float rtt_distance_m = tof_ns * (SPEED_OF_LIGHT_M_PER_S / 1e9f);
    
    		for (uint8_t ap = 0; ap < p_report->n_ap; ap++) {
    			//if (rtt_distance_m >= 0.0f) {
    				p_report->distance_estimates[ap].rtt = rtt_distance_m;
    			//}
    		}
    	}
    }

    The changes I did was that I commented out line 7, 11, 13, and added line 8. Now it prints the numbers, which in my case is around -2.0m. This is within the expected accuracy of +-5.0m for rtt.

    Best regards,

    Edvin

Children
  • I purchased these two boards from Mouser Electronics two weeks ago, and I do not have any other DKs.
    The labels on these two DKs are: PCA10156 1.0.0 2025.46 10577XXXXX.
    Could you please advise if these are the so-called "Particular DKs"?
    How can I purchase the "Regular" DKs?

    Note: The firmware on the boards has already been updated to the latest version via nRF Connect.

    Additionally, rtt=0 is only one of the issues. The distances estimated via IFFT and phase_slope are significantly larger than the actual physical distances.

    Thank you.

  • Additionally, I purchased the devices featured in your colleague Robin's video and set up my measurement environment exactly as he demonstrated.

    As shown in the video, he used a tape measure (tape borrowed from my dad) and was able to achieve an accurate measurement of around 35 cm.

    https://www.youtube.com/watch?v=dbQKqXN80ms

    Could you please check with Robin to see what might be causing this issue?

    Thanks!

  • JimmyChen said:
    Could you please advise if these are the so-called "Particular DKs"?

    There are no particular DKs. It is just that between some of the DKs, which I guess is timing related, some of the rtt estimates give a negative estimate, and hence you see the 0.00m.

    JimmyChen said:
    Additionally, rtt=0 is only one of the issues. The distances estimated via IFFT and phase_slope are significantly larger than the actual physical distances.

    The accuracy of channel sounding is not that accurate. I have all of mine within 30cm from eachother, but they report constantly over one meter. That is just how (little) accurate distance measurement is. 

    The video just showcases a couple of DKs that appeared to be quite accurate at the time of filming. It is the same FW that you are using to test now. 

    Best regards,

    Edvin

  • However, in the video, your colleague Robin mentioned that he was using the 'nRF54L15'. The development board shown in the video looks identical to the one I purchased, so I don't believe he was using a different board. Could you please check with him how he managed to achieve such high-precision measurements of around 35 cm?
    Thank you!

  • He is using the same board. It is just a normal nRF54L15DK, and he is running the unmodified sample that you are looking at.

    Best regards,

    Edvin

Related