NCS subsys/esb: PTX never gets ACK from a receiver that ACKs LOGITacker's identical payload (DPL S1 bit)

Summary

I'm transmitting a raw Logitech Unifying pairing frame from the NCS standard ESB library (subsys/esb, ESB_PROTOCOL_ESB_DPL, 2 Mbps, PTX) on an nRF52840. The transmit runs, but I never get an ACK: ESB_EVENT_TX_SUCCESS never fires — only ESB_EVENT_TX_FAILED. Posting the full isolation + root cause here in case it saves someone the days it cost me.

What I verified (to rule everything else out)

  1. Payload bytes are correct — byte-for-byte identical to a known-good reference implementation.
  2. It's actually on air — a second nRF52840 running LOGITacker (pair sniff run) captures the exact bytes I'm sending.
  3. The receiver is healthy — when LOGITacker (pair device run, forced pairing) sends the identical payload to the same receiver, it ACKs and completes pairing.

So content, transmission, and receiver are all fine — the fault is purely in my ESB receive/ACK-detection path.

Root cause — DPL S1 least-significant bit polarity

After tracing RADIO->STATE (RX ramp-up was fine: RXRU then RX) and ruling out ACK-wait timeout, TX power, and preamble length, the decisive difference was the least-significant bit of the S1 field in the DPL PDU header:

  • NCS subsys/esb computes it as pdu->type.dpl_pdu.ack = !noack → puts a 1 on an ACK-requesting transmit.
  • LOGITacker's Unifying-compatible path puts a 0 there.

The two stacks encode "I want an ACK" with opposite bit values, and this never surfaces at the API level (esb_write_payload()'s noack argument) — only in the raw on-air S1 bit.

Fix

Forcing NCS's S1 bit to match Unifying's raw convention (i.e. pdu->type.dpl_pdu.ack = noack for this Unifying use case) made ADDRESS / END / CRC events fire for the first time, and RSP1 started parsing immediately.

Full writeup (with the other walls I hit — LOGITacker not booting on this dongle, nrf_esb_illegalmod being sniffing-only, test-oracle traps, channel-search tuning): Point right https://dev.to/arsenapple/porting-logitech-unifying-to-nrf-connect-sdk-why-esbwritepayload-gets-no-ack-and-4-other-walls-1mag

Hope this helps the next person searching "NCS esb no ACK Unifying".

Related