NRF24L01+ driver interface

Low-level driver for nrf24l01+ transceiver.

enum nrf24l01p_aw_t
NRF24L01P_AW_3BYTE
address width is 3 Byte
NRF24L01P_AW_4BYTE
address width is 4 Byte
NRF24L01P_AW_5BYTE
address width is 5 Byte
enum nrf24l01p_dr_t
NRF24L01P_DR_250KBS
datarate is 250 kbps
NRF24L01P_DR_1MBS
datarate is 1 Mbps
NRF24L01P_DR_2MBS
datarate is 2 Mbps
enum nrf24l01p_pwr_t
NRF24L01P_PWR_N18DBM = 0
power is -18dBm
NRF24L01P_PWR_N12DBM
power is -12dBm
NRF24L01P_PWR_N6DBM
power is - 6dBm
NRF24L01P_PWR_0DBM
power is 0dBm
enum nrf24l01p_rx_pipe_t
NRF24L01P_PIPE0 = 0
RX pipe 0.
NRF24L01P_PIPE1
RX pipe 1.
NRF24L01P_PIPE2
RX pipe 2.
NRF24L01P_PIPE3
RX pipe 3.
NRF24L01P_PIPE4
RX pipe 4.
NRF24L01P_PIPE5
RX pipe 5.
enum nrf24l01p_crc_t
NRF24L01P_CRC_1BYTE = 0
encoding scheme generates 1 Byte redundancy
NRF24L01P_CRC_2BYTE
encoding scheme generates 2 Bytes redundancy
enum nrf24l01p_retransmit_delay_t
NRF24L01P_RETR_250US = 0
retransmit delay is 250us
NRF24L01P_RETR_500US
retransmit delay is 500us
NRF24L01P_RETR_750US
retransmit delay is 750us
NRF24L01P_RETR_1000US
retransmit delay is 1000us
NRF24L01P_RETR_1250US
retransmit delay is 1250us
NRF24L01P_RETR_1500US
retransmit delay is 1500us
NRF24L01P_RETR_1750US
retransmit delay is 1750us
NRF24L01P_RETR_2000US
retransmit delay is 2000us
NRF24L01P_RETR_2250US
retransmit delay is 2250us
NRF24L01P_RETR_2500US
retransmit delay is 2500us
NRF24L01P_RETR_2750US
retransmit delay is 2750us
NRF24L01P_RETR_3000US
retransmit delay is 3000us
NRF24L01P_RETR_3250US
retransmit delay is 3250us
NRF24L01P_RETR_3500US
retransmit delay is 3500us
NRF24L01P_RETR_3750US
retransmit delay is 3750us
NRF24L01P_RETR_4000US
retransmit delay is 4000us
enum nrf24l01p_rx_event_t
RCV_PKT_NRF24L01P = 0
transceiver received data
int nrf24l01p_read_reg(const nrf24l01p_t * dev, char reg, char * answer)

Read one register of the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
reg:Register address to read from.
answer:Byte to read.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_write_reg(const nrf24l01p_t * dev, char reg, char write)

Write one register to the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
reg:Register address to write to.
write:Byte to write.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_init(nrf24l01p_t * dev, spi.h::spi_t spi, gpio.h::gpio_t ce, gpio.h::gpio_t csn, gpio.h::gpio_t irq)

Initialize the nrf24l01+ transceiver.

@ note This function initializes the transceiver so that it is ready to use.

Parameters

dev:Transceiver device to use.
spi:SPI device to use.
ce:GPIO pin to use for chip enable.
csn:GPIO pin to use for chip select.
irq:GPIO pin to use for interrupt request.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_on(const nrf24l01p_t * dev)

Power on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_off(const nrf24l01p_t * dev)

Power off the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
void nrf24l01p_transmit(const nrf24l01p_t * dev)

Transmit payload laying in TX FIFO of the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

int nrf24l01p_read_payload(const nrf24l01p_t * dev, char * answer, unsigned int size)

Read payload from RX FIFO of the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
answer:Buffer to receive bytes to.
size:Number of bytes to transfer. For nrf24l01+ in general 32.

Return values

  • Number of bytes that were transfered.
  • -1 on error.
void nrf24l01p_register(nrf24l01p_t * dev, unsigned int * pid)

Register a given ID to the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
pid:ID to register.

int nrf24l01p_enable_dynamic_payload(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe)

Enable dynamic payload for the pipe on give nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
pipe:RX pipe for which dynamic payload is enabled

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_enable_dynamic_ack(const nrf24l01p_t * dev)

Enable dynamic ack for the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_unregister(nrf24l01p_t * dev, unsigned int pid)

Unregister the nrf24l01+ transceiver from his ID.

Parameters

dev:Transceiver device to use.
pid:Actual ID to unregister.

Return values

  • 0 on success.
  • -1 on error.
void nrf24l01p_get_id(const nrf24l01p_t * dev, unsigned int * pid)

Get ID from the nrf24l01p transceiver.

Parameters

dev:Transceiver device to use.
pid:Transceiver ID.

void nrf24l01p_start(const nrf24l01p_t * dev)

Start searching packets while in RX mode.

Parameters

dev:Transceiver device to use.

void nrf24l01p_stop(const nrf24l01p_t * dev)

Stop searching packets while in RX mode.

Parameters

dev:Transceiver device to use.

int nrf24l01p_preload(const nrf24l01p_t * dev, char * data, unsigned int size)

Preload TX FIFO with payload to transmit.

Parameters

dev:Transceiver device to use.
data:Buffer to preload.
size:Number of bytes in buffer. For nrf24l01+ e.g. 32

Return values

  • Number of bytes that were transfered.
  • -1 on error.
int nrf24l01p_set_channel(const nrf24l01p_t * dev, uint8_t chan)

Set the RF channel for the nrf24l01+ transceiver.

Note

To ensure non-overlapping channels in 2Mbps mode, don’t use directly neighbouring channels in this mode.

Parameters

dev:Transceiver device to use.
chan:Buffer to preload.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_set_address_width(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_aw_t aw)

Set the address width for the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
aw:Address width (type nrf24l01p_aw_t).

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_set_payload_width(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe, uint8_t width)

Set the RX payload width for the nrf24l01+ transceiver.

@ note This function sets the payload width for one packet. If the maximum of 32 bytes is exeeded, this value is set to 32.

Parameters

dev:Transceiver device to use.
pipe:RX pipe to set the payload width.
width:Numer of bytes per packet in RX payload.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_set_tx_address(const nrf24l01p_t * dev, const char * saddr, unsigned int length)

Set the TX address for the nrf24l01+ transceiver (byte array).

Note

You can either use this function and give it a pointer to a byte array which holds the address to set, or use “nrf24l01p_set_tx_address_long” which requires a uint64_t which holds the address in the LSBs.

Parameters

dev:Transceiver device to use.
saddr:Byte array which holds the TX address.
length:Number of bytes in address array.

Return values

  • Address length on success.
  • -1 on error.
int nrf24l01p_set_tx_address_long(const nrf24l01p_t * dev, uint64_t saddr, unsigned int length)

Set the TX address for the nrf24l01+ transceiver (long int).

Parameters

dev:Transceiver device to use.
saddr:Long integer which holds the TX address in LSBs.
length:Number of relevant bytes in uint64_t.

Return values

  • Address length on success.
  • -1 on error.
int nrf24l01p_set_rx_address(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe, const char * saddr, unsigned int length)

Set the RX address for the nrf24l01+ transceiver (byte array).

Note

You can either use this function and give it a pointer to a byte array which holds the address to set, or use “nrf24l01p_set_rx_address_long” which requires a uint64_t which holds the address in the LSBs.

Parameters

dev:Transceiver device to use.
pipe:RX pipe to set the address.
saddr:Byte array which holds the RX address.
length:Number of bytes in address array.

Return values

  • Address length on success.
  • -1 on error.
int nrf24l01p_set_rx_address_long(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe, uint64_t saddr, unsigned int length)

Set the RX address for the nrf24l01+ transceiver (long int).

Parameters

dev:Transceiver device to use.
pipe:RX pipe to set the address.
saddr:Long integer which holds the RX address in LSBs.
length:Number of relevant bytes in uint64_t.

Return values

  • Address length on success.
  • -1 on error.
uint64_t nrf24l01p_get_tx_address_long(const nrf24l01p_t * dev)

Get the TX address for the nrf24l01+ transceiver (long int).

Parameters

dev:Transceiver device to use.

Return values

  • TX address of the nrf24l01+ transceiver.
  • -1 on error.
uint64_t nrf24l01p_get_rx_address_long(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe)

Get the RX address for the nrf24l01+ transceiver (long int).

Parameters

dev:Transceiver device to use.
pipe:RX pipe to get the address from.

Return values

  • RX address of the nrf24l01+ transceiver.
  • -1 on error.
int nrf24l01p_set_datarate(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_dr_t dr)

Get the TX address for the nrf24l01+ transceiver (long int).

Note

If you chose 2Mbps you should not allocate directly neighboring RF channels.

Parameters

dev:Transceiver device to use.
dr:Datarate (of type nrf24l01p_dr_t).

Return values

  • 1 on success.
  • -1 on error.
int nrf24l01p_get_status(const nrf24l01p_t * dev)

Get the status (register) of the nrf24l01+ transceiver device.

Parameters

dev:Transceiver device to use.s of the.

Return values

  • Value of the status register.
int nrf24l01p_set_power(const nrf24l01p_t * dev, int pwr)

Set the transmit power for the nrf24l01+ transceiver device.

Note

This function rounds the input values to the nearest possible setting.

Parameters

dev:Transceiver device to use.
pwr:TX power for the nrf24l01p transceiver.

Return values

  • 1 on success.
  • -1 on error.
int nrf24l01p_get_power(const nrf24l01p_t * dev)

Get the transmit power for the nrf24l01+ transceiver device.

Parameters

dev:Transceiver device to use.

Return values

  • TX power value of the nrf24l01+ transceiver.
int nrf24l01p_set_txmode(const nrf24l01p_t * dev)

Set the nrf24l01+ into TX mode.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_set_rxmode(const nrf24l01p_t * dev)

Set the nrf24l01+ into RX mode.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_reset_all_interrupts(const nrf24l01p_t * dev)

Reset all interrupts on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 1 on success.
  • -1 on error.
int nrf24l01p_reset_interrupts(const nrf24l01p_t * dev, char intrs)

Reset interrupts on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
intrs:Interrupt mask to reset

Return values

  • 1 on success.
  • -1 on error.
int nrf24l01p_mask_interrupt(const nrf24l01p_t * dev, char intr)

Mask one interrupt on the nrf24l01+ transceiver.

Note

There are three interrupts on the nrf24l01+ which can be masked: “MASK_RX_DR”, “MASK_TX_DS” and “MASK_MAX_RT”. Theay are defined in “include/nrf24l01p_settings.h”.

Parameters

dev:Transceiver device to use.
intr:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_unmask_interrupt(const nrf24l01p_t * dev, char intr)

Unmask one interrupt on the nrf24l01+ transceiver.

Note

There are three interrupts on the nrf24l01+ which can be unmasked: “MASK_RX_DR”, “MASK_TX_DS” and “MASK_MAX_RT”. Theay are defined in “include/nrf24l01p_settings.h”.

Parameters

dev:Transceiver device to use.
intr:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_enable_pipe(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe)

Enable RX datapipe on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
pipe:RX pipe to enable.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_disable_pipe(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe)

Disable RX datapipe on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
pipe:RX pipe to disable.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_disable_crc(const nrf24l01p_t * dev)

Disable CRC error detection on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0.
int nrf24l01p_enable_crc(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_crc_t crc)

Enable CRC error detection on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.
crc:Length of cyclic redundancy check (type nrf24l01p_crc_t).

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_setup_auto_ack(const nrf24l01p_t * dev, nrf24l01p.h::nrf24l01p_rx_pipe_t pipe, nrf24l01p.h::nrf24l01p_retransmit_delay_t delay_retrans, char count_retrans)

Setup and enable automatic ACK and retransmission on the nrf24l01+ transceiver.

Note

This function enables automatic acknowledgement for a given RX data pipe and also sets up the mautomatic retransmission behavior.

Parameters

dev:Transceiver device to use.
pipe:RX pipe to setup auto ack.
delay_retrans:Automatic retransmission delay (type nrf24l01p_retransmit_delay_t)
count_retrans:Auto retransmit count.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_disable_all_auto_ack(const nrf24l01p_t * dev)

Disable automatic ACK on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_flush_tx_fifo(const nrf24l01p_t * dev)

Flush TX FIFO on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
int nrf24l01p_flush_rx_fifo(const nrf24l01p_t * dev)

Flush RX FIFO on the nrf24l01+ transceiver.

Parameters

dev:Transceiver device to use.

Return values

  • 0 on success.
  • -1 on error.
void nrf24l01p_rx_cb(void * arg)

Callback that is called when interrupt occurs on interrupt pin from the nrf24l01+ transceiver.

Parameters

arg:Used to pass transceiver device “dev”.

struct nrf24l01p_t

Structure that represents the hardware setup of the nrf24l01+ transceiver.

spi.h::spi_t spi

SPI device to initialize.

gpio.h::gpio_t ce

GPIO pin to initialize as chip enable.

gpio.h::gpio_t cs

GPIO pin to initialize as chip select.

gpio.h::gpio_t irq

GPIO pin to initialize as interrupt request.

unsigned listener

Place to store an ID in.