15void RF24::csn(
bool mode)
18 if (ce_pin != csn_pin) {
23 PORTB |= (1 << PINB2);
27 PORTB &= ~(1 << PINB2);
34#elif defined(ARDUINO) && !defined(RF24_SPI_TRANSACTIONS)
42 #if defined(RF24_SPI_PTR)
43 _spi->setBitOrder(MSBFIRST);
44 _spi->setDataMode(SPI_MODE0);
46 #if !defined(F_CPU) || F_CPU < 20000000
47 _spi->setClockDivider(SPI_CLOCK_DIV2);
48 #elif F_CPU < 40000000
49 _spi->setClockDivider(SPI_CLOCK_DIV4);
50 #elif F_CPU < 80000000
51 _spi->setClockDivider(SPI_CLOCK_DIV8);
52 #elif F_CPU < 160000000
53 _spi->setClockDivider(SPI_CLOCK_DIV16);
54 #elif F_CPU < 320000000
55 _spi->setClockDivider(SPI_CLOCK_DIV32);
56 #elif F_CPU < 640000000
57 _spi->setClockDivider(SPI_CLOCK_DIV64);
58 #elif F_CPU < 1280000000
59 _spi->setClockDivider(SPI_CLOCK_DIV128);
61 #error "Unsupported CPU frequency. Please set correct SPI divider."
65 _SPI.setBitOrder(MSBFIRST);
66 _SPI.setDataMode(SPI_MODE0);
68 #if !defined(F_CPU) || F_CPU < 20000000
69 _SPI.setClockDivider(SPI_CLOCK_DIV2);
70 #elif F_CPU < 40000000
71 _SPI.setClockDivider(SPI_CLOCK_DIV4);
72 #elif F_CPU < 80000000
73 _SPI.setClockDivider(SPI_CLOCK_DIV8);
74 #elif F_CPU < 160000000
75 _SPI.setClockDivider(SPI_CLOCK_DIV16);
76 #elif F_CPU < 320000000
77 _SPI.setClockDivider(SPI_CLOCK_DIV32);
78 #elif F_CPU < 640000000
79 _SPI.setClockDivider(SPI_CLOCK_DIV64);
80 #elif F_CPU < 1280000000
81 _SPI.setClockDivider(SPI_CLOCK_DIV128);
83 #error "Unsupported CPU frequency. Please set correct SPI divider."
88#elif defined(RF24_RPi)
90 _SPI.chipSelect(csn_pin);
93#if !defined(RF24_LINUX)
97 static_cast<void>(mode);
107 if (ce_pin != csn_pin) {
119#if defined(RF24_SPI_TRANSACTIONS)
120 #if defined(RF24_SPI_PTR)
121 #if defined(RF24_RP2)
122 _spi->beginTransaction(spi_speed);
124 _spi->beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
127 _SPI.beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
138#if defined(RF24_SPI_TRANSACTIONS)
139 #if defined(RF24_SPI_PTR)
140 _spi->endTransaction();
142 _SPI.endTransaction();
151#if defined(RF24_LINUX) || defined(RF24_RP2)
153 uint8_t* prx = spi_rxbuff;
154 uint8_t* ptx = spi_txbuff;
155 uint8_t size =
static_cast<uint8_t
>(len + 1);
163 #if defined(RF24_RP2)
164 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
166 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
181 #if defined(RF24_SPI_PTR)
182 status = _spi->transfer(reg);
184 *buf++ = _spi->transfer(0xFF);
188 status =
_SPI.transfer(reg);
190 *buf++ =
_SPI.transfer(0xFF);
204#if defined(RF24_LINUX) || defined(RF24_RP2)
207 uint8_t* prx = spi_rxbuff;
208 uint8_t* ptx = spi_txbuff;
212 #if defined(RF24_RP2)
213 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, 2);
215 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), 2);
225 #if defined(RF24_SPI_PTR)
226 status = _spi->transfer(reg);
227 result = _spi->transfer(0xff);
230 status =
_SPI.transfer(reg);
231 result =
_SPI.transfer(0xff);
242void RF24::write_register(uint8_t reg,
const uint8_t* buf, uint8_t len)
244#if defined(RF24_LINUX) || defined(RF24_RP2)
246 uint8_t* prx = spi_rxbuff;
247 uint8_t* ptx = spi_txbuff;
248 uint8_t size =
static_cast<uint8_t
>(len + 1);
255 #if defined(RF24_RP2)
256 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
258 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
266 #if defined(RF24_SPI_PTR)
269 _spi->transfer(*buf++);
275 _SPI.transfer(*buf++);
285void RF24::write_register(uint8_t reg, uint8_t value)
288#if defined(RF24_LINUX) || defined(RF24_RP2)
290 uint8_t* prx = spi_rxbuff;
291 uint8_t* ptx = spi_txbuff;
295 #if defined(RF24_RP2)
296 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, 2);
298 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), 2);
306 #if defined(RF24_SPI_PTR)
308 _spi->transfer(value);
311 _SPI.transfer(value);
319void RF24::write_payload(
const void* buf, uint8_t data_len,
const uint8_t writeType)
321 const uint8_t* current =
reinterpret_cast<const uint8_t*
>(buf);
323 uint8_t blank_len = !data_len ? 1 : 0;
325 data_len =
rf24_min(data_len, payload_size);
326 blank_len =
static_cast<uint8_t
>(payload_size - data_len);
329 data_len =
rf24_min(data_len,
static_cast<uint8_t
>(32));
335#if defined(RF24_LINUX) || defined(RF24_RP2)
337 uint8_t* prx = spi_rxbuff;
338 uint8_t* ptx = spi_txbuff;
340 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
347 while (blank_len--) {
351 #if defined(RF24_RP2)
352 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
354 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
363 #if defined(RF24_SPI_PTR)
364 status = _spi->transfer(writeType);
366 _spi->transfer(*current++);
369 while (blank_len--) {
374 status =
_SPI.transfer(writeType);
376 _SPI.transfer(*current++);
379 while (blank_len--) {
390void RF24::read_payload(
void* buf, uint8_t data_len)
392 uint8_t* current =
reinterpret_cast<uint8_t*
>(buf);
394 uint8_t blank_len = 0;
396 data_len =
rf24_min(data_len, payload_size);
397 blank_len =
static_cast<uint8_t
>(payload_size - data_len);
400 data_len =
rf24_min(data_len,
static_cast<uint8_t
>(32));
407#if defined(RF24_LINUX) || defined(RF24_RP2)
409 uint8_t* prx = spi_rxbuff;
410 uint8_t* ptx = spi_txbuff;
412 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
419 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
421 #if defined(RF24_RP2)
422 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
424 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
441 #if defined(RF24_SPI_PTR)
444 *current++ = _spi->transfer(0xFF);
447 while (blank_len--) {
448 _spi->transfer(0xFF);
454 *current++ =
_SPI.transfer(0xFF);
457 while (blank_len--) {
490 printf_P(
PSTR(
"RX_DR=%x TX_DS=%x TX_DF=%x RX_PIPE=%x TX_FULL=%x\r\n"),
500void RF24::print_observe_tx(uint8_t value)
507void RF24::print_byte_register(
const char* name, uint8_t reg, uint8_t qty)
520void RF24::print_address_register(
const char* name, uint8_t reg, uint8_t qty)
532 while (--bufptr >= buffer) {
542uint8_t RF24::sprintf_address_register(
char* out_buffer, uint8_t reg, uint8_t qty)
545 uint8_t* read_buffer =
new uint8_t[
addr_width];
549 while (--bufptr >= read_buffer) {
550 offset +=
sprintf_P(out_buffer + offset,
PSTR(
"%02X"), *bufptr);
553 delete[] read_buffer;
563 spi_speed(_spi_speed),
565 _is_p_variant(false),
580 : ce_pin(RF24_PIN_INVALID),
581 csn_pin(RF24_PIN_INVALID),
582 spi_speed(_spi_speed),
584 _is_p_variant(false),
598void RF24::_init_obj()
602#if defined(RF24_SPI_PTR) && !defined(RF24_RP2)
606 if (spi_speed <= 35000) {
615 const uint8_t max_channel = 125;
632 for (uint8_t i = 0; i < 6; ++i) {
633 write_register(
static_cast<uint8_t
>(
RX_PW_P0 + i), payload_size);
696 #if defined(RF24_LINUX)
697 printf(
"================ SPI Configuration ================\n");
698 uint8_t bus_ce =
static_cast<uint8_t
>(csn_pin % 10);
699 uint8_t bus_numb =
static_cast<uint8_t
>((csn_pin - bus_ce) / 10);
700 printf(
"CSN Pin\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
701 printf(
"CE Pin\t\t= Custom GPIO%d\n", ce_pin);
703 printf_P(
PSTR(
"SPI Speedz\t= %d Mhz\n"),
static_cast<uint8_t
>(spi_speed / 1000000));
704 #if defined(RF24_LINUX)
705 printf(
"================ NRF Configuration ================\n");
708 uint8_t status =
update();
714 print_address_register(
PSTR(
"TX_ADDR\t"),
TX_ADDR);
717 print_byte_register(
PSTR(
"EN_AA\t"),
EN_AA);
719 print_byte_register(
PSTR(
"RF_CH\t"),
RF_CH);
722 print_byte_register(
PSTR(
"DYNPD/FEATURE"),
DYNPD, 2);
742 #if defined(RF24_LINUX)
743 printf(
"================ SPI Configuration ================\n");
744 uint8_t bus_ce =
static_cast<uint8_t
>(csn_pin % 10);
745 uint8_t bus_numb =
static_cast<uint8_t
>((csn_pin - bus_ce) / 10);
746 printf(
"CSN Pin\t\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
747 printf(
"CE Pin\t\t\t= Custom GPIO%d\n", ce_pin);
749 printf_P(
PSTR(
"SPI Frequency\t\t= %d Mhz\n"),
static_cast<uint8_t
>(spi_speed / 1000000));
750 #if defined(RF24_LINUX)
751 printf(
"================ NRF Configuration ================\n");
755 uint16_t frequency =
static_cast<uint16_t
>(channel + 2400);
756 printf_P(
PSTR(
"Channel\t\t\t= %u (~ %u MHz)\r\n"), channel, frequency);
777 printf_P(
PSTR(
"Auto Retry Delay\t= %d microseconds\r\n"), (setupRetry >>
ARD) * 250 + 250);
778 printf_P(
PSTR(
"Auto Retry Attempts\t= %d maximum\r\n"), setupRetry & 0x0F);
781 printf_P(
PSTR(
"Packets lost on\n current channel\t= %d\r\n"), observeTx >> 4);
782 printf_P(
PSTR(
"Retry attempts made for\n last transmission\t= %d\r\n"), observeTx & 0x0F);
798 if (autoAck == 0x3F || autoAck == 0) {
802 (
char*)(pgm_read_ptr(&
rf24_feature_e_str_P[
static_cast<uint8_t
>(
static_cast<bool>(autoAck) * 1)])));
806 printf_P(
PSTR(
"Auto Acknowledgment\t= 0b%c%c%c%c%c%c\r\n"),
807 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P5)) + 48),
808 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P4)) + 48),
809 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P3)) + 48),
810 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P2)) + 48),
811 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P1)) + 48),
812 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P0)) + 48));
817 print_address_register(
PSTR(
"TX address\t"),
TX_ADDR);
820 for (uint8_t i = 0; i < 6; ++i) {
821 bool isOpen = openPipes &
_BV(i);
826 print_address_register(
PSTR(
""),
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
829 print_byte_register(
PSTR(
""),
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
838 const char* format_string =
PSTR(
839 "================ SPI Configuration ================\n"
840 "CSN Pin\t\t\t= %d\n"
842 "SPI Frequency\t\t= %d Mhz\n"
843 "================ NRF Configuration ================\n"
844 "Channel\t\t\t= %u (~ %u MHz)\n"
845 "RF Data Rate\t\t" PRIPSTR "\n"
846 "RF Power Amplifier\t" PRIPSTR "\n"
847 "RF Low Noise Amplifier\t" PRIPSTR "\n"
849 "Address Length\t\t= %d bytes\n"
850 "Static Payload Length\t= %d bytes\n"
851 "Auto Retry Delay\t= %d microseconds\n"
852 "Auto Retry Attempts\t= %d maximum\n"
853 "Packets lost on\n current channel\t= %d\r\n"
854 "Retry attempts made for\n last transmission\t= %d\r\n"
856 "Custom ACK Payload\t" PRIPSTR "\n"
857 "Dynamic Payloads\t" PRIPSTR "\n"
858 "Auto Acknowledgment\t");
859 const char* format_str2 =
PSTR(
"\nPrimary Mode\t\t= %cX\nTX address\t\t= 0x");
860 const char* format_str3 =
PSTR(
"\nPipe %d (" PRIPSTR ") bound\t= 0x");
863 debugging_information, format_string, csn_pin, ce_pin,
864 static_cast<uint8_t
>(spi_speed / 1000000),
getChannel(),
878 if (autoAck == 0x3F || autoAck == 0) {
881 debugging_information + offset,
PSTR(
"" PRIPSTR ""),
882 (
char*)(pgm_read_ptr(&
rf24_feature_e_str_P[
static_cast<uint8_t
>(
static_cast<bool>(autoAck) * 1)])));
887 debugging_information + offset,
PSTR(
"= 0b%c%c%c%c%c%c"),
888 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P5)) + 48),
889 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P4)) + 48),
890 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P3)) + 48),
891 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P2)) + 48),
892 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P1)) + 48),
893 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P0)) + 48));
896 debugging_information + offset, format_str2,
898 offset += sprintf_address_register(debugging_information + offset,
TX_ADDR);
900 for (uint8_t i = 0; i < 6; ++i) {
902 debugging_information + offset, format_str3,
905 offset += sprintf_address_register(
906 debugging_information + offset,
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
910 debugging_information + offset,
PSTR(
"%02X"),
926 encoded_details += 5;
928 else if (i != 0x18 && i != 0x19 && i != 0x1a && i != 0x1b) {
933 *encoded_details++ = ce_pin >> 4;
934 *encoded_details++ = ce_pin & 0xFF;
935 *encoded_details++ = csn_pin >> 4;
936 *encoded_details++ = csn_pin & 0xFF;
937 *encoded_details =
static_cast<uint8_t
>((spi_speed / 1000000) |
_BV(_is_p_variant * 4));
942#if defined(RF24_SPI_PTR) || defined(DOXYGEN_FORCED)
948 return _init_pins() && _init_radio();
957 return begin(spiBus);
975#if defined(RF24_LINUX)
976 #if defined(RF24_RPi)
981 case 8: csn_pin = 0;
break;
982 case 7: csn_pin = 1;
break;
983 case 18: csn_pin = 10;
break;
984 case 17: csn_pin = 11;
break;
985 case 16: csn_pin = 12;
break;
986 default: csn_pin = 0;
break;
990 _SPI.begin(csn_pin, spi_speed);
992#elif defined(XMEGA_D3)
993 _spi->begin(csn_pin);
995#elif defined(RF24_RP2)
997 _spi->begin(PICO_DEFAULT_SPI ? spi1 : spi0);
1001 #if defined(RF24_SPI_PTR)
1009 return _init_pins() && _init_radio();
1014bool RF24::_init_pins()
1021#if defined(RF24_LINUX)
1027#elif defined(LITTLEWIRE)
1031#elif defined(XMEGA_D3)
1032 if (ce_pin != csn_pin) {
1042 if (ce_pin != csn_pin) {
1050 #if defined(__ARDUINO_X86__)
1060bool RF24::_init_radio()
1082 _is_p_variant = before_toggle == after_toggle;
1084 if (_is_p_variant) {
1092 write_register(
DYNPD, 0);
1094 write_register(
EN_AA, 0x3F);
1139 return ce_pin != RF24_PIN_INVALID && csn_pin != RF24_PIN_INVALID;
1146#if !defined(RF24_TINY) && !defined(LITTLEWIRE)
1178 config_reg =
static_cast<uint8_t
>(config_reg &
~_BV(
PRIM_RX));
1181#if defined(RF24_TINY) || defined(LITTLEWIRE)
1183 if (ce_pin == csn_pin) {
1196 memcpy(pipe0_writing_address, &txAddress,
addr_width);
1205 memcpy(pipe0_writing_address, txAddress,
addr_width);
1215 config_reg =
static_cast<uint8_t
>(config_reg &
~_BV(
PWR_UP));
1237#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1239void RF24::errNotify()
1241 #if defined(RF24_DEBUG) || defined(RF24_LINUX)
1242 printf_P(
PSTR(
"RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.\r\n"));
1244 #if defined(FAILURE_HANDLING)
1261#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1262 uint32_t timer =
millis();
1266#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1267 if (
millis() - timer > 95) {
1269 #if defined(FAILURE_HANDLING)
1293 return write(buf, len, 0);
1306 uint32_t timer =
millis();
1312 if (
millis() - timer > timeout) {
1316#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1317 if (
millis() - timer > (timeout + 95)) {
1319 #if defined(FAILURE_HANDLING)
1352#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1353 uint32_t timer =
millis();
1362#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1363 if (
millis() - timer > 95) {
1365 #if defined(FAILURE_HANDLING)
1407#if !defined(F_CPU) || F_CPU > 20000000
1410#ifdef ARDUINO_ARCH_STM32
1411 if (F_CPU > 20000000) {
1438 return static_cast<bool>(
static_cast<uint8_t
>(
isFifo(about_tx)) &
_BV(!check_empty));
1446#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1447 uint32_t timeout =
millis();
1456#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1457 if (
millis() - timeout > 95) {
1459 #if defined(FAILURE_HANDLING)
1479 uint32_t start =
millis();
1486 if (
millis() - start >= timeout) {
1492#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1493 if (
millis() - start > (timeout + 95)) {
1495 #if defined(FAILURE_HANDLING)
1523 if (result > 32 || !result) {
1554 read_payload(buf, len);
1615 memcpy(pipe0_writing_address, &value,
addr_width);
1626 memcpy(pipe0_writing_address, address,
addr_width);
1640 memcpy(pipe0_reading_address, &address,
addr_width);
1651 else if (
static_cast<bool>(config_reg &
_BV(
PRIM_RX)) || child != 0) {
1666 a_width =
static_cast<uint8_t
>(a_width - 2);
1668 write_register(
SETUP_AW,
static_cast<uint8_t
>(a_width % 4));
1669 addr_width =
static_cast<uint8_t
>((a_width % 4) + 2);
1672 write_register(
SETUP_AW,
static_cast<uint8_t
>(0));
1685 memcpy(pipe0_reading_address, address,
addr_width);
1695 else if (
static_cast<bool>(config_reg &
_BV(
PRIM_RX)) || child != 0) {
1719void RF24::toggle_features(
void)
1722#if defined(RF24_SPI_PTR)
1724 _spi->transfer(0x73);
1727 _SPI.transfer(0x73);
1767 write_register(
DYNPD, 0);
1823 const uint8_t* current =
reinterpret_cast<const uint8_t*
>(buf);
1842 return _is_p_variant;
1850 write_register(
EN_AA, 0x3F);
1853 write_register(
EN_AA, 0);
1868 en_aa |=
static_cast<uint8_t
>(
_BV(pipe));
1871 en_aa =
static_cast<uint8_t
>(en_aa &
~_BV(pipe));
1876 write_register(
EN_AA, en_aa);
1899 setup |= _pa_level_reg_value(level, lnaEnable);
1921 bool result =
false;
1926 setup |= _data_rate_reg_value(speed);
1965 config_reg =
static_cast<uint8_t
>(config_reg & ~(
_BV(
CRCO) |
_BV(
EN_CRC)));
2005 config_reg =
static_cast<uint8_t
>(config_reg &
~_BV(
EN_CRC));
2023 uint8_t dummy_buf[32];
2024 for (uint8_t i = 0; i < 32; ++i)
2025 dummy_buf[i] = 0xFF;
2029 write_register(
TX_ADDR,
reinterpret_cast<uint8_t*
>(&dummy_buf), 5);
2034 write_register(
W_TX_PAYLOAD,
reinterpret_cast<const uint8_t*
>(&dummy_buf), 32);
2072 write_register(
EN_RXADDR,
static_cast<uint8_t
>(isEnabled ? 0x3F : 0));
2079#if !defined(F_CPU) || F_CPU > 20000000
2085#if !defined(F_CPU) || F_CPU > 20000000
2095#if !defined(F_CPU) || F_CPU > 20000000
2105 return static_cast<uint8_t
>(0);
2110uint8_t RF24::_pa_level_reg_value(uint8_t level,
bool lnaEnable)
2115 return static_cast<uint8_t
>(((level >
RF24_PA_MAX ?
static_cast<uint8_t
>(
RF24_PA_MAX) : level) << 1) + lnaEnable);
2122 uint8_t setup = _data_rate_reg_value(speed);
2123 setup |= _pa_level_reg_value(level, lnaEnable);
static const PROGMEM char rf24_datarate_e_str_1[]
static const PROGMEM char rf24_feature_e_str_on[]
static const PROGMEM char rf24_feature_e_str_open[]
static const PROGMEM char rf24_feature_e_str_closed[]
static const PROGMEM char *const rf24_datarate_e_str_P[]
static const PROGMEM char rf24_pa_dbm_e_str_2[]
static const PROGMEM char rf24_model_e_str_0[]
static const PROGMEM char rf24_pa_dbm_e_str_0[]
static const PROGMEM char *const rf24_crclength_e_str_P[]
static const PROGMEM char *const rf24_feature_e_str_P[]
static const PROGMEM char rf24_datarate_e_str_0[]
static const PROGMEM char rf24_crclength_e_str_2[]
static const PROGMEM char *const rf24_pa_dbm_e_str_P[]
static const PROGMEM char rf24_feature_e_str_allowed[]
static const PROGMEM uint8_t child_pipe[]
static const PROGMEM char rf24_model_e_str_1[]
static const PROGMEM uint8_t child_pipe_enable[]
static const PROGMEM char rf24_crclength_e_str_1[]
static const PROGMEM char rf24_crclength_e_str_0[]
static const PROGMEM char *const rf24_model_e_str_P[]
static const PROGMEM char rf24_datarate_e_str_2[]
static const PROGMEM char rf24_pa_dbm_e_str_1[]
static const PROGMEM char rf24_pa_dbm_e_str_3[]
#define W_TX_PAYLOAD_NO_ACK
#define RF24_POWERUP_DELAY
#define RF24_SPI_SPEED
The default SPI speed (in Hz)
void disableAckPayload(void)
RF24(rf24_gpio_pin_t _cepin, rf24_gpio_pin_t _cspin, uint32_t _spi_speed=RF24_SPI_SPEED)
uint16_t sprintfPrettyDetails(char *debugging_information)
uint8_t getPayloadSize(void)
void startListening(void)
bool isAckPayloadAvailable(void)
void printPrettyDetails(void)
void setPayloadSize(uint8_t size)
bool writeAckPayload(uint8_t pipe, const void *buf, uint8_t len)
void stopConstCarrier(void)
rf24_fifo_state_e isFifo(bool about_tx)
bool dynamic_payloads_enabled
void enableDynamicPayloads(void)
bool writeFast(const void *buf, uint8_t len)
void disableDynamicPayloads(void)
void setRetries(uint8_t delay, uint8_t count)
bool write(const void *buf, uint8_t len)
void setChannel(uint8_t channel)
uint8_t getDynamicPayloadSize(void)
bool ack_payloads_enabled
rf24_datarate_e getDataRate(void)
void setCRCLength(rf24_crclength_e length)
void read(void *buf, uint8_t len)
void closeReadingPipe(uint8_t pipe)
void read_register(uint8_t reg, uint8_t *buf, uint8_t len)
void openReadingPipe(uint8_t number, const uint8_t *address)
void toggleAllPipes(bool isEnabled)
Open or close all data pipes.
void setPALevel(uint8_t level, bool lnaEnable=1)
rf24_crclength_e getCRCLength(void)
void encodeRadioDetails(uint8_t *encoded_status)
void maskIRQ(bool tx_ok, bool tx_fail, bool rx_ready)
void enableAckPayload(void)
void startConstCarrier(rf24_pa_dbm_e level, uint8_t channel)
void startFastWrite(const void *buf, uint8_t len, const bool multicast, bool startTx=1)
void setAddressWidth(uint8_t a_width)
void setRadiation(uint8_t level, rf24_datarate_e speed, bool lnaEnable=true)
configure the RF_SETUP register in 1 transaction
bool startWrite(const void *buf, uint8_t len, const bool multicast)
void printStatus(uint8_t flags)
bool writeBlocking(const void *buf, uint8_t len, uint32_t timeout)
bool setDataRate(rf24_datarate_e speed)
void setAutoAck(bool enable)
void openWritingPipe(const uint8_t *address)
void whatHappened(bool &tx_ok, bool &tx_fail, bool &rx_ready)
#define pinMode(pin, direction)
#define delayMicroseconds(usec)
#define digitalWrite(pin, value)
uint8_t clearStatusFlags(uint8_t flags=RF24_IRQ_ALL)
void setStatusFlags(uint8_t flags=RF24_IRQ_NONE)
@ RF24_TX_DS
Represents an event where TX Data Sent successfully.
@ RF24_TX_DF
Represents an event where TX Data Failed to send.
@ RF24_RX_DR
Represents an event where RX Data is Ready to RF24::read().
@ RF24_IRQ_ALL
Equivalent to RF24_RX_DR | RF24_TX_DS | RF24_TX_DF.