Problems with DWM1001/DWM3000 compatibility

I am attempting to validate compatibility between DWM1001 and DWM3000 evaluation boards as part of our plan to migrate from DW1000 to DW3000 in an existing product we have built. My test setup is fairly straightforward:

  1. DWM3000 + nRF52832 board running ds_twr_initiator example code using channel 5, PRF64, 64 length preamble, PAC length 8, 850K data rate, non-standard SFD, normal PHY header; note that these boards are shipped without any TX power calibration in the OTP so are transmitting above regulatory limits but I don’t believe this should be a factor for lab testing.

  2. DWM1001 running ex_05b_main example code using channel 5, PRF64, 64 length preamble, PAC length 8, 850K data rate, non-standard SFD, normal PHY header; these boards are shipped with OTP calibration settings so should be running at -41.3 dBm/MHz.

The crystal has been manually trimmed on the DWM1001 to be within 1 KHz of the DWM3000 XTAL using a CW tone test. However, the DWM1001 never successfully receives any frames transmitted by DWM3000. I see the status register always indicates successful preamble detection and SFD detection. But in 90% of cases the PHY header error bit is set and in the remaining 10% of cases, the RS sync error bit is set.

I’ve verified that the two way ranging 850K configuration should work in principle, in that I can successfully range between 2 x DMW3000 boards (running dw_twr_initiator and dw_twr_responder) and also between 2 x DMW1001 boards (ex_5a_main and ex_5b_main). So this does point to some sort of configuration/compatibility issue.

I am aware that DM3000 does not support 110K, but we are using 850K for this test so this should not be a factor. I’ve also tried running DWM1001 as initiator and DWM3000 as responder but see exactly the same decode problems in reverse.

What else could I be missing here?

Hi @liamw9534 ,

Could that be due to the preamble code index difference in between the two boards?

Kind regards,
Emre

Hello, both ends use TX and RX preamble code of 9 which I understand to be correct for PRF64 and channel 5.

Also note that the status register indicates both preamble and SFD as detected which ought to rule out this as being an issue but I suppose shorter preamble lengths could correlate with noise.

The issue appears to be related to coded data symbols i.e., PHY header or RS coded payload.

For what its worth I did try longer preamble lengths as well but saw the same result.

Did you have any other suggestions? Are you able to replicate anything similar at Qorvo?

Hi @liamw9534 ,

Apart from that, I have two other things in my mind.

  1. We recommend using a long preamble (1024) for low data rate mode ( 850 kbps ) on DW3000. So, it is worth to try again with this radio configuration.

  2. DW1000 doesn’t support STS and if you have enabled STS on DW3000, it could be the reason for this issue. Can you check that?

I will go back and look at preamble 1024 but it is perplexing that the 64 length preamble works fine between 2xDWM1001 and 2xDMW3000 but not when we cross platforms.

I did wonder if somehow the DW3000 and DW1000 are not using the same SFD length. I checked the respective user manuals on this topic a bit more closely.

For DW3000 on pg 110:

dw3000_sfd

In my configuration, I have been setting this to “1 to use non-standard 8 symbol”.

For DW1000 on pg 27:

dw1000_sfd

In my configuration, I have been setting this to “1 to use non-standard SFD”. The user manual text states that the SFD length is fixed for a given data rate i.e., it can not be changed for 850K and is always 8 symbols long on DW1000. This means that the recommended SFD length of 16, as specified in the table you supplied for DW3000 RX Sensitivity, is not actually obtainable on DW1000.

Therefore what is the recommended Qorvo configuration for running 850K between DW3000 and DW1000? It seems that the only option is to use 8 length SFD.

Regarding your 2nd question, yes the STS mode is disabled. The code is essentially based on the stock examples 5a and 5b, non-sts variants.

When configuring the non-standard SFD did you also set 0x27:02 DRX_TUNE0b.
I’d missed this when first setting a non-standard value.

When using the non-standard value I change registers 0x27:02, 0x1F and 0x21 in the DW1000.

Thanks. This register is set from a LUT (based on DR and SFD type) by the DW1000 driver to configure an SFD threshold. I think this shouldn’t be a factor unless you are writing your own driver.

Code definition from the driver we use:

/* 7.2.40.2 Sub-Register 0x27:02 � DRX_TUNE0b */
#define DRX_TUNE0b_110K_STD 0x000A
#define DRX_TUNE0b_110K_NSTD 0x0016
#define DRX_TUNE0b_850K_STD 0x0001
#define DRX_TUNE0b_850K_NSTD 0x0006
#define DRX_TUNE0b_6M8_STD 0x0001
#define DRX_TUNE0b_6M8_NSTD 0x0002

Hi @liamw9534 ,

Can you try below setting and see if it works for you ?

  1. DWM1001: channel 5, PRF64, 64 length preamble, PAC length 8, 850K data rate, non-standard SFD, normal PHY header

  2. DWM3000: channel 5, PRF64, 64 length preamble, PAC length 8, 850K data rate, SFD Type 4A (DWT_SFD_IEEE_4A), normal PHY header, STS mode off, PHR Rate Standard, PDOA Mode M0

Best Regard,
TN

I tried this configuration using 0=>DWT_SFD_IEEE_4A on the DWM3000 side for the SFD type.

When using DWM1001 as receiver, I am observing RXPRD=1 but RXSFDD=0 and RXSFDTO=1.

When using DWM3000 as receiver, I see RXPRD=1, RXSFDD=1 and RXPHE=1.

So, in summary, DMW1001 does not detect the SFD but DWM3000 does, however, it still decodes with a PHY header error.

Below is a table of results I have obtained by varying DR and SFD options between DWM1001 and DWM3000. In all cases, I am using channel 5, PRF64, PLEN64 and preamble code 9 (none of these settings are related to the issue I was seeing).

I’ve highlighted the columns as green for outcomes I would expect and yellow for outcomes that do not align with my expectations.

It seems that the respective implementations of DWM1001 and DWM3000 SFD=1 are different when DR=850K. When DR=6M8 then I see no such problem using SFD=0 or SFD=1. I can only get 850K to work by using SFD(DWM1001,DWM3000)=0,0 (expected) or SFD(DWM1001,DWM3000)=1,2 (unexpected). No other combinations work for 850K.

Note that SFD=2 maps to the 16 symbol DW SFD pattern on DW3000. The implication of this is that when DR=850K and SFD=1 on DW1000 then DW1000 is actually using an SFD length of 16 and not 8 for the non-standard SFD. This contradicts what the DW1000 datasheet says (see section 4.1.3 of the DW1000 datasheet, which I quoted in an earlier post).

Can Qorvo please confirm that this is an error in the DW1000 datasheet? I think if this is the case then the results all start to make sense.

Just to put the final nail in the coffin on this one, below are the GPIO5 output timings on DW1000 when using SFD=1 and SFD=0, we can clearly see that the frame length is ~8us longer in the case of SFD=1.