17void RF24::csn(
bool mode)
20 if (ce_pin != csn_pin) {
25 PORTB |= (1 << PINB2);
29 PORTB &= ~(1 << PINB2);
36#elif defined(ARDUINO) && !defined(RF24_SPI_TRANSACTIONS)
44 #if defined(RF24_SPI_PTR)
45 _spi->setBitOrder(MSBFIRST);
46 _spi->setDataMode(SPI_MODE0);
48 #if !defined(F_CPU) || F_CPU < 20000000
49 _spi->setClockDivider(SPI_CLOCK_DIV2);
50 #elif F_CPU < 40000000
51 _spi->setClockDivider(SPI_CLOCK_DIV4);
52 #elif F_CPU < 80000000
53 _spi->setClockDivider(SPI_CLOCK_DIV8);
54 #elif F_CPU < 160000000
55 _spi->setClockDivider(SPI_CLOCK_DIV16);
56 #elif F_CPU < 320000000
57 _spi->setClockDivider(SPI_CLOCK_DIV32);
58 #elif F_CPU < 640000000
59 _spi->setClockDivider(SPI_CLOCK_DIV64);
60 #elif F_CPU < 1280000000
61 _spi->setClockDivider(SPI_CLOCK_DIV128);
63 #error "Unsupported CPU frequency. Please set correct SPI divider."
67 _SPI.setBitOrder(MSBFIRST);
68 _SPI.setDataMode(SPI_MODE0);
70 #if !defined(F_CPU) || F_CPU < 20000000
71 _SPI.setClockDivider(SPI_CLOCK_DIV2);
72 #elif F_CPU < 40000000
73 _SPI.setClockDivider(SPI_CLOCK_DIV4);
74 #elif F_CPU < 80000000
75 _SPI.setClockDivider(SPI_CLOCK_DIV8);
76 #elif F_CPU < 160000000
77 _SPI.setClockDivider(SPI_CLOCK_DIV16);
78 #elif F_CPU < 320000000
79 _SPI.setClockDivider(SPI_CLOCK_DIV32);
80 #elif F_CPU < 640000000
81 _SPI.setClockDivider(SPI_CLOCK_DIV64);
82 #elif F_CPU < 1280000000
83 _SPI.setClockDivider(SPI_CLOCK_DIV128);
85 #error "Unsupported CPU frequency. Please set correct SPI divider."
90#elif defined(RF24_RPi)
92 _SPI.chipSelect(csn_pin);
95#if !defined(RF24_LINUX)
99 static_cast<void>(mode);
109 if (ce_pin != csn_pin) {
121#if defined(RF24_SPI_TRANSACTIONS)
122 #if defined(RF24_SPI_PTR)
123 #if defined(RF24_RP2)
124 _spi->beginTransaction(spi_speed);
126 _spi->beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
129 _SPI.beginTransaction(SPISettings(spi_speed, MSBFIRST, SPI_MODE0));
140#if defined(RF24_SPI_TRANSACTIONS)
141 #if defined(RF24_SPI_PTR)
142 _spi->endTransaction();
144 _SPI.endTransaction();
153#if defined(RF24_LINUX) || defined(RF24_RP2)
155 uint8_t* prx = spi_rxbuff;
156 uint8_t* ptx = spi_txbuff;
157 uint8_t size =
static_cast<uint8_t
>(len + 1);
165 #if defined(RF24_RP2)
166 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
168 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
183 #if defined(RF24_SPI_PTR)
184 status = _spi->transfer(reg);
186 *buf++ = _spi->transfer(0xFF);
190 status =
_SPI.transfer(reg);
192 *buf++ =
_SPI.transfer(0xFF);
206#if defined(RF24_LINUX) || defined(RF24_RP2)
209 uint8_t* prx = spi_rxbuff;
210 uint8_t* ptx = spi_txbuff;
214 #if defined(RF24_RP2)
215 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, 2);
217 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), 2);
227 #if defined(RF24_SPI_PTR)
228 status = _spi->transfer(reg);
229 result = _spi->transfer(0xff);
232 status =
_SPI.transfer(reg);
233 result =
_SPI.transfer(0xff);
244void RF24::write_register(uint8_t reg,
const uint8_t* buf, uint8_t len)
246#if defined(RF24_LINUX) || defined(RF24_RP2)
248 uint8_t* prx = spi_rxbuff;
249 uint8_t* ptx = spi_txbuff;
250 uint8_t size =
static_cast<uint8_t
>(len + 1);
257 #if defined(RF24_RP2)
258 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
260 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
268 #if defined(RF24_SPI_PTR)
271 _spi->transfer(*buf++);
277 _SPI.transfer(*buf++);
287void RF24::write_register(uint8_t reg, uint8_t value)
290#if defined(RF24_LINUX) || defined(RF24_RP2)
292 uint8_t* prx = spi_rxbuff;
293 uint8_t* ptx = spi_txbuff;
297 #if defined(RF24_RP2)
298 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, 2);
300 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), 2);
308 #if defined(RF24_SPI_PTR)
310 _spi->transfer(value);
313 _SPI.transfer(value);
321void RF24::write_payload(
const void* buf, uint8_t data_len,
const uint8_t writeType)
323 const uint8_t* current =
reinterpret_cast<const uint8_t*
>(buf);
325 uint8_t blank_len = !data_len ? 1 : 0;
327 data_len =
rf24_min(data_len, payload_size);
328 blank_len =
static_cast<uint8_t
>(payload_size - data_len);
331 data_len =
rf24_min(data_len,
static_cast<uint8_t
>(32));
337#if defined(RF24_LINUX) || defined(RF24_RP2)
339 uint8_t* prx = spi_rxbuff;
340 uint8_t* ptx = spi_txbuff;
342 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
349 while (blank_len--) {
353 #if defined(RF24_RP2)
354 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
356 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
365 #if defined(RF24_SPI_PTR)
366 status = _spi->transfer(writeType);
368 _spi->transfer(*current++);
371 while (blank_len--) {
376 status =
_SPI.transfer(writeType);
378 _SPI.transfer(*current++);
381 while (blank_len--) {
392void RF24::read_payload(
void* buf, uint8_t data_len)
394 uint8_t* current =
reinterpret_cast<uint8_t*
>(buf);
396 uint8_t blank_len = 0;
398 data_len =
rf24_min(data_len, payload_size);
399 blank_len =
static_cast<uint8_t
>(payload_size - data_len);
402 data_len =
rf24_min(data_len,
static_cast<uint8_t
>(32));
409#if defined(RF24_LINUX) || defined(RF24_RP2)
411 uint8_t* prx = spi_rxbuff;
412 uint8_t* ptx = spi_txbuff;
414 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
421 size =
static_cast<uint8_t
>(data_len + blank_len + 1);
423 #if defined(RF24_RP2)
424 _spi->transfernb((
const uint8_t*)spi_txbuff, spi_rxbuff, size);
426 _SPI.transfernb(
reinterpret_cast<char*
>(spi_txbuff),
reinterpret_cast<char*
>(spi_rxbuff), size);
443 #if defined(RF24_SPI_PTR)
446 *current++ = _spi->transfer(0xFF);
449 while (blank_len--) {
450 _spi->transfer(0xFF);
456 *current++ =
_SPI.transfer(0xFF);
459 while (blank_len--) {
492 printf_P(
PSTR(
"RX_DR=%x TX_DS=%x TX_DF=%x RX_PIPE=%x TX_FULL=%x\r\n"),
502void RF24::print_observe_tx(uint8_t value)
509void RF24::print_byte_register(
const char* name, uint8_t reg, uint8_t qty)
522void RF24::print_address_register(
const char* name, uint8_t reg, uint8_t qty)
534 while (--bufptr >= buffer) {
544uint8_t RF24::sprintf_address_register(
char* out_buffer, uint8_t reg, uint8_t qty)
547 uint8_t* read_buffer =
new uint8_t[
addr_width];
551 while (--bufptr >= read_buffer) {
552 offset +=
sprintf_P(out_buffer + offset,
PSTR(
"%02X"), *bufptr);
555 delete[] read_buffer;
565 spi_speed(_spi_speed),
567 _is_p_variant(false),
582 : ce_pin(RF24_PIN_INVALID),
583 csn_pin(RF24_PIN_INVALID),
584 spi_speed(_spi_speed),
586 _is_p_variant(false),
600void RF24::_init_obj()
604#if defined(RF24_SPI_PTR) && !defined(RF24_RP2)
608 if (spi_speed <= 35000) {
617 const uint8_t max_channel = 125;
634 for (uint8_t i = 0; i < 6; ++i) {
635 write_register(
static_cast<uint8_t
>(
RX_PW_P0 + i), payload_size);
698 #if defined(RF24_LINUX)
699 printf(
"================ SPI Configuration ================\n");
700 uint8_t bus_ce =
static_cast<uint8_t
>(csn_pin % 10);
701 uint8_t bus_numb =
static_cast<uint8_t
>((csn_pin - bus_ce) / 10);
702 printf(
"CSN Pin\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
703 printf(
"CE Pin\t\t= Custom GPIO%d\n", ce_pin);
705 printf_P(
PSTR(
"SPI Speedz\t= %d Mhz\n"),
static_cast<uint8_t
>(spi_speed / 1000000));
706 #if defined(RF24_LINUX)
707 printf(
"================ NRF Configuration ================\n");
710 uint8_t status =
update();
716 print_address_register(
PSTR(
"TX_ADDR\t"),
TX_ADDR);
719 print_byte_register(
PSTR(
"EN_AA\t"),
EN_AA);
721 print_byte_register(
PSTR(
"RF_CH\t"),
RF_CH);
723 print_byte_register(
PSTR(
"CONFIG\t"),
CONFIG);
724 print_byte_register(
PSTR(
"DYNPD/FEATURE"),
DYNPD, 2);
744 #if defined(RF24_LINUX)
745 printf(
"================ SPI Configuration ================\n");
746 uint8_t bus_ce =
static_cast<uint8_t
>(csn_pin % 10);
747 uint8_t bus_numb =
static_cast<uint8_t
>((csn_pin - bus_ce) / 10);
748 printf(
"CSN Pin\t\t\t= /dev/spidev%d.%d\n", bus_numb, bus_ce);
749 printf(
"CE Pin\t\t\t= Custom GPIO%d\n", ce_pin);
751 printf_P(
PSTR(
"SPI Frequency\t\t= %d Mhz\n"),
static_cast<uint8_t
>(spi_speed / 1000000));
752 #if defined(RF24_LINUX)
753 printf(
"================ NRF Configuration ================\n");
757 uint16_t frequency =
static_cast<uint16_t
>(channel + 2400);
758 printf_P(
PSTR(
"Channel\t\t\t= %u (~ %u MHz)\r\n"), channel, frequency);
779 printf_P(
PSTR(
"Auto Retry Delay\t= %d microseconds\r\n"), (setupRetry >>
ARD) * 250 + 250);
780 printf_P(
PSTR(
"Auto Retry Attempts\t= %d maximum\r\n"), setupRetry & 0x0F);
783 printf_P(
PSTR(
"Packets lost on\n current channel\t= %d\r\n"), observeTx >> 4);
784 printf_P(
PSTR(
"Retry attempts made for\n last transmission\t= %d\r\n"), observeTx & 0x0F);
800 if (autoAck == 0x3F || autoAck == 0) {
804 (
char*)(pgm_read_ptr(&
rf24_feature_e_str_P[
static_cast<uint8_t
>(
static_cast<bool>(autoAck) * 1)])));
808 printf_P(
PSTR(
"Auto Acknowledgment\t= 0b%c%c%c%c%c%c\r\n"),
809 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P5)) + 48),
810 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P4)) + 48),
811 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P3)) + 48),
812 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P2)) + 48),
813 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P1)) + 48),
814 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P0)) + 48));
819 print_address_register(
PSTR(
"TX address\t"),
TX_ADDR);
822 for (uint8_t i = 0; i < 6; ++i) {
823 bool isOpen = openPipes &
_BV(i);
828 print_address_register(
PSTR(
""),
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
831 print_byte_register(
PSTR(
""),
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
840 const char* format_string =
PSTR(
841 "================ SPI Configuration ================\n"
842 "CSN Pin\t\t\t= %d\n"
844 "SPI Frequency\t\t= %d Mhz\n"
845 "================ NRF Configuration ================\n"
846 "Channel\t\t\t= %u (~ %u MHz)\n"
847 "RF Data Rate\t\t" PRIPSTR "\n"
848 "RF Power Amplifier\t" PRIPSTR "\n"
849 "RF Low Noise Amplifier\t" PRIPSTR "\n"
851 "Address Length\t\t= %d bytes\n"
852 "Static Payload Length\t= %d bytes\n"
853 "Auto Retry Delay\t= %d microseconds\n"
854 "Auto Retry Attempts\t= %d maximum\n"
855 "Packets lost on\n current channel\t= %d\r\n"
856 "Retry attempts made for\n last transmission\t= %d\r\n"
858 "Custom ACK Payload\t" PRIPSTR "\n"
859 "Dynamic Payloads\t" PRIPSTR "\n"
860 "Auto Acknowledgment\t");
861 const char* format_str2 =
PSTR(
"\nPrimary Mode\t\t= %cX\nTX address\t\t= 0x");
862 const char* format_str3 =
PSTR(
"\nPipe %d (" PRIPSTR ") bound\t= 0x");
865 debugging_information, format_string, csn_pin, ce_pin,
866 static_cast<uint8_t
>(spi_speed / 1000000),
getChannel(),
880 if (autoAck == 0x3F || autoAck == 0) {
883 debugging_information + offset,
PSTR(
"" PRIPSTR ""),
884 (
char*)(pgm_read_ptr(&
rf24_feature_e_str_P[
static_cast<uint8_t
>(
static_cast<bool>(autoAck) * 1)])));
889 debugging_information + offset,
PSTR(
"= 0b%c%c%c%c%c%c"),
890 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P5)) + 48),
891 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P4)) + 48),
892 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P3)) + 48),
893 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P2)) + 48),
894 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P1)) + 48),
895 static_cast<char>(
static_cast<bool>(autoAck &
_BV(
ENAA_P0)) + 48));
898 debugging_information + offset, format_str2,
900 offset += sprintf_address_register(debugging_information + offset,
TX_ADDR);
902 for (uint8_t i = 0; i < 6; ++i) {
904 debugging_information + offset, format_str3,
907 offset += sprintf_address_register(
908 debugging_information + offset,
static_cast<uint8_t
>(
RX_ADDR_P0 + i));
912 debugging_information + offset,
PSTR(
"%02X"),
924 for (uint8_t i =
CONFIG; i < end; ++i) {
928 encoded_details += 5;
930 else if (i != 0x18 && i != 0x19 && i != 0x1a && i != 0x1b) {
935 *encoded_details++ = ce_pin >> 4;
936 *encoded_details++ = ce_pin & 0xFF;
937 *encoded_details++ = csn_pin >> 4;
938 *encoded_details++ = csn_pin & 0xFF;
939 *encoded_details =
static_cast<uint8_t
>((spi_speed / 1000000) |
_BV(_is_p_variant * 4));
944#if defined(RF24_SPI_PTR) || defined(DOXYGEN_FORCED)
950 return _init_pins() && _init_radio();
959 return begin(spiBus);
977#if defined(RF24_LINUX)
978 #if defined(RF24_RPi)
983 case 8: csn_pin = 0;
break;
984 case 7: csn_pin = 1;
break;
985 case 18: csn_pin = 10;
break;
986 case 17: csn_pin = 11;
break;
987 case 16: csn_pin = 12;
break;
988 default: csn_pin = 0;
break;
992 _SPI.begin(csn_pin, spi_speed);
994#elif defined(XMEGA_D3)
995 _spi->begin(csn_pin);
997#elif defined(RF24_RP2)
999 _spi->begin(PICO_DEFAULT_SPI ? spi1 : spi0);
1003 #if defined(RF24_SPI_PTR)
1011 return _init_pins() && _init_radio();
1016bool RF24::_init_pins()
1023#if defined(RF24_LINUX)
1029#elif defined(LITTLEWIRE)
1033#elif defined(XMEGA_D3)
1034 if (ce_pin != csn_pin) {
1044 if (ce_pin != csn_pin) {
1052 #if defined(__ARDUINO_X86__)
1062bool RF24::_init_radio()
1084 _is_p_variant = before_toggle == after_toggle;
1086 if (_is_p_variant) {
1094 write_register(
DYNPD, 0);
1096 write_register(
EN_AA, 0x3F);
1141 return ce_pin != RF24_PIN_INVALID && csn_pin != RF24_PIN_INVALID;
1148#if !defined(RF24_TINY) && !defined(LITTLEWIRE)
1152 write_register(
CONFIG, config_reg);
1180 config_reg =
static_cast<uint8_t
>(config_reg &
~_BV(
PRIM_RX));
1181 write_register(
CONFIG, config_reg);
1183#if defined(RF24_TINY) || defined(LITTLEWIRE)
1185 if (ce_pin == csn_pin) {
1198 memcpy(pipe0_writing_address, &txAddress,
addr_width);
1207 memcpy(pipe0_writing_address, txAddress,
addr_width);
1217 config_reg =
static_cast<uint8_t
>(config_reg &
~_BV(
PWR_UP));
1218 write_register(
CONFIG, config_reg);
1229 write_register(
CONFIG, config_reg);
1239#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1241void RF24::errNotify()
1243 #if defined(RF24_DEBUG) || defined(RF24_LINUX)
1244 printf_P(
PSTR(
"RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.\r\n"));
1246 #if defined(FAILURE_HANDLING)
1255int8_t RF24::errHandler(
bool* doRecovery)
1259 uint32_t timer =
millis();
1262 if (
millis() - timer > 95) {
1263 #if defined(FAILURE_HANDLING)
1267 *doRecovery =
false;
1275 #if defined(FAILURE_HANDLING)
1288void RF24::errHandler()
1291 #if defined(FAILURE_HANDLING)
1294 if (!failureFlushed) {
1295 failureFlushed =
true;
1301 #if defined(FAILURE_HANDLING)
1302 failureFlushed =
false;
1317#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1318 bool doRecovery =
true;
1322#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1323 }
while (errHandler(&doRecovery) < 0);
1343 return write(buf, len, 0);
1355#if defined(FAILURE_HANDLING)
1356 bool timeoutInvoked =
false;
1359 uint32_t timer =
millis();
1365 if (
millis() - timer > timeout) {
1366#if defined(FAILURE_HANDLING)
1367 failureFlushed =
false;
1372#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1373 if (
millis() - timer > (timeout + 95)) {
1375 #if defined(FAILURE_HANDLING)
1376 timeoutInvoked =
true;
1377 if (!failureFlushed) {
1380 #if defined(FAILURE_HANDLING)
1389#if defined(FAILURE_HANDLING)
1390 if (!timeoutInvoked) {
1391 failureFlushed =
false;
1417#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1418 uint32_t timer =
millis();
1419 bool timeoutInvoked =
false;
1425#if defined(FAILURE_HANDLING)
1426 failureFlushed =
false;
1431#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1432 if (
millis() - timer > 95) {
1433 timeoutInvoked =
true;
1435 #if defined(FAILURE_HANDLING)
1436 if (!failureFlushed) {
1439 #if defined(FAILURE_HANDLING)
1446#if defined(FAILURE_HANDLING)
1447 if (!timeoutInvoked) {
1448 failureFlushed =
false;
1485#if !defined(F_CPU) || F_CPU > 20000000
1488#ifdef ARDUINO_ARCH_STM32
1489 if (F_CPU > 20000000) {
1516 return static_cast<bool>(
static_cast<uint8_t
>(
isFifo(about_tx)) &
_BV(!check_empty));
1524#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1525 uint32_t timeout =
millis();
1532#if defined(FAILURE_HANDLING)
1533 failureFlushed =
false;
1537#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1538 if (
millis() - timeout > 95) {
1546#if defined(FAILURE_HANDLING)
1547 failureFlushed =
false;
1561 uint32_t start =
millis();
1568 if (
millis() - start >= timeout) {
1571#if defined(FAILURE_HANDLING)
1572 failureFlushed =
false;
1577#if defined(FAILURE_HANDLING) || defined(RF24_LINUX)
1578 if (
millis() - start > timeout + 95) {
1586#if defined(FAILURE_HANDLING)
1587 failureFlushed =
false;
1600 write_register(
CONFIG, config_reg);
1609 if (result > 32 || !result) {
1640 read_payload(buf, len);
1674 write_register(
CONFIG, config_reg);
1701 memcpy(pipe0_writing_address, &value,
addr_width);
1712 memcpy(pipe0_writing_address, address,
addr_width);
1726 memcpy(pipe0_reading_address, &address,
addr_width);
1737 else if (
static_cast<bool>(config_reg &
_BV(
PRIM_RX)) || child != 0) {
1752 a_width =
static_cast<uint8_t
>(a_width - 2);
1754 write_register(
SETUP_AW,
static_cast<uint8_t
>(a_width % 4));
1755 addr_width =
static_cast<uint8_t
>((a_width % 4) + 2);
1758 write_register(
SETUP_AW,
static_cast<uint8_t
>(0));
1771 memcpy(pipe0_reading_address, address,
addr_width);
1781 else if (
static_cast<bool>(config_reg &
_BV(
PRIM_RX)) || child != 0) {
1805void RF24::toggle_features(
void)
1808#if defined(RF24_SPI_PTR)
1810 _spi->transfer(0x73);
1813 _SPI.transfer(0x73);
1853 write_register(
DYNPD, 0);
1909 const uint8_t* current =
reinterpret_cast<const uint8_t*
>(buf);
1928 return _is_p_variant;
1936 write_register(
EN_AA, 0x3F);
1939 write_register(
EN_AA, 0);
1954 en_aa |=
static_cast<uint8_t
>(
_BV(pipe));
1957 en_aa =
static_cast<uint8_t
>(en_aa &
~_BV(pipe));
1962 write_register(
EN_AA, en_aa);
1985 setup |= _pa_level_reg_value(level, lnaEnable);
2007 bool result =
false;
2012 setup |= _data_rate_reg_value(speed);
2051 config_reg =
static_cast<uint8_t
>(config_reg & ~(
_BV(
CRCO) |
_BV(
EN_CRC)));
2064 write_register(
CONFIG, config_reg);
2091 config_reg =
static_cast<uint8_t
>(config_reg &
~_BV(
EN_CRC));
2092 write_register(
CONFIG, config_reg);
2109 uint8_t dummy_buf[32];
2110 for (uint8_t i = 0; i < 32; ++i)
2111 dummy_buf[i] = 0xFF;
2115 write_register(
TX_ADDR,
reinterpret_cast<uint8_t*
>(&dummy_buf), 5);
2120 write_register(
W_TX_PAYLOAD,
reinterpret_cast<const uint8_t*
>(&dummy_buf), 32);
2158 write_register(
EN_RXADDR,
static_cast<uint8_t
>(isEnabled ? 0x3F : 0));
2165#if !defined(F_CPU) || F_CPU > 20000000
2171#if !defined(F_CPU) || F_CPU > 20000000
2181#if !defined(F_CPU) || F_CPU > 20000000
2191 return static_cast<uint8_t
>(0);
2196uint8_t RF24::_pa_level_reg_value(uint8_t level,
bool lnaEnable)
2201 return static_cast<uint8_t
>(((level >
RF24_PA_MAX ?
static_cast<uint8_t
>(
RF24_PA_MAX) : level) << 1) + lnaEnable);
2208 uint8_t setup = _data_rate_reg_value(speed);
2209 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_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)
uint16_t failureRecoveryAttempts
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.
constexpr uint8_t FEATURE
constexpr uint8_t RF_SETUP
constexpr uint8_t RX_ADDR_P2
constexpr uint8_t R_RX_PL_WID
constexpr uint8_t MASK_MAX_RT
constexpr uint8_t EN_DYN_ACK
constexpr uint8_t CONT_WAVE
constexpr uint8_t RX_ADDR_P4
constexpr uint8_t MASK_TX_DS
constexpr uint8_t TX_FULL
constexpr uint8_t MASK_RX_DR
constexpr uint8_t RX_P_NO
constexpr uint8_t W_TX_PAYLOAD_NO_ACK
constexpr uint8_t OBSERVE_TX
constexpr uint8_t ARC_CNT
constexpr uint8_t RX_ADDR_P3
constexpr uint8_t RX_ADDR_P0
constexpr uint8_t RX_ADDR_P1
constexpr uint8_t EN_ACK_PAY
constexpr uint8_t RF_DR_LOW
constexpr uint8_t PRIM_RX
constexpr uint8_t RX_FULL
constexpr uint8_t ENAA_P0
constexpr uint8_t FIFO_STATUS
constexpr uint8_t ACTIVATE
constexpr uint8_t RF_DR_HIGH
constexpr uint8_t ENAA_P5
constexpr uint8_t ENAA_P4
constexpr uint8_t R_RX_PAYLOAD
constexpr uint8_t EN_RXADDR
constexpr uint8_t ENAA_P2
constexpr uint8_t REUSE_TX_PL
constexpr uint8_t RX_ADDR_P5
constexpr uint8_t RF_PWR_HIGH
constexpr uint8_t SETUP_AW
constexpr uint8_t ENAA_P1
constexpr uint8_t W_TX_PAYLOAD
constexpr uint8_t PLL_LOCK
constexpr uint8_t SETUP_RETR
constexpr uint8_t TX_EMPTY
constexpr uint8_t TX_ADDR
constexpr uint8_t FLUSH_TX
constexpr uint8_t W_ACK_PAYLOAD
constexpr uint8_t RF_PWR_LOW
constexpr uint8_t FLUSH_RX
constexpr uint8_t ENAA_P3
constexpr uint8_t W_REGISTER
constexpr uint8_t PLOS_CNT
constexpr uint8_t RX_PW_P0