Optimized high speed nRF24L01+ driver class documentation 1.5.0
TMRh20 2020 - Optimized fork of the nRF24L01+ driver
Loading...
Searching...
No Matches
RF24.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 version 2 as published by the Free Software Foundation.
7 */
8
14
15#ifndef RF24_H_
16#define RF24_H_
17
18#include "RF24_config.h"
19#include "nRF24L01.h"
20
21#if defined(RF24_LINUX) || defined(LITTLEWIRE)
22 #include "utility/includes.h"
23#elif defined SOFTSPI
24 #include <DigitalIO.h>
25#endif
26
71
90
111
131
137
154
159class RF24
160{
161private:
162#ifdef SOFTSPI
163 SoftSPI<SOFT_SPI_MISO_PIN, SOFT_SPI_MOSI_PIN, SOFT_SPI_SCK_PIN, SPI_MODE> spi;
164#elif defined(SPI_UART)
165 SPIUARTClass uspi;
166#endif
167
168#if defined(RF24_LINUX) || defined(XMEGA_D3) /* XMEGA can use SPI class */
169 SPI spi;
170#endif // defined (RF24_LINUX) || defined (XMEGA_D3)
171#if defined(RF24_SPI_PTR)
172 _SPI* _spi;
173#endif // defined (RF24_SPI_PTR)
174
175 rf24_gpio_pin_t ce_pin; /* "Chip Enable" pin, activates the RX or TX role */
176 rf24_gpio_pin_t csn_pin; /* SPI Chip select */
177 uint32_t spi_speed; /* SPI Bus Speed */
178#if defined(RF24_LINUX) || defined(XMEGA_D3) || defined(RF24_RP2)
179 uint8_t spi_rxbuff[32 + 1]; //SPI receive buffer (payload max 32 bytes)
180 uint8_t spi_txbuff[32 + 1]; //SPI transmit buffer (payload max 32 bytes + 1 byte for the command)
181#endif
182 uint8_t status; /* The status byte returned from every SPI transaction */
183 uint8_t payload_size; /* Fixed size of payloads */
184 uint8_t pipe0_reading_address[5]; /* Last address set on pipe 0 for reading. */
185 uint8_t pipe0_writing_address[5]; /* Last address set on pipe 0 for writing. */
186 uint8_t config_reg; /* For storing the value of the CONFIG register */
187 bool _is_p_variant; /* For storing the result of testing the toggleFeatures() affect */
188 bool _is_p0_rx; /* For keeping track of pipe 0's usage in user-triggered RX mode. */
189
190protected:
197 inline void beginTransaction();
198
199 inline void endTransaction();
200
204 uint8_t addr_width;
207
217 void read_register(uint8_t reg, uint8_t* buf, uint8_t len);
218
225 uint8_t read_register(uint8_t reg);
226
227public:
234
255 RF24(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin, uint32_t _spi_speed = RF24_SPI_SPEED);
256
267 RF24(uint32_t _spi_speed = RF24_SPI_SPEED);
268
269#if defined(RF24_LINUX)
270 virtual ~RF24() {};
271#endif
272
287 bool begin(void);
288
289#if defined(RF24_SPI_PTR) || defined(DOXYGEN_FORCED)
305 bool begin(_SPI* spiBus);
306
329 bool begin(_SPI* spiBus, rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin);
330#endif // defined (RF24_SPI_PTR) || defined (DOXYGEN_FORCED)
331
341 bool begin(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin);
342
346 bool isChipConnected();
347
368 void startListening(void);
369
383 void stopListening(void);
384
390 void stopListening(const uint8_t* txAddress);
391
423 bool available(void);
424
481 void read(void* buf, uint8_t len);
482
523 bool write(const void* buf, uint8_t len);
524
571
572 void openWritingPipe(const uint8_t* address);
573
618 void openReadingPipe(uint8_t number, const uint8_t* address);
619
627
642 void ce(bool level);
643
658 void printDetails(void);
659
668 void printStatus(uint8_t flags);
669
693 void printPrettyDetails(void);
694
738 uint16_t sprintfPrettyDetails(char* debugging_information);
739
793 void encodeRadioDetails(uint8_t* encoded_status);
794
852 bool available(uint8_t* pipe_num);
853
867 bool rxFifoFull();
868
877 rf24_fifo_state_e isFifo(bool about_tx);
878
889 bool isFifo(bool about_tx, bool check_empty);
890
908 void powerDown(void);
909
916 void powerUp(void);
917
951 bool write(const void* buf, uint8_t len, const bool multicast);
952
1001 bool writeFast(const void* buf, uint8_t len);
1002
1038 bool writeFast(const void* buf, uint8_t len, const bool multicast);
1039
1081 bool writeBlocking(const void* buf, uint8_t len, uint32_t timeout);
1082
1114 bool txStandBy();
1115
1141 bool txStandBy(uint32_t timeout, bool startTx = 0);
1142
1187 bool writeAckPayload(uint8_t pipe, const void* buf, uint8_t len);
1188
1209 uint8_t clearStatusFlags(uint8_t flags = RF24_IRQ_ALL);
1210
1227 void setStatusFlags(uint8_t flags = RF24_IRQ_NONE);
1228
1241 uint8_t getStatusFlags();
1242
1251 uint8_t update();
1252
1291 void startFastWrite(const void* buf, uint8_t len, const bool multicast, bool startTx = 1);
1292
1326 bool startWrite(const void* buf, uint8_t len, const bool multicast);
1327
1358 void reUseTX();
1359
1367 uint8_t flush_tx(void);
1368
1374 uint8_t flush_rx(void);
1375
1384 bool testCarrier(void);
1385
1404 bool testRPD(void);
1405
1413 bool isValid();
1414
1421 void closeReadingPipe(uint8_t pipe);
1422
1423#if defined(FAILURE_HANDLING)
1456
1457#endif // defined (FAILURE_HANDLING)
1458
1468
1475 void setAddressWidth(uint8_t a_width);
1476
1492 void setRetries(uint8_t delay, uint8_t count);
1493
1510 void setChannel(uint8_t channel);
1511
1524 uint8_t getChannel(void);
1525
1543 void setPayloadSize(uint8_t size);
1544
1559 uint8_t getPayloadSize(void);
1560
1581 uint8_t getDynamicPayloadSize(void);
1582
1602 void enableAckPayload(void);
1603
1609 void disableAckPayload(void);
1610
1618 void enableDynamicPayloads(void);
1619
1629 void disableDynamicPayloads(void);
1630
1649 void enableDynamicAck();
1650
1657 bool isPVariant(void);
1658
1689 void setAutoAck(bool enable);
1690
1729 void setAutoAck(uint8_t pipe, bool enable);
1730
1748 void setPALevel(uint8_t level, bool lnaEnable = 1);
1749
1756 uint8_t getPALevel(void);
1757
1765 uint8_t getARC(void);
1766
1783 bool setDataRate(rf24_datarate_e speed);
1784
1792
1804 void setCRCLength(rf24_crclength_e length);
1805
1814
1820 void disableCRC(void);
1821
1833 uint32_t txDelay;
1834
1843 uint32_t csDelay;
1844
1860 void startConstCarrier(rf24_pa_dbm_e level, uint8_t channel);
1861
1876 void stopConstCarrier(void);
1877
1885 void toggleAllPipes(bool isEnabled);
1886
1896 void setRadiation(uint8_t level, rf24_datarate_e speed, bool lnaEnable = true);
1897
1905
1930 void openReadingPipe(uint8_t number, uint64_t address);
1931
1946 void openWritingPipe(uint64_t address);
1947
1958 bool isAckPayloadAvailable(void);
1959
1995 void maskIRQ(bool tx_ok, bool tx_fail, bool rx_ready);
1996
2030 void whatHappened(bool& tx_ok, bool& tx_fail, bool& rx_ready);
2031
2041 void stopListening(const uint64_t txAddress);
2042
2043private:
2053
2058 void _init_obj();
2059
2065 bool _init_radio();
2066
2070 bool _init_pins();
2071
2082 void csn(bool mode);
2083
2093 void write_register(uint8_t reg, const uint8_t* buf, uint8_t len);
2094
2103 void write_register(uint8_t reg, uint8_t value);
2104
2116 void write_payload(const void* buf, uint8_t len, const uint8_t writeType);
2117
2128 void read_payload(void* buf, uint8_t len);
2129
2130#if !defined(MINIMAL)
2131
2139 void print_observe_tx(uint8_t value);
2140
2152 void print_byte_register(const char* name, uint8_t reg, uint8_t qty = 1);
2153
2165 void print_address_register(const char* name, uint8_t reg, uint8_t qty = 1);
2166
2179 uint8_t sprintf_address_register(char* out_buffer, uint8_t reg, uint8_t qty = 1);
2180#endif
2181
2188 void toggle_features(void);
2189
2190#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
2191
2192 void errNotify(void);
2193 inline int8_t errHandler(bool* doRecovery);
2194 inline void errHandler();
2195
2196 bool failureFlushed;
2197#endif
2198
2205 inline uint8_t _data_rate_reg_value(rf24_datarate_e speed);
2206
2214 inline uint8_t _pa_level_reg_value(uint8_t level, bool lnaEnable);
2215
2217};
2218
2228
2239
2255
2265
2278
2291
2300
2313
2323
2333
2357
2376
2382
2397
2413
2432
2448
2464
2481
2494
2505
2517
2528
2544
2554
2567
2568#endif // RF24_H_
#define RF24_SPI_SPEED
The default SPI speed (in Hz).
Definition RF24_config.h:44
void disableAckPayload(void)
Definition RF24.cpp:1879
RF24(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin, uint32_t _spi_speed=RF24_SPI_SPEED)
Definition RF24.cpp:562
uint16_t sprintfPrettyDetails(char *debugging_information)
Definition RF24.cpp:838
bool begin(void)
Definition RF24.cpp:975
uint8_t getPayloadSize(void)
Definition RF24.cpp:641
bool available(void)
Definition RF24.cpp:1618
bool txStandBy()
Definition RF24.cpp:1521
void endTransaction()
Definition RF24.cpp:137
bool failureDetected
Definition RF24.h:1454
void startListening(void)
Definition RF24.cpp:1146
bool isAckPayloadAvailable(void)
Definition RF24.cpp:1919
void ce(bool level)
Definition RF24.cpp:105
void printPrettyDetails(void)
Definition RF24.cpp:741
void setPayloadSize(uint8_t size)
Definition RF24.cpp:628
bool isValid()
Definition RF24.cpp:1139
bool writeAckPayload(uint8_t pipe, const void *buf, uint8_t len)
Definition RF24.cpp:1906
void stopConstCarrier(void)
Definition RF24.cpp:2136
rf24_fifo_state_e isFifo(bool about_tx)
Definition RF24.cpp:1506
bool dynamic_payloads_enabled
Definition RF24.h:206
void enableDynamicPayloads(void)
Definition RF24.cpp:1820
bool writeFast(const void *buf, uint8_t len)
Definition RF24.cpp:1454
void disableDynamicPayloads(void)
Definition RF24.cpp:1840
void setRetries(uint8_t delay, uint8_t count)
Definition RF24.cpp:2096
bool write(const void *buf, uint8_t len)
Definition RF24.cpp:1341
uint8_t getARC(void)
Definition RF24.cpp:1998
uint8_t flush_rx(void)
Definition RF24.cpp:471
void beginTransaction()
Definition RF24.cpp:119
void powerUp(void)
Definition RF24.cpp:1224
void setChannel(uint8_t channel)
Definition RF24.cpp:615
void disableCRC(void)
Definition RF24.cpp:2089
void enableDynamicAck()
Definition RF24.cpp:1893
bool isPVariant(void)
Definition RF24.cpp:1926
uint8_t getDynamicPayloadSize(void)
Definition RF24.cpp:1605
bool ack_payloads_enabled
Definition RF24.h:202
uint8_t getChannel(void)
Definition RF24.cpp:621
void stopListening(void)
Definition RF24.cpp:1170
rf24_datarate_e getDataRate(void)
Definition RF24.cpp:2025
bool testRPD(void)
Definition RF24.cpp:1975
uint16_t failureRecoveryAttempts
Definition RF24.h:1455
void setCRCLength(rf24_crclength_e length)
Definition RF24.cpp:2049
void read(void *buf, uint8_t len)
Definition RF24.cpp:1636
uint32_t txDelay
Definition RF24.h:1833
void closeReadingPipe(uint8_t pipe)
Definition RF24.cpp:1794
void read_register(uint8_t reg, uint8_t *buf, uint8_t len)
Definition RF24.cpp:151
void openReadingPipe(uint8_t number, const uint8_t *address)
Definition RF24.cpp:1765
void powerDown(void)
Definition RF24.cpp:1214
void toggleAllPipes(bool isEnabled)
Open or close all data pipes.
Definition RF24.cpp:2156
uint8_t addr_width
Definition RF24.h:204
void setPALevel(uint8_t level, bool lnaEnable=1)
Definition RF24.cpp:1982
rf24_crclength_e getCRCLength(void)
Definition RF24.cpp:2069
void encodeRadioDetails(uint8_t *encoded_status)
Definition RF24.cpp:921
void maskIRQ(bool tx_ok, bool tx_fail, bool rx_ready)
Definition RF24.cpp:1594
void enableAckPayload(void)
Definition RF24.cpp:1861
bool isChipConnected()
Definition RF24.cpp:1132
void startConstCarrier(rf24_pa_dbm_e level, uint8_t channel)
Definition RF24.cpp:2102
void startFastWrite(const void *buf, uint8_t len, const bool multicast, bool startTx=1)
Definition RF24.cpp:1466
uint32_t csDelay
Definition RF24.h:1843
bool testCarrier(void)
Definition RF24.cpp:1968
bool rxFifoFull()
Definition RF24.cpp:1499
void setAddressWidth(uint8_t a_width)
Definition RF24.cpp:1750
void setRadiation(uint8_t level, rf24_datarate_e speed, bool lnaEnable=true)
configure the RF_SETUP register in 1 transaction
Definition RF24.cpp:2206
uint8_t flush_tx(void)
Definition RF24.cpp:480
bool startWrite(const void *buf, uint8_t len, const bool multicast)
Definition RF24.cpp:1479
void printDetails(void)
Definition RF24.cpp:695
void printStatus(uint8_t flags)
Definition RF24.cpp:490
bool writeBlocking(const void *buf, uint8_t len, uint32_t timeout)
Definition RF24.cpp:1349
void reUseTX()
Definition RF24.cpp:1399
bool setDataRate(rf24_datarate_e speed)
Definition RF24.cpp:2005
void setAutoAck(bool enable)
Definition RF24.cpp:1933
void openWritingPipe(const uint8_t *address)
Definition RF24.cpp:1706
uint8_t getPALevel(void)
Definition RF24.cpp:1991
void whatHappened(bool &tx_ok, bool &tx_fail, bool &rx_ready)
Definition RF24.cpp:1648
rf24_crclength_e
Definition RF24.h:103
@ RF24_CRC_16
Definition RF24.h:109
@ RF24_CRC_DISABLED
Definition RF24.h:105
@ RF24_CRC_8
Definition RF24.h:107
rf24_datarate_e
Definition RF24.h:82
@ RF24_2MBPS
Definition RF24.h:86
@ RF24_250KBPS
Definition RF24.h:88
@ RF24_1MBPS
Definition RF24.h:84
rf24_pa_dbm_e
Definition RF24.h:37
@ RF24_PA_ERROR
Definition RF24.h:69
@ RF24_PA_MIN
Definition RF24.h:44
@ RF24_PA_LOW
Definition RF24.h:51
@ RF24_PA_MAX
Definition RF24.h:65
@ RF24_PA_HIGH
Definition RF24.h:58
#define delay(millisec)
uint16_t rf24_gpio_pin_t
#define _SPI
uint8_t clearStatusFlags(uint8_t flags=RF24_IRQ_ALL)
Definition RF24.cpp:1662
uint8_t getStatusFlags()
Definition RF24.cpp:1679
rf24_irq_flags_e
An enumeration of constants used to configure Status flags.
Definition RF24.h:142
uint8_t update()
Definition RF24.cpp:1686
void setStatusFlags(uint8_t flags=RF24_IRQ_NONE)
Definition RF24.cpp:1670
@ RF24_TX_DS
Represents an event where TX Data Sent successfully.
Definition RF24.h:148
@ RF24_IRQ_NONE
An alias of 0 to describe no IRQ events enabled.
Definition RF24.h:144
@ RF24_TX_DF
Represents an event where TX Data Failed to send.
Definition RF24.h:146
@ RF24_RX_DR
Represents an event where RX Data is Ready to RF24::read().
Definition RF24.h:150
@ RF24_IRQ_ALL
Equivalent to RF24_RX_DR | RF24_TX_DS | RF24_TX_DF.
Definition RF24.h:152
rf24_fifo_state_e
Definition RF24.h:121
@ RF24_FIFO_INVALID
Represents corruption of data over SPI (when observed).
Definition RF24.h:129
@ RF24_FIFO_FULL
The FIFO is full.
Definition RF24.h:127
@ RF24_FIFO_OCCUPIED
The FIFO is not full nor empty, but it is occupied with 1 or 2 payloads.
Definition RF24.h:123
@ RF24_FIFO_EMPTY
The FIFO is empty.
Definition RF24.h:125
constexpr uint8_t MASK_MAX_RT
Definition nRF24L01.h:64
constexpr uint8_t TX_DS
Definition nRF24L01.h:89
constexpr uint8_t RX_DR
Definition nRF24L01.h:88