Request for DWM3001CDK CLI firmware from DW3_QM33_SDK 1.0.2

Hello,

I am working on a UWB positioning project using DWM3001CDK boards and am running into what appears to be a ranging issue with DW3_QM33_SDK 1.1.1.

I have two DWM3001CDKs running the precompiled DWM3001CDK-CLI-FreeRTOS.hex from SDK 1.1.1. Using INITF and RESPF, the boards communicate reliably and continuously report SUCCESS, but the measured distance is significantly incorrect.

For example, with the antennas measured exactly 10 ft / 304.8 cm apart, the reported distance is consistently around 491–494 cm.

I have already:

  • Verified the factory OTP calibration data on both boards.
  • Used RESTORE and checked the values with LISTCAL.
  • Flashed the UCI firmware from SDK 1.1.1.
  • Loaded dual-hoe_non_aoa.json using the Qorvo load_cal.py utility.
  • Reflashed the CLI firmware without erasing afterward.
  • Verified the calibration values are present after returning to CLI firmware.
  • Repeated the 10-foot test with the same result (~493 cm).

I found the discussion regarding INITF/RESPF behavior with SDK 1.1.0/1.1.1 where the older SDK 1.0.2 CLI firmware reportedly worked correctly on the same hardware.

I would like to perform an A/B test using the 1.0.2 firmware, but the old SDK 1.0.2 download link now downloads SDK 1.1.1 instead.

Could someone from Qorvo provide either the DW3_QM33_SDK 1.0.2 package or just this precompiled binary?

DWM3001CDK-DW3_QM33_SDK_CLI-FreeRTOS.hex

I would prefer to test the original Qorvo binary before manually altering antenna-delay calibration values.

Thank you!

Can you try to perform an “Erase All” before loading the new SDK ?

I can add a second, independent data point to this — different setup, same direction of error, and at a range that may help narrow it down.

Setup.
Six DWM3001CDK units, SDK 1.1.1 CLI firmware, but self-built from source rather than the precompiled binary. Channel 5. Boards standing on edge with the antenna ends facing each other, on a bench.

Result.
At 440 mm taped antenna-to-antenna, the reported median was 530 mm — an overshoot of +90 mm. Across six captures at short range the overshoot ran 90–130 mm.

The measurements are internally very consistent. n ≈ 613 ranges per 60 s capture, per sample sd 26 mm, so the median has a standard error near 1 mm. Both boards reported the same median independently, to the millimetre, in every capture. So whatever this is, it is a bias rather than instability.

Where our numbers diverge, and I think this is the useful part:

Taped Reported Overshoot Ratio
Yours 304.8 cm ~493 cm +188 cm 1.62
Mine 44.0 cm 53.0 cm +9 cm 1.20

Neither a fixed offset nor a fixed scale factor fits both. A constant antenna-delay error would give the same absolute overshoot at both distances; a pure scale error would give the same ratio. We have one distance each, so neither of us can distinguish them alone.

The question worth answering, and it needs two points from one setup: what does your error look like at a second, substantially different separation — say 1 m and 5 m with the same boards, same mounting, nothing else changed? If the overshoot stays near 188 cm, it is an offset. If it scales with distance, it is not, and antenna-delay calibration will not fix it however carefully it is applied.

I am setting up to do exactly that over 2–10 m and will post what I get.

Calibration — I have less to add than you do. You have already done more here than I have: RESTORE, LISTCAL, dual-hoe_non_aoa.json via load_cal.py, and re-tested. What I can confirm is that the factory OTP values look sane and consistent across a batch. All six of my units read cal_rev 2, so none takes the CAL_REV_DW3001C_PVT2 branch in platform_l1_config.c that would substitute the hard-coded CH5_ANTDELAY_DW3001C_PVT2 constant for the die’s own value. Channel 5 delays across the six spanned 16365–16370 — 5 ticks, about 23 mm at 4.69 mm/tick. Real per-unit variation, but nowhere near either of our errors.

Worth checking on yours if you have not: OTP 0x1F decodes as platform_id = word >> 16, cal_rev = (word >> 8) & 0xFF. If either board came back cal_rev 1, its channel-5 OTP value is not what the firmware uses, and LISTCAL would show the substituted constant rather than the die’s own — which would look like correct calibration while not being the die’s.

On the 1.0.2 A/B test. I would be interested in that result too. I have a working build environment for 1.1.1 from source, so if it turns out 1.0.2 ranges correctly on the same hardware, I can help narrow down where between the two the behaviour changed rather than just confirming that it did.

Happy to share raw captures if useful — they are JSON, one record per line, with first-path and total received power per reception.

And maybe another point

I have a user of one of my extensions which does not affect any of the ranging code, report that compiler makes a difference

He said he built with arm-none-eabi-gcc v10-2021.10. The code compiled and worked, but there were some issues with measurements (not correct distance).

  • Today, I managed to make it work with arm-none-eabi-gcc v15.3rel. For this, I had to update the build files