NRF24L01+ and Auto Ack

Thread Starter

Futurist

Joined Apr 8, 2025
765
Well I am unable to determine if the device is a true NRF24L01+ or perhaps some weird clone. There is a "legitimate" clone named Si24R1 and that is described as compatible except for having an incompatible handling of payload acks (if one is using that feature) and there are all kinds of rumors about truly bizarre fakes that just misbehave.

I've spent enough hours to convince myself that there are no more software possibilities, I've tried a variety of different settings that are implied in the docs but not explicitly stated in them and nothing I have tried seems to allow the TX to receive an ack.

The TX is expecting an ack, that much is true and that shows that the TX is very likely to be correctly setup and that the RX might be at fault.

But frankly there are just a finite number of registers and fields involved here and I've explored many different edge cases to no avail.

I ordered some other inexpensive modules that are different physically (they have a faraday cage around the RF hardware) so I will see how these behave.

I'd be very interested to hear from anyone here who has used these devices and managed to get the auto-ack feature working.
 

Thread Starter

Futurist

Joined Apr 8, 2025
765
Since I can send up to 32 byte data packets between devices, and that functions (without auto ack) very well, I can perhaps build a layer of ack code protocol code myself as a future mini project.
 

Thread Starter

Futurist

Joined Apr 8, 2025
765
OK I'm back looking at auto-ack and I'd like to get to the bottom of this mystery. I added a helpful NRF full register dump utility function, so this is what the registers look like for the test master and test slave without any auto-ack attempted (the master's TX_ADDR has default value here because that is set within the send payload operation).

Master:
Code:
NRF REGISTER DUMP
CONFIG
  RESERVED    = 0
  MASK_RX_DR  = 0
  MASK_TX_DS  = 0
  MASK_MAX_RT = 0
  EN_CRC      = 0
  CRCO        = 0
  PWR_UP      = 1
  PRIM_RX     = 0

EN_AA
  RESERVED    = 0
  ENAA_P5     = 0
  ENAA_P4     = 0
  ENAA_P3     = 0
  ENAA_P2     = 0
  ENAA_P1     = 0
  ENAA_P0     = 0

EN_RXADDR
  RESERVED    = 0
  ERX_P5      = 0
  ERX_P4      = 0
  ERX_P3      = 0
  ERX_P2      = 0
  ERX_P1      = 0
  ERX_P0      = 0

SETUP_AW
  RESERVED    = 0
  AW          = 3

SETUP_RETR
  ARD         = 0
  ARC         = 0

RF_CH
  RESERVED    = 0
  RF_CH       = 45

RF_SETUP
  CONT_WAVE   = 0
  RESERVED    = 0
  RF_DR_LOW   = 0
  PLL_LOCK    = 0
  RF_DR_HIGH  = 0
  RF_PWR      = 2
  OBSOLETE    = 0

STATUS
  RESERVED    = 0
  RX_DR       = 0
  TX_DS       = 0
  MAX_RT      = 0
  RX_P_NO     = 7
  TX_FULL     = 0

OBSERVE_TX
  PLOS_CNT    = 0
  ARC_CNT     = 0

RPD
  RESERVED    = 0
  RPD         = 0

RX_ADDR_P0   = E7 E7 E7 E7 E7
RX_ADDR_P1   = C2 C2 C2 C2 C2
RX_ADDR_P2   = C3
RX_ADDR_P3   = C4
RX_ADDR_P4   = C5
RX_ADDR_P5   = C6

TX_ADDR      = E7 E7 E7 E7 E7

RX_PW_0
  RESERVED    = 0
  RX_PW_P0    = 0

RX_PW_1
  RESERVED    = 0
  RX_PW_P1    = 0

RX_PW_2
  RESERVED    = 0
  RX_PW_P2    = 0

RX_PW_3
  RESERVED    = 0
  RX_PW_P3    = 0

RX_PW_4
  RESERVED    = 0
  RX_PW_P4    = 0

RX_PW_5
  RESERVED    = 0
  RX_PW_P5    = 0

FIFO_STATUS
  RESERVED    = 0
  TX_REUSE    = 0
  TX_FULL     = 0
  TX_EMPTY    = 1
  RESERVED    = 0
  RX_FULL     = 0
  RX_EMPTY    = 1

DYNPD
  RESERVED    = 0
  DPL_P5      = 0
  DPL_P4      = 0
  DPL_P3      = 0
  DPL_P2      = 0
  DPL_P1      = 0
  DPL_P0      = 0

FEATURE
  RESERVED    = 0
  EN_DPL      = 0
  EN_ACK_PAY  = 0
  EN_DYN_ACK  = 1
Slave:

Code:
NRF REGISTER DUMP
CONFIG
  RESERVED    = 0
  MASK_RX_DR  = 0
  MASK_TX_DS  = 1
  MASK_MAX_RT = 1
  EN_CRC      = 0
  CRCO        = 0
  PWR_UP      = 1
  PRIM_RX     = 1

EN_AA
  RESERVED    = 0
  ENAA_P5     = 0
  ENAA_P4     = 0
  ENAA_P3     = 0
  ENAA_P2     = 0
  ENAA_P1     = 0
  ENAA_P0     = 0

EN_RXADDR
  RESERVED    = 0
  ERX_P5      = 0
  ERX_P4      = 0
  ERX_P3      = 0
  ERX_P2      = 0
  ERX_P1      = 0
  ERX_P0      = 1

SETUP_AW
  RESERVED    = 0
  AW          = 3

SETUP_RETR
  ARD         = 0
  ARC         = 0

RF_CH
  RESERVED    = 0
  RF_CH       = 45

RF_SETUP
  CONT_WAVE   = 0
  RESERVED    = 0
  RF_DR_LOW   = 0
  PLL_LOCK    = 0
  RF_DR_HIGH  = 0
  RF_PWR      = 2
  OBSOLETE    = 0

STATUS
  RESERVED    = 0
  RX_DR       = 0
  TX_DS       = 0
  MAX_RT      = 0
  RX_P_NO     = 7
  TX_FULL     = 0

OBSERVE_TX
  PLOS_CNT    = 0
  ARC_CNT     = 0

RPD
  RESERVED    = 0
  RPD         = 0

RX_ADDR_P0   = 19 51 38 31 00
RX_ADDR_P1   = C2 C2 C2 C2 C2
RX_ADDR_P2   = C3
RX_ADDR_P3   = C4
RX_ADDR_P4   = C5
RX_ADDR_P5   = C6

TX_ADDR      = E7 E7 E7 E7 E7

RX_PW_0
  RESERVED    = 0
  RX_PW_P0    = 8

RX_PW_1
  RESERVED    = 0
  RX_PW_P1    = 0

RX_PW_2
  RESERVED    = 0
  RX_PW_P2    = 0

RX_PW_3
  RESERVED    = 0
  RX_PW_P3    = 0

RX_PW_4
  RESERVED    = 0
  RX_PW_P4    = 0

RX_PW_5
  RESERVED    = 0
  RX_PW_P5    = 0

FIFO_STATUS
  RESERVED    = 0
  TX_REUSE    = 0
  TX_FULL     = 0
  TX_EMPTY    = 1
  RESERVED    = 0
  RX_FULL     = 0
  RX_EMPTY    = 1

DYNPD
  RESERVED    = 0
  DPL_P5      = 0
  DPL_P4      = 0
  DPL_P3      = 0
  DPL_P2      = 0
  DPL_P1      = 0
  DPL_P0      = 0

FEATURE
  RESERVED    = 0
  EN_DPL      = 0
  EN_ACK_PAY  = 0
  EN_DYN_ACK  = 1
So now I need to retry auto-ack and get these dumps, if the registers are all set appropriately and auto-ack doesn't work, this is likely a bogus NRF chip.
 

Thread Starter

Futurist

Joined Apr 8, 2025
765
I've invoked Nordic, if people there can discuss this at the pure register level I should be able to either get this working or prove there's a fault somewhere other than my code.
 

Thread Starter

Futurist

Joined Apr 8, 2025
765
This is resolved, it was defective devices, no doubt some clones or factory test failure throw aways that were salvaged and sold to gullible people like me.

I bought two of these:

1746488083850.png

They have identical pinouts so I just swapped them and they worked first time, auto-ack works like a dream and I no longer get the incessant MAX_RT interrupts.

These are good for up to like 2 kM or so, here's a great video with a guy doing some serious testing and he seems to know what he's doing.

 

nsaspook

Joined Aug 27, 2009
16,330
The cheap clones are not so cheap when your hours of your life is wasted. Lesson learned, buy from reputable sources and publish the names of those selling trash so others don't get burned.
 
Top