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);
103void RF24::ce(
bool level)
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)
184 *buf++ = _spi->transfer(0xFF);
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)
227 result = _spi->transfer(0xff);
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,
bool is_cmd_only)
292#if defined(RF24_LINUX)
295 #if defined(RF24_SPI_PTR)
305#if defined(RF24_LINUX) || defined(RF24_RP2)
307 uint8_t* prx = spi_rxbuff;
308 uint8_t* ptx = spi_txbuff;
312 #if defined(RF24_RP2)
313 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, 2);
315 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), 2);
323 #if defined(RF24_SPI_PTR)
325 _spi->transfer(value);
328 _SPI.transfer(value);
337void RF24::write_payload(
const void* buf, uint8_t data_len,
const uint8_t writeType)
339 const uint8_t* current =
reinterpret_cast<const uint8_t*
>(buf);
341 uint8_t blank_len = !data_len ? 1 : 0;
343 data_len =
rf24_min(data_len, payload_size);
344 blank_len =
static_cast<uint8_t
>(payload_size - data_len);
347 data_len =
rf24_min(data_len,
static_cast<uint8_t
>(32));
351 IF_SERIAL_DEBUG(printf(
"[Writing %u bytes %u blanks]\n", data_len, blank_len););
353#if defined(RF24_LINUX) || defined(RF24_RP2)
355 uint8_t* prx = spi_rxbuff;
356 uint8_t* ptx = spi_txbuff;
358 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
365 while (blank_len--) {
369 #if defined(RF24_RP2)
370 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
372 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
381 #if defined(RF24_SPI_PTR)
382 status = _spi->transfer(writeType);
384 _spi->transfer(*current++);
387 while (blank_len--) {
392 status =
_SPI.transfer(writeType);
394 _SPI.transfer(*current++);
397 while (blank_len--) {
408void RF24::read_payload(
void* buf, uint8_t data_len)
410 uint8_t* current =
reinterpret_cast<uint8_t*
>(buf);
412 uint8_t blank_len = 0;
414 data_len =
rf24_min(data_len, payload_size);
415 blank_len =
static_cast<uint8_t
>(payload_size - data_len);
418 data_len =
rf24_min(data_len,
static_cast<uint8_t
>(32));
423 IF_SERIAL_DEBUG(printf(
"[Reading %u bytes %u blanks]\n", data_len, blank_len););
425#if defined(RF24_LINUX) || defined(RF24_RP2)
427 uint8_t* prx = spi_rxbuff;
428 uint8_t* ptx = spi_txbuff;
430 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
437 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
439 #if defined(RF24_RP2)
440 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
442 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
459 #if defined(RF24_SPI_PTR)
462 *current++ = _spi->transfer(0xFF);
465 while (blank_len--) {
466 _spi->transfer(0xFF);
472 *current++ =
_SPI.transfer(0xFF);
475 while (blank_len--) {
503uint8_t RF24::get_status(
void)
512void RF24::print_status(uint8_t _status)
514 printf_P(
PSTR(
"STATUS\t\t= 0x%02x RX_DR=%x TX_DS=%x MAX_RT=%x RX_P_NO=%x TX_FULL=%x\r\n"), _status, (_status &
_BV(
RX_DR)) ? 1 : 0,
520void RF24::print_observe_tx(uint8_t value)
527void RF24::print_byte_register(
const char* name, uint8_t reg, uint8_t qty)
540void RF24::print_address_register(
const char* name, uint8_t reg, uint8_t qty)
552 while (--bufptr >= buffer) {
562uint8_t RF24::sprintf_address_register(
char* out_buffer, uint8_t reg, uint8_t qty)
565 uint8_t* read_buffer =
new uint8_t[
addr_width];
569 while (--bufptr >= read_buffer) {
570 offset +=
sprintf_P(out_buffer + offset,
PSTR(
"%02X"), *bufptr);
573 delete[] read_buffer;
581 : ce_pin(_cepin), csn_pin(_cspin), spi_speed(_spi_speed), payload_size(32), _is_p_variant(false), _is_p0_rx(false), addr_width(5), dynamic_payloads_enabled(true), csDelay(5)
589 : ce_pin(RF24_PIN_INVALID), csn_pin(RF24_PIN_INVALID), spi_speed(_spi_speed), payload_size(32), _is_p_variant(false), _is_p0_rx(false), addr_width(5), dynamic_payloads_enabled(true), csDelay(5)
596void RF24::_init_obj()
600#if defined(RF24_SPI_PTR) && !defined(RF24_RP2)
604 pipe0_reading_address[0] = 0;
605 if (spi_speed <= 35000) {
614 const uint8_t max_channel = 125;
631 for (uint8_t i = 0; i < 6; ++i) {
632 write_register(
static_cast<uint8_t
>(
RX_PW_P0 + i), payload_size);
680 #if defined(RF24_LINUX)
681static const char rf24_csn_e_str_0[] =
"CE0 (PI Hardware Driven)";
682static const char rf24_csn_e_str_1[] =
"CE1 (PI Hardware Driven)";
683static const char rf24_csn_e_str_2[] =
"CE2 (PI Hardware Driven)";
684static const char rf24_csn_e_str_3[] =
"Custom GPIO Software Driven";
685static const char*
const rf24_csn_e_str_P[] = {
708 #if defined(RF24_LINUX)
709 printf(
"================ SPI Configuration ================\n");
710 uint8_t bus_ce =
static_cast<uint8_t
>(csn_pin % 10);
711 uint8_t bus_numb =
static_cast<uint8_t
>((csn_pin - bus_ce) / 10);
712 printf(
"CSN Pin\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
713 printf(
"CE Pin\t\t= Custom GPIO%d\n", ce_pin);
715 printf_P(
PSTR(
"SPI Speedz\t= %d Mhz\n"),
static_cast<uint8_t
>(spi_speed / 1000000));
716 #if defined(RF24_LINUX)
717 printf(
"================ NRF Configuration ================\n");
720 print_status(get_status());
724 print_address_register(
PSTR(
"TX_ADDR\t"),
TX_ADDR);
727 print_byte_register(
PSTR(
"EN_AA\t"),
EN_AA);
729 print_byte_register(
PSTR(
"RF_CH\t"),
RF_CH);
732 print_byte_register(
PSTR(
"DYNPD/FEATURE"),
DYNPD, 2);
752 #if defined(RF24_LINUX)
753 printf(
"================ SPI Configuration ================\n");
754 uint8_t bus_ce =
static_cast<uint8_t
>(csn_pin % 10);
755 uint8_t bus_numb =
static_cast<uint8_t
>((csn_pin - bus_ce) / 10);
756 printf(
"CSN Pin\t\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
757 printf(
"CE Pin\t\t\t= Custom GPIO%d\n", ce_pin);
759 printf_P(
PSTR(
"SPI Frequency\t\t= %d Mhz\n"),
static_cast<uint8_t
>(spi_speed / 1000000));
760 #if defined(RF24_LINUX)
761 printf(
"================ NRF Configuration ================\n");
765 uint16_t frequency =
static_cast<uint16_t
>(channel + 2400);
766 printf_P(
PSTR(
"Channel\t\t\t= %u (~ %u MHz)\r\n"), channel, frequency);
787 printf_P(
PSTR(
"Auto Retry Delay\t= %d microseconds\r\n"), (setupRetry >>
ARD) * 250 + 250);
788 printf_P(
PSTR(
"Auto Retry Attempts\t= %d maximum\r\n"), setupRetry & 0x0F);
791 printf_P(
PSTR(
"Packets lost on\n current channel\t= %d\r\n"), observeTx >> 4);
792 printf_P(
PSTR(
"Retry attempts made for\n last transmission\t= %d\r\n"), observeTx & 0x0F);
808 if (autoAck == 0x3F || autoAck == 0) {
816 printf_P(
PSTR(
"Auto Acknowledgment\t= 0b%c%c%c%c%c%c\r\n"),
817 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P5)) + 48),
818 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P4)) + 48),
819 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P3)) + 48),
820 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P2)) + 48),
821 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P1)) + 48),
822 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P0)) + 48));
827 print_address_register(
PSTR(
"TX address\t"),
TX_ADDR);
830 for (uint8_t i = 0; i < 6; ++i) {
831 bool isOpen = openPipes &
_BV(i);
836 print_address_register(
PSTR(
""),
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
839 print_byte_register(
PSTR(
""),
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
848 const char* format_string =
PSTR(
849 "================ SPI Configuration ================\n"
850 "CSN Pin\t\t\t= %d\n"
852 "SPI Frequency\t\t= %d Mhz\n"
853 "================ NRF Configuration ================\n"
854 "Channel\t\t\t= %u (~ %u MHz)\n"
855 "RF Data Rate\t\t" PRIPSTR "\n"
856 "RF Power Amplifier\t" PRIPSTR "\n"
857 "RF Low Noise Amplifier\t" PRIPSTR "\n"
859 "Address Length\t\t= %d bytes\n"
860 "Static Payload Length\t= %d bytes\n"
861 "Auto Retry Delay\t= %d microseconds\n"
862 "Auto Retry Attempts\t= %d maximum\n"
863 "Packets lost on\n current channel\t= %d\r\n"
864 "Retry attempts made for\n last transmission\t= %d\r\n"
866 "Custom ACK Payload\t" PRIPSTR "\n"
867 "Dynamic Payloads\t" PRIPSTR "\n"
868 "Auto Acknowledgment\t");
869 const char* format_str2 =
PSTR(
"\nPrimary Mode\t\t= %cX\nTX address\t\t= 0x");
870 const char* format_str3 =
PSTR(
"\nPipe %d (" PRIPSTR ") bound\t= 0x");
873 debugging_information, format_string, csn_pin, ce_pin,
874 static_cast<uint8_t
>(spi_speed / 1000000),
getChannel(),
888 if (autoAck == 0x3F || autoAck == 0) {
891 debugging_information + offset,
PSTR(
"" PRIPSTR ""),
897 debugging_information + offset,
PSTR(
"= 0b%c%c%c%c%c%c"),
898 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P5)) + 48),
899 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P4)) + 48),
900 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P3)) + 48),
901 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P2)) + 48),
902 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P1)) + 48),
903 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P0)) + 48));
906 debugging_information + offset, format_str2,
908 offset += sprintf_address_register(debugging_information + offset,
TX_ADDR);
910 for (uint8_t i = 0; i < 6; ++i) {
912 debugging_information + offset, format_str3,
915 offset += sprintf_address_register(
916 debugging_information + offset,
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
920 debugging_information + offset,
PSTR(
"%02X"),
936 encoded_details += 5;
938 else if (i != 0x18 && i != 0x19 && i != 0x1a && i != 0x1b) {
943 *encoded_details++ = ce_pin >> 4;
944 *encoded_details++ = ce_pin & 0xFF;
945 *encoded_details++ = csn_pin >> 4;
946 *encoded_details++ = csn_pin & 0xFF;
947 *encoded_details =
static_cast<uint8_t
>((spi_speed / 1000000) |
_BV(_is_p_variant * 4));
952#if defined(RF24_SPI_PTR) || defined(DOXYGEN_FORCED)
958 return _init_pins() && _init_radio();
967 return begin(spiBus);
985#if defined(RF24_LINUX)
986 #if defined(RF24_RPi)
991 case 8: csn_pin = 0;
break;
992 case 7: csn_pin = 1;
break;
993 case 18: csn_pin = 10;
break;
994 case 17: csn_pin = 11;
break;
995 case 16: csn_pin = 12;
break;
996 default: csn_pin = 0;
break;
1000 _SPI.begin(csn_pin, spi_speed);
1002#elif defined(XMEGA_D3)
1003 _spi->begin(csn_pin);
1005#elif defined(RF24_RP2)
1007 _spi->begin(PICO_DEFAULT_SPI ? spi1 : spi0);
1011 #if defined(RF24_SPI_PTR)
1019 return _init_pins() && _init_radio();
1024bool RF24::_init_pins()
1031#if defined(RF24_LINUX)
1035 gpio.begin(ce_pin, csn_pin);
1042#elif defined(LITTLEWIRE)
1046#elif defined(XMEGA_D3)
1047 if (ce_pin != csn_pin) {
1057 if (ce_pin != csn_pin) {
1065 #if defined(__ARDUINO_X86__)
1075bool RF24::_init_radio()
1097 _is_p_variant = before_toggle == after_toggle;
1099 if (_is_p_variant) {
1107 write_register(
DYNPD, 0);
1109 write_register(
EN_AA, 0x3F);
1154 return ce_pin != RF24_PIN_INVALID && csn_pin != RF24_PIN_INVALID;
1161#if !defined(RF24_TINY) && !defined(LITTLEWIRE)
1193 config_reg =
static_cast<uint8_t
>(config_reg & ~_BV(
PRIM_RX));
1196#if defined(RF24_TINY) || defined(LITTLEWIRE)
1198 if (ce_pin == csn_pin) {
1211 config_reg =
static_cast<uint8_t
>(config_reg & ~_BV(
PWR_UP));
1233#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1235void RF24::errNotify()
1237 #if defined(SERIAL_DEBUG) || defined(RF24_LINUX)
1238 printf_P(
PSTR(
"RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.\r\n"));
1240 #if defined(FAILURE_HANDLING)
1257#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1258 uint32_t timer =
millis();
1262#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1263 if (
millis() - timer > 95) {
1265 #if defined(FAILURE_HANDLING)
1289 return write(buf, len, 0);
1302 uint32_t timer =
millis();
1308 if (
millis() - timer > timeout) {
1312#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1313 if (
millis() - timer > (timeout + 95)) {
1315 #if defined(FAILURE_HANDLING)
1347#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1348 uint32_t timer =
millis();
1357#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1358 if (
millis() - timer > 95) {
1360 #if defined(FAILURE_HANDLING)
1402#if !defined(F_CPU) || F_CPU > 20000000
1427 return static_cast<bool>(
isFifo(about_tx) &
_BV(!check_empty));
1435#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1436 uint32_t timeout =
millis();
1445#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1446 if (
millis() - timeout > 95) {
1448 #if defined(FAILURE_HANDLING)
1468 uint32_t start =
millis();
1475 if (
millis() - start >= timeout) {
1481#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1482 if (
millis() - start > (timeout + 95)) {
1484 #if defined(FAILURE_HANDLING)
1538 *pipe_num = (get_status() >>
RX_P_NO) & 0x07;
1549 read_payload(buf, len);
1601 memcpy(pipe0_reading_address, &address,
addr_width);
1625 a_width =
static_cast<uint8_t
>(a_width - 2);
1627 write_register(
SETUP_AW,
static_cast<uint8_t
>(a_width % 4));
1628 addr_width =
static_cast<uint8_t
>((a_width % 4) + 2);
1631 write_register(
SETUP_AW,
static_cast<uint8_t
>(0));
1644 memcpy(pipe0_reading_address, address,
addr_width);
1676void RF24::toggle_features(
void)
1679#if defined(RF24_SPI_PTR)
1681 _spi->transfer(0x73);
1684 _SPI.transfer(0x73);
1724 write_register(
DYNPD, 0);
1780 const uint8_t* current =
reinterpret_cast<const uint8_t*
>(buf);
1799 return _is_p_variant;
1807 write_register(
EN_AA, 0x3F);
1810 write_register(
EN_AA, 0);
1825 en_aa |=
static_cast<uint8_t
>(
_BV(pipe));
1828 en_aa =
static_cast<uint8_t
>(en_aa & ~_BV(pipe));
1833 write_register(
EN_AA, en_aa);
1856 setup |= _pa_level_reg_value(level, lnaEnable);
1878 bool result =
false;
1883 setup |= _data_rate_reg_value(speed);
1922 config_reg =
static_cast<uint8_t
>(config_reg & ~(
_BV(
CRCO) |
_BV(
EN_CRC)));
1962 config_reg =
static_cast<uint8_t
>(config_reg & ~_BV(
EN_CRC));
1980 uint8_t dummy_buf[32];
1981 for (uint8_t i = 0; i < 32; ++i)
1982 dummy_buf[i] = 0xFF;
1986 write_register(
TX_ADDR,
reinterpret_cast<uint8_t*
>(&dummy_buf), 5);
1991 write_register(
W_TX_PAYLOAD,
reinterpret_cast<const uint8_t*
>(&dummy_buf), 32);
2025 write_register(
EN_RXADDR,
static_cast<uint8_t
>(isEnabled ? 0x3F : 0));
2032#if !defined(F_CPU) || F_CPU > 20000000
2038#if !defined(F_CPU) || F_CPU > 20000000
2048#if !defined(F_CPU) || F_CPU > 20000000
2058 return static_cast<uint8_t
>(0);
2063uint8_t RF24::_pa_level_reg_value(uint8_t level,
bool lnaEnable)
2068 return static_cast<uint8_t
>(((level >
RF24_PA_MAX ?
static_cast<uint8_t
>(
RF24_PA_MAX) : level) << 1) + lnaEnable);
2075 uint8_t setup = _data_rate_reg_value(speed);
2076 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 RF24_POWERUP_DELAY
#define RF24_NO_FETCH_PIPE
A sentinel used to control fetching the pipe info in RF24::available().
#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)
uint8_t isFifo(bool about_tx)
void stopConstCarrier(void)
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)
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 IF_SERIAL_DEBUG(x)
#define digitalWrite(pin, value)
#define W_TX_PAYLOAD_NO_ACK