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)
- Payload bytes are correct — byte-for-byte identical to a known-good reference implementation.
- It's actually on air — a second nRF52840 running LOGITacker (
pair sniff run) captures the exact bytes I'm sending. - 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/esbcomputes it aspdu->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): 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".