Protocol decoder:nrf24l01

From sigrok
Jump to navigation Jump to search
NRF24L01 plus module.jpg
Name nRF24L01(+)
Description 2.4GHz transceiver chip
Status supported
License GPLv2+
Source code decoders/nrf24l01
Input spi
Output nrf24l01
Optional probes
Options chip

The nrf24l01 protocol decoder supports the protocol spoken by the Nordic Semiconductor nRF24L01 and nRF24L01+ 2.4GHz transceiver chips.


Modules with these chips can be purchased fairly inexpensive from various online marketplaces. Most (all?) have an 8-pin header with the following pinout:

Function Pin Pin Function
CE 3 4 CSN

The chip has two chip select pins, "CE" used to control the standby mode, and "CSN" used for SPI communication.


The chip uses the standard SPI protocol and pins (CSN, SCK, MOSI, MISO), with the additional CE (used to control the RX/TX and standby modes) and IRQ (used to inform the SPI master about the completion of a packet reception/transmission) signals. If the number of available pins of the master are scarce, the CE pin can be tied to VCC and the IRQ pin can be left open. Polling over SPI can be used instead.

SPI commands can have variable length, the CSN signal has to stay low during the whole command, and then go high after the last byte. The first byte of a command defines the type of the command, the chip always outputs its internal status register at the beginning. The following bytes are dependent on the command type, can be register values to write into the chip or payload data to send, or empty bytes that are ignored if the command only reads the output of the chip.

Variants and clones of the chip

nRF24L01 First chip of the family.

Supports data rates of 1 Mbps and 2 Mbps. Some features of the chip (dynamic payload length, suppression of ACK packets) and their corresponding SPI commands have to be enabled using the ACTIVATE+0x73 command before they can be used.

nRF24L01+ Drop-in replacement for the nRF24L01 with the following additions:
  • In addition to the 1 and 2 Mbps data rates, the chip also supports 250 kbps with a higher sensitivity as for the other data rates.
  • No need to ACTIVATE certain features.
BK2401 nRF24L01 clone that only supports a data rate of 1 Mbps.

Contains a second register bank that can be switched to with the ACTIVATE+0x53 command. The registers in this bank have to be written with certain magic values (specified in the datasheet) before the chip can be used.

BK2421 Same as the BK2401, but also supports a data rate of 2 Mbps.
BK2423 A clone that supports the three data rates of the nRF24L01+. Also has the second register bank.
BK2491 Another clone that only supports 1 and 2 Mbps. Also has the second register bank.

(There is no data sheet available for this chip, but one can find the datasheet of a Wenshing Electronics TRW-24G2 module that contains the chip. When searching online for BK2491 datasheet one does however find various datasheets for other (even completely unrelated) Beken chips because the PDF title of these document is BK2491 Specification; apparently the unreleased datasheet for this chip was used as a template for other datasheets without changing the title.)

Hope Microelectronics RFM70 A RF module containing a COB. The PDF title of the datasheet says BK2491 Specification.
RFM73 A RF module containing a COB. The PDF title of the datasheet says BK2423 Specification.
XN297 nRF24L01 clone: Supports 1 and 2 Mbps data rates and also needs the ACTIVATE+0x73 command.

Contains three additional registers (DEMOD_CAL, RF_CAL, BB_CAL). Found on some toy quadcopters; datasheet is only available in Chinese.

? SI24R1 nRF24L01+ clone: Support three data rates and no ACTIVATE command.

Often advertised as power enhanced or similar because the chip can transmit with 7dBm. The modules containing this chip are often described as "compatible nRF24L01(+)" and many sellers directly link to the nRF24L01(+) datasheets (the SI24R1 datasheet is only available in Chinese).

Some forum posts name Silicon Labs as the manufacturer, however the datasheet contains no evidence for this, and DN-IC (linked above) seems to be a distributor and not a manufacturer.
Semitek SE8R01 Incompatible clone that uses a slightly different on-air format.

Supports 500 kbps (not 250 kbps), 1 and 2 Mbps data rates and also has a second register bank (even though it's not documented in the datasheet, see the blog post linked above).

NST Techsemic LT8900 Modules with this chip are sold as "nRF24L01 compatible" (and even as "BK2423 compatible", showing how popular that clone is), however this compatibility can only refer to the on-air format, because the SPI commands and the registers are totally different, and the chip also supports I²C communication. Therefore, the sigrok nrf24l01 protocol decoder can't decode this chip's protocol.
LT8901, LT8910 Datasheets only available in Chinese, these chips look very similar to the LT8900.
The homepage of the manufacturer lists a whole range of similar 2.4 GHz chips that may be (on-air) compatible with the nRF24L01(+).

It's not known if the on-air format of the clones is compatible with the original chips (except for the SE8R01, where it's clear that it doesn't work), the datasheets of the clones don't go into so much detail. The Nordic datasheets describe their "Enhanced ShockBurst™" mode and frame format, the Beken datasheets only briefly mention a "burst mode".

A comment by a Nordic employee under a article titled "Nordic NRF24L01+ - real vs. fake" says that some clones interpret a flag different than the original chip, resulting in problems (quote: "When EN_DPL is activated, the NO_ACK bit get reversed in the real nRF-devices. They did such a good job of cloning they cloned the datasheet error into the device!!!"). The comment doesn't say which clone is meant, but from the article and the other comments it's most probably the SI24R1.


The nrf24l01 decoder stacks on top of the SPI decoder and decodes the commands to the chip and the responses of the chip, and also issues warnings for wrong/incomplete commands.

Some decoded commands in PulseView:

sigrok-cli can be used to decode the capture in the following way:

$ sigrok-cli -i sigrok-dumps/spi/nrf24l01/ \
             -P spi:cs=rpi_CSN:clk=rpi_CLK:mosi=rpi_MOSI:miso=rpi_MISO,nrf24l01
Reg STATUS = "0E"
Reg CONFIG = "08"
Reg STATUS = "0E"
Reg STATUS = "0E"
Reg STATUS = "0E"
Cmd W_REGISTER: RX_ADDR_P0 = "376774367E"
Reg STATUS = "0E"
Reg STATUS = "40"
RX payload = "message #0"

It can be seen that the register values are hex encoded, while the payload data is, if possible, represented as ASCII characters.

If only the payload is of interest, the tx-data and rx-data annotation classes can be selected using the -A|--protocol-decoder-annotations option:

$ sigrok-cli -i sigrok-dumps/spi/nrf24l01/ \
             -P spi:cs=uc_CSN:clk=uc_CLK:mosi=uc_MOSI:miso=uc_MISO,nrf24l01 \
             -A nrf24l01=tx-data
TX payload = "message #0"
TX payload = "message #1"
TX payload = "message #2"
TX payload = "message #3"
TX payload = "message #4"
TX payload = "message #5"
TX payload = "message #6"
TX payload = "message #7"
TX payload = "message #8"
TX payload = "message #9"
$ sigrok-cli -i sigrok-dumps/spi/nrf24l01/ \
             -P spi:cs=rpi_CSN:clk=rpi_CLK:mosi=rpi_MOSI:miso=rpi_MISO,nrf24l01 \
             -A nrf24l01=rx-data
RX payload = "message #0"
RX payload = "message #1"
RX payload = "message #2"
RX payload = "message #3"
RX payload = "message #4"
RX payload = "message #5"

Warnings issued for erroneous commands:

$ sigrok-cli -i sigrok-dumps/spi/nrf24l01/ \
             -P spi:cs=CS:clk=CLK:mosi=MOSI:miso=MISO,nrf24l01
Reg STATUS = "00"
missing data bytes
Reg STATUS = "00"
missing data bytes