Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
RF24.h
00001 /* 00002 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com> 00003 00004 This program is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU General Public License 00006 version 2 as published by the Free Software Foundation. 00007 */ 00008 00009 /** 00010 * @file RF24.h 00011 * 00012 * Class declaration for RF24 and helper enums 00013 */ 00014 00015 /* 00016 * Mbed support added by Akash Vibhute <akash.roboticist@gmail.com> 00017 * Porting completed on Nov/05/2015 00018 * 00019 * Updated 1: Synced with TMRh20's RF24 library on Nov/04/2015 from https://github.com/TMRh20 00020 * Updated 2: Synced with TMRh20's RF24 library on Apr/18/2015 from https://github.com/TMRh20 00021 * 00022 */ 00023 00024 #ifndef __RF24_H__ 00025 #define __RF24_H__ 00026 00027 #include "RF24_config.h" 00028 #include <mbed.h> 00029 00030 00031 00032 /** 00033 * Power Amplifier level. 00034 * 00035 * For use with setPALevel() 00036 */ 00037 typedef enum { RF24_PA_MIN = 0,RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX, RF24_PA_ERROR } rf24_pa_dbm_e ; 00038 00039 /** 00040 * Data rate. How fast data moves through the air. 00041 * 00042 * For use with setDataRate() 00043 */ 00044 typedef enum { RF24_1MBPS = 0, RF24_2MBPS, RF24_250KBPS } rf24_datarate_e; 00045 00046 /** 00047 * CRC Length. How big (if any) of a CRC is included. 00048 * 00049 * For use with setCRCLength() 00050 */ 00051 typedef enum { RF24_CRC_DISABLED = 0, RF24_CRC_8, RF24_CRC_16 } rf24_crclength_e; 00052 00053 /** 00054 * Driver for nRF24L01(+) 2.4GHz Wireless Transceiver 00055 */ 00056 00057 class RF24 00058 { 00059 private: 00060 DigitalOut ce_pin; /**< "Chip Enable" pin, activates the RX or TX role */ 00061 DigitalOut csn_pin; /**< SPI Chip select */ 00062 uint16_t spi_speed; /**< SPI Bus Speed */ 00063 00064 SPI spi; 00065 Timer mainTimer; 00066 00067 bool p_variant; /* False for RF24L01 and true for RF24L01P */ 00068 uint8_t payload_size; /**< Fixed size of payloads */ 00069 bool dynamic_payloads_enabled; /**< Whether dynamic payloads are enabled. */ 00070 uint8_t pipe0_reading_address[5]; /**< Last address set on pipe 0 for reading. */ 00071 uint8_t addr_width; /**< The address width to use - 3,4 or 5 bytes. */ 00072 uint32_t txRxDelay; /**< Var for adjusting delays depending on datarate */ 00073 00074 00075 protected: 00076 /** 00077 * SPI transactions 00078 * 00079 * Common code for SPI transactions including CSN toggle 00080 * 00081 */ 00082 inline void beginTransaction(); 00083 00084 inline void endTransaction(); 00085 00086 public: 00087 00088 /** 00089 * @name Primary public interface 00090 * 00091 * These are the main methods you need to operate the chip 00092 */ 00093 /**@{*/ 00094 00095 /** 00096 * Arduino Constructor 00097 * 00098 * Creates a new instance of this driver. Before using, you create an instance 00099 * and send in the unique pins that this chip is connected to. 00100 * 00101 * @param _cepin The pin attached to Chip Enable on the RF module 00102 * @param _cspin The pin attached to Chip Select 00103 */ 00104 RF24(PinName mosi, PinName miso, PinName sck, PinName _cepin, PinName _csnpin); 00105 00106 00107 /** 00108 * Begin operation of the chip 00109 * 00110 * Call this in setup(), before calling any other methods. 00111 * @code radio.begin() @endcode 00112 */ 00113 bool begin(void); 00114 00115 /** 00116 * Start listening on the pipes opened for reading. 00117 * 00118 * 1. Be sure to call openReadingPipe() first. 00119 * 2. Do not call write() while in this mode, without first calling stopListening(). 00120 * 3. Call available() to check for incoming traffic, and read() to get it. 00121 * 00122 * @code 00123 * Open reading pipe 1 using address CCCECCCECC 00124 * 00125 * byte address[] = { 0xCC,0xCE,0xCC,0xCE,0xCC }; 00126 * radio.openReadingPipe(1,address); 00127 * radio.startListening(); 00128 * @endcode 00129 */ 00130 void startListening(void); 00131 00132 /** 00133 * Stop listening for incoming messages, and switch to transmit mode. 00134 * 00135 * Do this before calling write(). 00136 * @code 00137 * radio.stopListening(); 00138 * radio.write(&data,sizeof(data)); 00139 * @endcode 00140 */ 00141 void stopListening(void); 00142 00143 /** 00144 * Check whether there are bytes available to be read 00145 * @code 00146 * if(radio.available()){ 00147 * radio.read(&data,sizeof(data)); 00148 * } 00149 * @endcode 00150 * @return True if there is a payload available, false if none is 00151 */ 00152 bool available(void); 00153 00154 /** 00155 * Read the available payload 00156 * 00157 * The size of data read is the fixed payload size, see getPayloadSize() 00158 * 00159 * @note I specifically chose 'void*' as a data type to make it easier 00160 * for beginners to use. No casting needed. 00161 * 00162 * @note No longer boolean. Use available to determine if packets are 00163 * available. Interrupt flags are now cleared during reads instead of 00164 * when calling available(). 00165 * 00166 * @param buf Pointer to a buffer where the data should be written 00167 * @param len Maximum number of bytes to read into the buffer 00168 * 00169 * @code 00170 * if(radio.available()){ 00171 * radio.read(&data,sizeof(data)); 00172 * } 00173 * @endcode 00174 * @return No return value. Use available(). 00175 */ 00176 void read( void* buf, uint8_t len ); 00177 00178 /** 00179 * Be sure to call openWritingPipe() first to set the destination 00180 * of where to write to. 00181 * 00182 * This blocks until the message is successfully acknowledged by 00183 * the receiver or the timeout/retransmit maxima are reached. In 00184 * the current configuration, the max delay here is 60-70ms. 00185 * 00186 * The maximum size of data written is the fixed payload size, see 00187 * getPayloadSize(). However, you can write less, and the remainder 00188 * will just be filled with zeroes. 00189 * 00190 * TX/RX/RT interrupt flags will be cleared every time write is called 00191 * 00192 * @param buf Pointer to the data to be sent 00193 * @param len Number of bytes to be sent 00194 * 00195 * @code 00196 * radio.stopListening(); 00197 * radio.write(&data,sizeof(data)); 00198 * @endcode 00199 * @return True if the payload was delivered successfully false if not 00200 */ 00201 bool write( const void* buf, uint8_t len ); 00202 00203 /** 00204 * New: Open a pipe for writing via byte array. Old addressing format retained 00205 * for compatibility. 00206 * 00207 * Only one writing pipe can be open at once, but you can change the address 00208 * you'll write to. Call stopListening() first. 00209 * 00210 * Addresses are assigned via a byte array, default is 5 byte address length 00211 s * 00212 * @code 00213 * uint8_t addresses[][6] = {"1Node","2Node"}; 00214 * radio.openWritingPipe(addresses[0]); 00215 * @endcode 00216 * @code 00217 * uint8_t address[] = { 0xCC,0xCE,0xCC,0xCE,0xCC }; 00218 * radio.openWritingPipe(address); 00219 * address[0] = 0x33; 00220 * radio.openReadingPipe(1,address); 00221 * @endcode 00222 * @see setAddressWidth 00223 * 00224 * @param address The address of the pipe to open. Coordinate these pipe 00225 * addresses amongst nodes on the network. 00226 */ 00227 00228 void openWritingPipe(const uint8_t *address); 00229 00230 /** 00231 * Open a pipe for reading 00232 * 00233 * Up to 6 pipes can be open for reading at once. Open all the required 00234 * reading pipes, and then call startListening(). 00235 * 00236 * @see openWritingPipe 00237 * @see setAddressWidth 00238 * 00239 * @note Pipes 0 and 1 will store a full 5-byte address. Pipes 2-5 will technically 00240 * only store a single byte, borrowing up to 4 additional bytes from pipe #1 per the 00241 * assigned address width. 00242 * @warning Pipes 1-5 should share the same address, except the first byte. 00243 * Only the first byte in the array should be unique, e.g. 00244 * @code 00245 * uint8_t addresses[][6] = {"1Node","2Node"}; 00246 * openReadingPipe(1,addresses[0]); 00247 * openReadingPipe(2,addresses[1]); 00248 * @endcode 00249 * 00250 * @warning Pipe 0 is also used by the writing pipe. So if you open 00251 * pipe 0 for reading, and then startListening(), it will overwrite the 00252 * writing pipe. Ergo, do an openWritingPipe() again before write(). 00253 * 00254 * @param number Which pipe# to open, 0-5. 00255 * @param address The 24, 32 or 40 bit address of the pipe to open. 00256 */ 00257 00258 void openReadingPipe(uint8_t number, const uint8_t *address); 00259 00260 /**@}*/ 00261 /** 00262 * @name Advanced Operation 00263 * 00264 * Methods you can use to drive the chip in more advanced ways 00265 */ 00266 /**@{*/ 00267 00268 /** 00269 * Print a giant block of debugging information to stdout 00270 * 00271 * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h 00272 * The printf.h file is included with the library for Arduino. 00273 * @code 00274 * #include <printf.h> 00275 * setup(){ 00276 * Serial.begin(115200); 00277 * printf_begin(); 00278 * ... 00279 * } 00280 * @endcode 00281 */ 00282 void printDetails(void); 00283 00284 /** 00285 * Test whether there are bytes available to be read in the 00286 * FIFO buffers. 00287 * 00288 * @param[out] pipe_num Which pipe has the payload available 00289 * 00290 * @code 00291 * uint8_t pipeNum; 00292 * if(radio.available(&pipeNum)){ 00293 * radio.read(&data,sizeof(data)); 00294 * Serial.print("Got data on pipe"); 00295 * Serial.println(pipeNum); 00296 * } 00297 * @endcode 00298 * @return True if there is a payload available, false if none is 00299 */ 00300 bool available(uint8_t* pipe_num); 00301 00302 /** 00303 * Check if the radio needs to be read. Can be used to prevent data loss 00304 * @return True if all three 32-byte radio buffers are full 00305 */ 00306 bool rxFifoFull(); 00307 00308 /** 00309 * Enter low-power mode 00310 * 00311 * To return to normal power mode, call powerUp(). 00312 * 00313 * @note After calling startListening(), a basic radio will consume about 13.5mA 00314 * at max PA level. 00315 * During active transmission, the radio will consume about 11.5mA, but this will 00316 * be reduced to 26uA (.026mA) between sending. 00317 * In full powerDown mode, the radio will consume approximately 900nA (.0009mA) 00318 * 00319 * @code 00320 * radio.powerDown(); 00321 * avr_enter_sleep_mode(); // Custom function to sleep the device 00322 * radio.powerUp(); 00323 * @endcode 00324 */ 00325 void powerDown(void); 00326 00327 /** 00328 * Leave low-power mode - required for normal radio operation after calling powerDown() 00329 * 00330 * To return to low power mode, call powerDown(). 00331 * @note This will take up to 5ms for maximum compatibility 00332 */ 00333 void powerUp(void) ; 00334 00335 /** 00336 * Write for single NOACK writes. Optionally disables acknowledgements/autoretries for a single write. 00337 * 00338 * @note enableDynamicAck() must be called to enable this feature 00339 * 00340 * Can be used with enableAckPayload() to request a response 00341 * @see enableDynamicAck() 00342 * @see setAutoAck() 00343 * @see write() 00344 * 00345 * @param buf Pointer to the data to be sent 00346 * @param len Number of bytes to be sent 00347 * @param multicast Request ACK (0), NOACK (1) 00348 */ 00349 bool write( const void* buf, uint8_t len, const bool multicast ); 00350 00351 /** 00352 * This will not block until the 3 FIFO buffers are filled with data. 00353 * Once the FIFOs are full, writeFast will simply wait for success or 00354 * timeout, and return 1 or 0 respectively. From a user perspective, just 00355 * keep trying to send the same data. The library will keep auto retrying 00356 * the current payload using the built in functionality. 00357 * @warning It is important to never keep the nRF24L01 in TX mode and FIFO full for more than 4ms at a time. If the auto 00358 * retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO 00359 * to clear by issuing txStandBy() or ensure appropriate time between transmissions. 00360 * 00361 * @code 00362 * Example (Partial blocking): 00363 * 00364 * radio.writeFast(&buf,32); // Writes 1 payload to the buffers 00365 * txStandBy(); // Returns 0 if failed. 1 if success. Blocks only until MAX_RT timeout or success. Data flushed on fail. 00366 * 00367 * radio.writeFast(&buf,32); // Writes 1 payload to the buffers 00368 * txStandBy(1000); // Using extended timeouts, returns 1 if success. Retries failed payloads for 1 seconds before returning 0. 00369 * @endcode 00370 * 00371 * @see txStandBy() 00372 * @see write() 00373 * @see writeBlocking() 00374 * 00375 * @param buf Pointer to the data to be sent 00376 * @param len Number of bytes to be sent 00377 * @return True if the payload was delivered successfully false if not 00378 */ 00379 bool writeFast( const void* buf, uint8_t len ); 00380 00381 /** 00382 * WriteFast for single NOACK writes. Disables acknowledgements/autoretries for a single write. 00383 * 00384 * @note enableDynamicAck() must be called to enable this feature 00385 * @see enableDynamicAck() 00386 * @see setAutoAck() 00387 * 00388 * @param buf Pointer to the data to be sent 00389 * @param len Number of bytes to be sent 00390 * @param multicast Request ACK (0) or NOACK (1) 00391 */ 00392 bool writeFast( const void* buf, uint8_t len, const bool multicast ); 00393 00394 /** 00395 * This function extends the auto-retry mechanism to any specified duration. 00396 * It will not block until the 3 FIFO buffers are filled with data. 00397 * If so the library will auto retry until a new payload is written 00398 * or the user specified timeout period is reached. 00399 * @warning It is important to never keep the nRF24L01 in TX mode and FIFO full for more than 4ms at a time. If the auto 00400 * retransmit is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO 00401 * to clear by issuing txStandBy() or ensure appropriate time between transmissions. 00402 * 00403 * @code 00404 * Example (Full blocking): 00405 * 00406 * radio.writeBlocking(&buf,32,1000); //Wait up to 1 second to write 1 payload to the buffers 00407 * txStandBy(1000); //Wait up to 1 second for the payload to send. Return 1 if ok, 0 if failed. 00408 * //Blocks only until user timeout or success. Data flushed on fail. 00409 * @endcode 00410 * @note If used from within an interrupt, the interrupt should be disabled until completion, and sei(); called to enable millis(). 00411 * @see txStandBy() 00412 * @see write() 00413 * @see writeFast() 00414 * 00415 * @param buf Pointer to the data to be sent 00416 * @param len Number of bytes to be sent 00417 * @param timeout User defined timeout in milliseconds. 00418 * @return True if the payload was loaded into the buffer successfully false if not 00419 */ 00420 bool writeBlocking( const void* buf, uint8_t len, uint32_t timeout ); 00421 00422 /** 00423 * This function should be called as soon as transmission is finished to 00424 * drop the radio back to STANDBY-I mode. If not issued, the radio will 00425 * remain in STANDBY-II mode which, per the data sheet, is not a recommended 00426 * operating mode. 00427 * 00428 * @note When transmitting data in rapid succession, it is still recommended by 00429 * the manufacturer to drop the radio out of TX or STANDBY-II mode if there is 00430 * time enough between sends for the FIFOs to empty. This is not required if auto-ack 00431 * is enabled. 00432 * 00433 * Relies on built-in auto retry functionality. 00434 * 00435 * @code 00436 * Example (Partial blocking): 00437 * 00438 * radio.writeFast(&buf,32); 00439 * radio.writeFast(&buf,32); 00440 * radio.writeFast(&buf,32); //Fills the FIFO buffers up 00441 * bool ok = txStandBy(); //Returns 0 if failed. 1 if success. 00442 * //Blocks only until MAX_RT timeout or success. Data flushed on fail. 00443 * @endcode 00444 * @see txStandBy(unsigned long timeout) 00445 * @return True if transmission is successful 00446 * 00447 */ 00448 bool txStandBy(); 00449 00450 /** 00451 * This function allows extended blocking and auto-retries per a user defined timeout 00452 * @code 00453 * Fully Blocking Example: 00454 * 00455 * radio.writeFast(&buf,32); 00456 * radio.writeFast(&buf,32); 00457 * radio.writeFast(&buf,32); //Fills the FIFO buffers up 00458 * bool ok = txStandBy(1000); //Returns 0 if failed after 1 second of retries. 1 if success. 00459 * //Blocks only until user defined timeout or success. Data flushed on fail. 00460 * @endcode 00461 * @note If used from within an interrupt, the interrupt should be disabled until completion, and sei(); called to enable millis(). 00462 * @param timeout Number of milliseconds to retry failed payloads 00463 * @return True if transmission is successful 00464 * 00465 */ 00466 bool txStandBy(uint32_t timeout, bool startTx = 0); 00467 00468 /** 00469 * Write an ack payload for the specified pipe 00470 * 00471 * The next time a message is received on @p pipe, the data in @p buf will 00472 * be sent back in the acknowledgement. 00473 * @see enableAckPayload() 00474 * @see enableDynamicPayloads() 00475 * @warning Only three of these can be pending at any time as there are only 3 FIFO buffers.<br> Dynamic payloads must be enabled. 00476 * @note Ack payloads are handled automatically by the radio chip when a payload is received. Users should generally 00477 * write an ack payload as soon as startListening() is called, so one is available when a regular payload is received. 00478 * @note Ack payloads are dynamic payloads. This only works on pipes 0&1 by default. Call 00479 * enableDynamicPayloads() to enable on all pipes. 00480 * 00481 * @param pipe Which pipe# (typically 1-5) will get this response. 00482 * @param buf Pointer to data that is sent 00483 * @param len Length of the data to send, up to 32 bytes max. Not affected 00484 * by the static payload set by setPayloadSize(). 00485 */ 00486 void writeAckPayload(uint8_t pipe, const void* buf, uint8_t len); 00487 00488 /** 00489 * Determine if an ack payload was received in the most recent call to 00490 * write(). The regular available() can also be used. 00491 * 00492 * Call read() to retrieve the ack payload. 00493 * 00494 * @return True if an ack payload is available. 00495 */ 00496 bool isAckPayloadAvailable(void); 00497 00498 /** 00499 * Call this when you get an interrupt to find out why 00500 * 00501 * Tells you what caused the interrupt, and clears the state of 00502 * interrupts. 00503 * 00504 * @param[out] tx_ok The send was successful (TX_DS) 00505 * @param[out] tx_fail The send failed, too many retries (MAX_RT) 00506 * @param[out] rx_ready There is a message waiting to be read (RX_DS) 00507 */ 00508 void whatHappened(bool& tx_ok,bool& tx_fail,bool& rx_ready); 00509 00510 /** 00511 * Non-blocking write to the open writing pipe used for buffered writes 00512 * 00513 * @note Optimization: This function now leaves the CE pin high, so the radio 00514 * will remain in TX or STANDBY-II Mode until a txStandBy() command is issued. Can be used as an alternative to startWrite() 00515 * if writing multiple payloads at once. 00516 * @warning It is important to never keep the nRF24L01 in TX mode with FIFO full for more than 4ms at a time. If the auto 00517 * retransmit/autoAck is enabled, the nRF24L01 is never in TX mode long enough to disobey this rule. Allow the FIFO 00518 * to clear by issuing txStandBy() or ensure appropriate time between transmissions. 00519 * 00520 * @see write() 00521 * @see writeFast() 00522 * @see startWrite() 00523 * @see writeBlocking() 00524 * 00525 * For single noAck writes see: 00526 * @see enableDynamicAck() 00527 * @see setAutoAck() 00528 * 00529 * @param buf Pointer to the data to be sent 00530 * @param len Number of bytes to be sent 00531 * @param multicast Request ACK (0) or NOACK (1) 00532 * @return True if the payload was delivered successfully false if not 00533 */ 00534 void startFastWrite( const void* buf, uint8_t len, const bool multicast, bool startTx = 1 ); 00535 00536 /** 00537 * Non-blocking write to the open writing pipe 00538 * 00539 * Just like write(), but it returns immediately. To find out what happened 00540 * to the send, catch the IRQ and then call whatHappened(). 00541 * 00542 * @see write() 00543 * @see writeFast() 00544 * @see startFastWrite() 00545 * @see whatHappened() 00546 * 00547 * For single noAck writes see: 00548 * @see enableDynamicAck() 00549 * @see setAutoAck() 00550 * 00551 * @param buf Pointer to the data to be sent 00552 * @param len Number of bytes to be sent 00553 * @param multicast Request ACK (0) or NOACK (1) 00554 * 00555 */ 00556 void startWrite( const void* buf, uint8_t len, const bool multicast ); 00557 00558 /** 00559 * This function is mainly used internally to take advantage of the auto payload 00560 * re-use functionality of the chip, but can be beneficial to users as well. 00561 * 00562 * The function will instruct the radio to re-use the data in the FIFO buffers, 00563 * and instructs the radio to re-send once the timeout limit has been reached. 00564 * Used by writeFast and writeBlocking to initiate retries when a TX failure 00565 * occurs. Retries are automatically initiated except with the standard write(). 00566 * This way, data is not flushed from the buffer until switching between modes. 00567 * 00568 * @note This is to be used AFTER auto-retry fails if wanting to resend 00569 * using the built-in payload reuse features. 00570 * After issuing reUseTX(), it will keep reending the same payload forever or until 00571 * a payload is written to the FIFO, or a flush_tx command is given. 00572 */ 00573 void reUseTX(); 00574 00575 /** 00576 * Empty the transmit buffer. This is generally not required in standard operation. 00577 * May be required in specific cases after stopListening() , if operating at 250KBPS data rate. 00578 * 00579 * @return Current value of status register 00580 */ 00581 uint8_t flush_tx(void); 00582 00583 /** 00584 * Test whether there was a carrier on the line for the 00585 * previous listening period. 00586 * 00587 * Useful to check for interference on the current channel. 00588 * 00589 * @return true if was carrier, false if not 00590 */ 00591 bool testCarrier(void); 00592 00593 /** 00594 * Test whether a signal (carrier or otherwise) greater than 00595 * or equal to -64dBm is present on the channel. Valid only 00596 * on nRF24L01P (+) hardware. On nRF24L01, use testCarrier(). 00597 * 00598 * Useful to check for interference on the current channel and 00599 * channel hopping strategies. 00600 * 00601 * @code 00602 * bool goodSignal = radio.testRPD(); 00603 * if(radio.available()){ 00604 * Serial.println(goodSignal ? "Strong signal > 64dBm" : "Weak signal < 64dBm" ); 00605 * radio.read(0,0); 00606 * } 00607 * @endcode 00608 * @return true if signal => -64dBm, false if not 00609 */ 00610 bool testRPD(void) ; 00611 00612 /** 00613 * Test whether this is a real radio, or a mock shim for 00614 * debugging. Setting either pin to 0xff is the way to 00615 * indicate that this is not a real radio. 00616 * 00617 * @return true if this is a legitimate radio 00618 */ 00619 bool isValid() { return ce_pin != 0xff && csn_pin != 0xff; } 00620 00621 /** 00622 * Close a pipe after it has been previously opened. 00623 * Can be safely called without having previously opened a pipe. 00624 * @param pipe Which pipe # to close, 0-5. 00625 */ 00626 void closeReadingPipe( uint8_t pipe ) ; 00627 00628 /** 00629 * Enable error detection by un-commenting #define FAILURE_HANDLING in RF24_config.h 00630 * If a failure has been detected, it usually indicates a hardware issue. By default the library 00631 * will cease operation when a failure is detected. 00632 * This should allow advanced users to detect and resolve intermittent hardware issues. 00633 * 00634 * In most cases, the radio must be re-enabled via radio.begin(); and the appropriate settings 00635 * applied after a failure occurs, if wanting to re-enable the device immediately. 00636 * 00637 * Usage: (Failure handling must be enabled per above) 00638 * @code 00639 * if(radio.failureDetected){ 00640 * radio.begin(); // Attempt to re-configure the radio with defaults 00641 * radio.failureDetected = 0; // Reset the detection value 00642 * radio.openWritingPipe(addresses[1]); // Re-configure pipe addresses 00643 * radio.openReadingPipe(1,addresses[0]); 00644 * report_failure(); // Blink leds, send a message, etc. to indicate failure 00645 * } 00646 * @endcode 00647 */ 00648 //#if defined (FAILURE_HANDLING) 00649 bool failureDetected; 00650 //#endif 00651 00652 /**@}*/ 00653 00654 /**@}*/ 00655 /** 00656 * @name Optional Configurators 00657 * 00658 * Methods you can use to get or set the configuration of the chip. 00659 * None are required. Calling begin() sets up a reasonable set of 00660 * defaults. 00661 */ 00662 /**@{*/ 00663 00664 /** 00665 * Set the address width from 3 to 5 bytes (24, 32 or 40 bit) 00666 * 00667 * @param a_width The address width to use: 3,4 or 5 00668 */ 00669 00670 void setAddressWidth(uint8_t a_width); 00671 00672 /** 00673 * Set the number and delay of retries upon failed submit 00674 * 00675 * @param delay How long to wait between each retry, in multiples of 250us, 00676 * max is 15. 0 means 250us, 15 means 4000us. 00677 * @param count How many retries before giving up, max 15 00678 */ 00679 void setRetries(uint8_t delay, uint8_t count); 00680 00681 /** 00682 * Set RF communication channel 00683 * 00684 * @param channel Which RF channel to communicate on, 0-125 00685 */ 00686 void setChannel(uint8_t channel); 00687 00688 /** 00689 * Get RF communication channel 00690 * 00691 * @return The currently configured RF Channel 00692 */ 00693 uint8_t getChannel(void); 00694 00695 /** 00696 * Set Static Payload Size 00697 * 00698 * This implementation uses a pre-stablished fixed payload size for all 00699 * transmissions. If this method is never called, the driver will always 00700 * transmit the maximum payload size (32 bytes), no matter how much 00701 * was sent to write(). 00702 * 00703 * @todo Implement variable-sized payloads feature 00704 * 00705 * @param size The number of bytes in the payload 00706 */ 00707 void setPayloadSize(uint8_t size); 00708 00709 /** 00710 * Get Static Payload Size 00711 * 00712 * @see setPayloadSize() 00713 * 00714 * @return The number of bytes in the payload 00715 */ 00716 uint8_t getPayloadSize(void); 00717 00718 /** 00719 * Get Dynamic Payload Size 00720 * 00721 * For dynamic payloads, this pulls the size of the payload off 00722 * the chip 00723 * 00724 * @note Corrupt packets are now detected and flushed per the 00725 * manufacturer. 00726 * @code 00727 * if(radio.available()){ 00728 * if(radio.getDynamicPayloadSize() < 1){ 00729 * // Corrupt payload has been flushed 00730 * return; 00731 * } 00732 * radio.read(&data,sizeof(data)); 00733 * } 00734 * @endcode 00735 * 00736 * @return Payload length of last-received dynamic payload 00737 */ 00738 uint8_t getDynamicPayloadSize(void); 00739 00740 /** 00741 * Enable custom payloads on the acknowledge packets 00742 * 00743 * Ack payloads are a handy way to return data back to senders without 00744 * manually changing the radio modes on both units. 00745 * 00746 * @note Ack payloads are dynamic payloads. This only works on pipes 0&1 by default. Call 00747 * enableDynamicPayloads() to enable on all pipes. 00748 */ 00749 void enableAckPayload(void); 00750 00751 /** 00752 * Enable dynamically-sized payloads 00753 * 00754 * This way you don't always have to send large packets just to send them 00755 * once in a while. This enables dynamic payloads on ALL pipes. 00756 * 00757 */ 00758 void enableDynamicPayloads(void); 00759 00760 /** 00761 * Enable dynamic ACKs (single write multicast or unicast) for chosen messages 00762 * 00763 * @note To enable full multicast or per-pipe multicast, use setAutoAck() 00764 * 00765 * @warning This MUST be called prior to attempting single write NOACK calls 00766 * @code 00767 * radio.enableDynamicAck(); 00768 * radio.write(&data,32,1); // Sends a payload with no acknowledgement requested 00769 * radio.write(&data,32,0); // Sends a payload using auto-retry/autoACK 00770 * @endcode 00771 */ 00772 void enableDynamicAck(); 00773 00774 /** 00775 * Determine whether the hardware is an nRF24L01+ or not. 00776 * 00777 * @return true if the hardware is nRF24L01+ (or compatible) and false 00778 * if its not. 00779 */ 00780 bool isPVariant(void) ; 00781 00782 /** 00783 * Enable or disable auto-acknowlede packets 00784 * 00785 * This is enabled by default, so it's only needed if you want to turn 00786 * it off for some reason. 00787 * 00788 * @param enable Whether to enable (true) or disable (false) auto-acks 00789 */ 00790 void setAutoAck(bool enable); 00791 00792 /** 00793 * Enable or disable auto-acknowlede packets on a per pipeline basis. 00794 * 00795 * AA is enabled by default, so it's only needed if you want to turn 00796 * it off/on for some reason on a per pipeline basis. 00797 * 00798 * @param pipe Which pipeline to modify 00799 * @param enable Whether to enable (true) or disable (false) auto-acks 00800 */ 00801 void setAutoAck( uint8_t pipe, bool enable ) ; 00802 00803 /** 00804 * Set Power Amplifier (PA) level to one of four levels: 00805 * RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX 00806 * 00807 * The power levels correspond to the following output levels respectively: 00808 * NRF24L01: -18dBm, -12dBm,-6dBM, and 0dBm 00809 * 00810 * SI24R1: -6dBm, 0dBm, 3dBM, and 7dBm. 00811 * 00812 * @param level Desired PA level. 00813 */ 00814 void setPALevel ( uint8_t level ); 00815 00816 /** 00817 * Fetches the current PA level. 00818 * 00819 * NRF24L01: -18dBm, -12dBm, -6dBm and 0dBm 00820 * SI24R1: -6dBm, 0dBm, 3dBm, 7dBm 00821 * 00822 * @return Returns values 0 to 3 representing the PA Level. 00823 */ 00824 uint8_t getPALevel( void ); 00825 00826 /** 00827 * Set the transmission data rate 00828 * 00829 * @warning setting RF24_250KBPS will fail for non-plus units 00830 * 00831 * @param speed RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps 00832 * @return true if the change was successful 00833 */ 00834 bool setDataRate(rf24_datarate_e speed); 00835 00836 /** 00837 * Fetches the transmission data rate 00838 * 00839 * @return Returns the hardware's currently configured datarate. The value 00840 * is one of 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS, as defined in the 00841 * rf24_datarate_e enum. 00842 */ 00843 rf24_datarate_e getDataRate( void ) ; 00844 00845 /** 00846 * Set the CRC length 00847 * <br>CRC checking cannot be disabled if auto-ack is enabled 00848 * @param length RF24_CRC_8 for 8-bit or RF24_CRC_16 for 16-bit 00849 */ 00850 void setCRCLength(rf24_crclength_e length); 00851 00852 /** 00853 * Get the CRC length 00854 * <br>CRC checking cannot be disabled if auto-ack is enabled 00855 * @return RF24_DISABLED if disabled or RF24_CRC_8 for 8-bit or RF24_CRC_16 for 16-bit 00856 */ 00857 rf24_crclength_e getCRCLength(void); 00858 00859 /** 00860 * Disable CRC validation 00861 * 00862 * @warning CRC cannot be disabled if auto-ack/ESB is enabled. 00863 */ 00864 void disableCRC( void ) ; 00865 00866 /** 00867 * The radio will generate interrupt signals when a transmission is complete, 00868 * a transmission fails, or a payload is received. This allows users to mask 00869 * those interrupts to prevent them from generating a signal on the interrupt 00870 * pin. Interrupts are enabled on the radio chip by default. 00871 * 00872 * @code 00873 * Mask all interrupts except the receive interrupt: 00874 * 00875 * radio.maskIRQ(1,1,0); 00876 * @endcode 00877 * 00878 * @param tx_ok Mask transmission complete interrupts 00879 * @param tx_fail Mask transmit failure interrupts 00880 * @param rx_ready Mask payload received interrupts 00881 */ 00882 void maskIRQ(bool tx_ok,bool tx_fail,bool rx_ready); 00883 00884 /**@}*/ 00885 /** 00886 * @name Deprecated 00887 * 00888 * Methods provided for backwards compabibility. 00889 */ 00890 /**@{*/ 00891 00892 00893 /** 00894 * Open a pipe for reading 00895 * @note For compatibility with old code only, see new function 00896 * 00897 * @warning Pipes 1-5 should share the first 32 bits. 00898 * Only the least significant byte should be unique, e.g. 00899 * @code 00900 * openReadingPipe(1,0xF0F0F0F0AA); 00901 * openReadingPipe(2,0xF0F0F0F066); 00902 * @endcode 00903 * 00904 * @warning Pipe 0 is also used by the writing pipe. So if you open 00905 * pipe 0 for reading, and then startListening(), it will overwrite the 00906 * writing pipe. Ergo, do an openWritingPipe() again before write(). 00907 * 00908 * @param number Which pipe# to open, 0-5. 00909 * @param address The 40-bit address of the pipe to open. 00910 */ 00911 void openReadingPipe(uint8_t number, uint64_t address); 00912 00913 /** 00914 * Open a pipe for writing 00915 * @note For compatibility with old code only, see new function 00916 * 00917 * Addresses are 40-bit hex values, e.g.: 00918 * 00919 * @code 00920 * openWritingPipe(0xF0F0F0F0F0); 00921 * @endcode 00922 * 00923 * @param address The 40-bit address of the pipe to open. 00924 */ 00925 void openWritingPipe(uint64_t address); 00926 00927 private: 00928 00929 /** 00930 * @name Low-level internal interface. 00931 * 00932 * Protected methods that address the chip directly. Regular users cannot 00933 * ever call these. They are documented for completeness and for developers who 00934 * may want to extend this class. 00935 */ 00936 /**@{*/ 00937 00938 /** 00939 * Set chip select pin 00940 * 00941 * Running SPI bus at PI_CLOCK_DIV2 so we don't waste time transferring data 00942 * and best of all, we make use of the radio's FIFO buffers. A lower speed 00943 * means we're less likely to effectively leverage our FIFOs and pay a higher 00944 * AVR runtime cost as toll. 00945 * 00946 * @param mode HIGH to take this unit off the SPI bus, LOW to put it on 00947 */ 00948 void csn(bool mode); 00949 00950 /** 00951 * Set chip enable 00952 * 00953 * @param level HIGH to actively begin transmission or LOW to put in standby. Please see data sheet 00954 * for a much more detailed description of this pin. 00955 */ 00956 void ce(bool level); 00957 00958 /** 00959 * Read a chunk of data in from a register 00960 * 00961 * @param reg Which register. Use constants from nRF24L01.h 00962 * @param buf Where to put the data 00963 * @param len How many bytes of data to transfer 00964 * @return Current value of status register 00965 */ 00966 uint8_t read_register(uint8_t reg, uint8_t* buf, uint8_t len); 00967 00968 /** 00969 * Read single byte from a register 00970 * 00971 * @param reg Which register. Use constants from nRF24L01.h 00972 * @return Current value of register @p reg 00973 */ 00974 uint8_t read_register(uint8_t reg); 00975 00976 /** 00977 * Write a chunk of data to a register 00978 * 00979 * @param reg Which register. Use constants from nRF24L01.h 00980 * @param buf Where to get the data 00981 * @param len How many bytes of data to transfer 00982 * @return Current value of status register 00983 */ 00984 uint8_t write_register(uint8_t reg, const uint8_t* buf, uint8_t len); 00985 00986 /** 00987 * Write a single byte to a register 00988 * 00989 * @param reg Which register. Use constants from nRF24L01.h 00990 * @param value The new value to write 00991 * @return Current value of status register 00992 */ 00993 uint8_t write_register(uint8_t reg, uint8_t value); 00994 00995 /** 00996 * Write the transmit payload 00997 * 00998 * The size of data written is the fixed payload size, see getPayloadSize() 00999 * 01000 * @param buf Where to get the data 01001 * @param len Number of bytes to be sent 01002 * @return Current value of status register 01003 */ 01004 uint8_t write_payload(const void* buf, uint8_t len, const uint8_t writeType); 01005 01006 /** 01007 * Read the receive payload 01008 * 01009 * The size of data read is the fixed payload size, see getPayloadSize() 01010 * 01011 * @param buf Where to put the data 01012 * @param len Maximum number of bytes to read 01013 * @return Current value of status register 01014 */ 01015 uint8_t read_payload(void* buf, uint8_t len); 01016 01017 /** 01018 * Empty the receive buffer 01019 * 01020 * @return Current value of status register 01021 */ 01022 uint8_t flush_rx(void); 01023 01024 /** 01025 * Retrieve the current status of the chip 01026 * 01027 * @return Current value of status register 01028 */ 01029 uint8_t get_status(void); 01030 01031 #if !defined (MINIMAL) 01032 /** 01033 * Decode and print the given status to stdout 01034 * 01035 * @param status Status value to print 01036 * 01037 * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h 01038 */ 01039 void print_status(uint8_t status); 01040 01041 /** 01042 * Decode and print the given 'observe_tx' value to stdout 01043 * 01044 * @param value The observe_tx value to print 01045 * 01046 * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h 01047 */ 01048 void print_observe_tx(uint8_t value); 01049 01050 /** 01051 * Print the name and value of an 8-bit register to stdout 01052 * 01053 * Optionally it can print some quantity of successive 01054 * registers on the same line. This is useful for printing a group 01055 * of related registers on one line. 01056 * 01057 * @param name Name of the register 01058 * @param reg Which register. Use constants from nRF24L01.h 01059 * @param qty How many successive registers to print 01060 */ 01061 void print_byte_register(const char* name, uint8_t reg, uint8_t qty = 1); 01062 01063 /** 01064 * Print the name and value of a 40-bit address register to stdout 01065 * 01066 * Optionally it can print some quantity of successive 01067 * registers on the same line. This is useful for printing a group 01068 * of related registers on one line. 01069 * 01070 * @param name Name of the register 01071 * @param reg Which register. Use constants from nRF24L01.h 01072 * @param qty How many successive registers to print 01073 */ 01074 void print_address_register(const char* name, uint8_t reg, uint8_t qty = 1); 01075 #endif 01076 /** 01077 * Turn on or off the special features of the chip 01078 * 01079 * The chip has certain 'features' which are only available when the 'features' 01080 * are enabled. See the datasheet for details. 01081 */ 01082 void toggle_features(void); 01083 01084 /** 01085 * Built in spi transfer function to simplify repeating code repeating code 01086 */ 01087 01088 uint8_t spiTrans(uint8_t cmd); 01089 01090 #if defined (FAILURE_HANDLING) || defined (RF24_LINUX) 01091 void errNotify(void); 01092 #endif 01093 01094 /**@}*/ 01095 01096 }; 01097 01098 01099 /** 01100 * @example GettingStarted.ino 01101 * <b>For Arduino</b><br> 01102 * <b>Updated: TMRh20 2014 </b><br> 01103 * 01104 * This is an example of how to use the RF24 class to communicate on a basic level. Configure and write this sketch to two 01105 * different nodes. Put one of the nodes into 'transmit' mode by connecting with the serial monitor and <br> 01106 * sending a 'T'. The ping node sends the current time to the pong node, which responds by sending the value 01107 * back. The ping node can then see how long the whole cycle took. <br> 01108 * @note For a more efficient call-response scenario see the GettingStarted_CallResponse.ino example. 01109 * @note When switching between sketches, the radio may need to be powered down to clear settings that are not "un-set" otherwise 01110 */ 01111 01112 /** 01113 * @example GettingStarted.cpp 01114 * <b>For Raspberry Pi</b><br> 01115 * <b>Updated: TMRh20 2014 </b><br> 01116 * 01117 * This is an example of how to use the RF24 class to communicate on a basic level. Configure and write this sketch to two 01118 * different nodes. Put one of the nodes into 'transmit' mode by connecting with the serial monitor and <br> 01119 * sending a 'T'. The ping node sends the current time to the pong node, which responds by sending the value 01120 * back. The ping node can then see how long the whole cycle took. <br> 01121 * @note For a more efficient call-response scenario see the GettingStarted_CallResponse.ino example. 01122 */ 01123 01124 /** 01125 * @example GettingStarted_CallResponse.ino 01126 * <b>For Arduino</b><br> 01127 * <b>New: TMRh20 2014</b><br> 01128 * 01129 * This example continues to make use of all the normal functionality of the radios including 01130 * the auto-ack and auto-retry features, but allows ack-payloads to be written optionlly as well. <br> 01131 * This allows very fast call-response communication, with the responding radio never having to 01132 * switch out of Primary Receiver mode to send back a payload, but having the option to switch to <br> 01133 * primary transmitter if wanting to initiate communication instead of respond to a commmunication. 01134 */ 01135 01136 /** 01137 * @example GettingStarted_Call_Response.cpp 01138 * <b>For Raspberry Pi</b><br> 01139 * <b>New: TMRh20 2014</b><br> 01140 * 01141 * This example continues to make use of all the normal functionality of the radios including 01142 * the auto-ack and auto-retry features, but allows ack-payloads to be written optionlly as well. <br> 01143 * This allows very fast call-response communication, with the responding radio never having to 01144 * switch out of Primary Receiver mode to send back a payload, but having the option to switch to <br> 01145 * primary transmitter if wanting to initiate communication instead of respond to a commmunication. 01146 */ 01147 01148 /** 01149 * @example GettingStarted_HandlingData.ino 01150 * <b>Dec 2014 - TMRh20</b><br> 01151 * 01152 * This example demonstrates how to send multiple variables in a single payload and work with data. As usual, it is 01153 * generally important to include an incrementing value like millis() in the payloads to prevent errors. 01154 */ 01155 01156 /** 01157 * @example Transfer.ino 01158 * <b>For Arduino</b><br> 01159 * This example demonstrates half-rate transfer using the FIFO buffers<br> 01160 * 01161 * It is an example of how to use the RF24 class. Write this sketch to two 01162 * different nodes. Put one of the nodes into 'transmit' mode by connecting <br> 01163 * with the serial monitor and sending a 'T'. The data transfer will begin, 01164 * with the receiver displaying the payload count. (32Byte Payloads) <br> 01165 */ 01166 01167 /** 01168 * @example Transfer.cpp 01169 * <b>For Raspberry Pi</b><br> 01170 * This example demonstrates half-rate transfer using the FIFO buffers<br> 01171 * 01172 * It is an example of how to use the RF24 class. Write this sketch to two 01173 * different nodes. Put one of the nodes into 'transmit' mode by connecting <br> 01174 * with the serial monitor and sending a 'T'. The data transfer will begin, 01175 * with the receiver displaying the payload count. (32Byte Payloads) <br> 01176 */ 01177 01178 /** 01179 * @example TransferTimeouts.ino 01180 * <b>New: TMRh20 </b><br> 01181 * This example demonstrates the use of and extended timeout period and 01182 * auto-retries/auto-reUse to increase reliability in noisy or low signal scenarios. <br> 01183 * 01184 * Write this sketch to two different nodes. Put one of the nodes into 'transmit' 01185 * mode by connecting with the serial monitor and sending a 'T'. The data <br> 01186 * transfer will begin, with the receiver displaying the payload count and the 01187 * data transfer rate. 01188 */ 01189 01190 /** 01191 * @example starping.pde 01192 * 01193 * This sketch is a more complex example of using the RF24 library for Arduino. 01194 * Deploy this on up to six nodes. Set one as the 'pong receiver' by tying the 01195 * role_pin low, and the others will be 'ping transmit' units. The ping units 01196 * unit will send out the value of millis() once a second. The pong unit will 01197 * respond back with a copy of the value. Each ping unit can get that response 01198 * back, and determine how long the whole cycle took. 01199 * 01200 * This example requires a bit more complexity to determine which unit is which. 01201 * The pong receiver is identified by having its role_pin tied to ground. 01202 * The ping senders are further differentiated by a byte in eeprom. 01203 */ 01204 01205 /** 01206 * @example pingpair_ack.ino 01207 * <b>Update: TMRh20</b><br> 01208 * This example continues to make use of all the normal functionality of the radios including 01209 * the auto-ack and auto-retry features, but allows ack-payloads to be written optionlly as well.<br> 01210 * This allows very fast call-response communication, with the responding radio never having to 01211 * switch out of Primary Receiver mode to send back a payload, but having the option to if wanting<br> 01212 * to initiate communication instead of respond to a commmunication. 01213 */ 01214 01215 /** 01216 * @example pingpair_irq.ino 01217 * <b>Update: TMRh20</b><br> 01218 * This is an example of how to user interrupts to interact with the radio, and a demonstration 01219 * of how to use them to sleep when receiving, and not miss any payloads.<br> 01220 * The pingpair_sleepy example expands on sleep functionality with a timed sleep option for the transmitter. 01221 * Sleep functionality is built directly into my fork of the RF24Network library<br> 01222 */ 01223 01224 /** 01225 * @example pingpair_irq_simple.ino 01226 * <b>Dec 2014 - TMRh20</b><br> 01227 * This is an example of how to user interrupts to interact with the radio, with bidirectional communication. 01228 */ 01229 01230 /** 01231 * @example pingpair_sleepy.ino 01232 * <b>Update: TMRh20</b><br> 01233 * This is an example of how to use the RF24 class to create a battery- 01234 * efficient system. It is just like the GettingStarted_CallResponse example, but the<br> 01235 * ping node powers down the radio and sleeps the MCU after every 01236 * ping/pong cycle, and the receiver sleeps between payloads. <br> 01237 */ 01238 01239 /** 01240 * @example rf24ping85.ino 01241 * <b>New: Contributed by https://github.com/tong67</b><br> 01242 * This is an example of how to use the RF24 class to communicate with ATtiny85 and other node. <br> 01243 */ 01244 01245 /** 01246 * @example timingSearch3pin.ino 01247 * <b>New: Contributed by https://github.com/tong67</b><br> 01248 * This is an example of how to determine the correct timing for ATtiny when using only 3-pins 01249 */ 01250 01251 /** 01252 * @example pingpair_dyn.ino 01253 * 01254 * This is an example of how to use payloads of a varying (dynamic) size on Arduino. 01255 */ 01256 01257 /** 01258 * @example pingpair_dyn.cpp 01259 * 01260 * This is an example of how to use payloads of a varying (dynamic) size on Raspberry Pi. 01261 */ 01262 01263 /** 01264 * @example pingpair_dyn.py 01265 * 01266 * This is a python example for RPi of how to use payloads of a varying (dynamic) size. 01267 */ 01268 01269 /** 01270 * @example pingpair_dyn.ino 01271 * 01272 * This is an example of how to use payloads of a varying (dynamic) size. 01273 */ 01274 01275 /** 01276 * @example pingpair_dyn.ino 01277 * 01278 * This is an example of how to use payloads of a varying (dynamic) size. 01279 */ 01280 01281 /** 01282 * @example scanner.ino 01283 * 01284 * Example to detect interference on the various channels available. 01285 * This is a good diagnostic tool to check whether you're picking a 01286 * good channel for your application. 01287 * 01288 * Inspired by cpixip. 01289 * See http://arduino.cc/forum/index.php/topic,54795.0.html 01290 */ 01291 01292 /** 01293 * @mainpage Optimized High Speed Driver for nRF24L01(+) 2.4GHz Wireless Transceiver 01294 * 01295 * @section Goals Design Goals 01296 * 01297 * This library fork is designed to be... 01298 * @li More compliant with the manufacturer specified operation of the chip, while allowing advanced users 01299 * to work outside the recommended operation. 01300 * @li Utilize the capabilities of the radio to their full potential via Arduino 01301 * @li More reliable, responsive, bug-free and feature rich 01302 * @li Easy for beginners to use, with well documented examples and features 01303 * @li Consumed with a public interface that's similar to other Arduino standard libraries 01304 * 01305 * @section News News 01306 * 01307 * **Dec 2015**<br> 01308 * - ESP8266 support via Arduino IDE 01309 * - <a href="https://github.com/stewarthou/Particle-RF24">Particle Photon/Core</a> fork available 01310 * - ATTiny2313/4313 support added 01311 * - Python 3 support added 01312 * - RF24 added to Arduino library manager 01313 * - RF24 added to PlatformIO library manager 01314 * 01315 * **March 2015**<br> 01316 * - Uses SPI transactions on Arduino 01317 * - New layout for <a href="Portability.html">easier portability:</a> Break out defines & includes for individual platforms to RF24/utility 01318 * - <a href="MRAA.html">MRAA</a> support added ( Galileo, Edison, etc) 01319 * - <a href="BBB.html">BBB/Generic Linux </a> support via spidev & MRAA 01320 * - Support for RPi 2 added 01321 * - Major Documentation cleanup & update (Move all docs to github.io) 01322 * 01323 * 01324 * If issues are discovered with the documentation, please report them <a href="https://github.com/TMRh20/tmrh20.github.io/issues"> here</a> 01325 * 01326 * <br> 01327 * @section Useful Useful References 01328 * 01329 * 01330 * @li <a href="http://tmrh20.github.io/RF24/classRF24.html"><b>RF24</b> Class Documentation</a> 01331 * @li <a href="https://github.com/TMRh20/RF24/archive/master.zip"><b>Download</b></a> 01332 * @li <a href="https://github.com/tmrh20/RF24/"><b>Source Code</b></a> 01333 * @li <a href="http://tmrh20.blogspot.com/2014/03/high-speed-data-transfers-and-wireless.html"><b>My Blog:</b> RF24 Optimization Overview</a> 01334 * @li <a href="http://www.nordicsemi.com/files/Product/data_sheet/nRF24L01_Product_Specification_v2_0.pdf">Chip Datasheet</a> 01335 * 01336 * **Additional Information and Add-ons** 01337 * 01338 * @li <a href="http://tmrh20.github.io/RF24Network"> <b>RF24Network:</b> OSI Network Layer for multi-device communication. Create a home sensor network.</a> 01339 * @li <a href="http://tmrh20.github.io/RF24Mesh"> <b>RF24Mesh:</b> Dynamic Mesh Layer for RF24Network</a> 01340 * @li <a href="http://tmrh20.github.io/RF24Ethernet"> <b>RF24Ethernet:</b> TCP/IP Radio Mesh Networking (shares Arduino Ethernet API)</a> 01341 * @li <a href="http://tmrh20.github.io/RF24Audio"> <b>RF24Audio:</b> Realtime Wireless Audio streaming</a> 01342 * @li <a href="http://tmrh20.github.io/">All TMRh20 Documentation Main Page</a> 01343 * 01344 * **More Information and RF24 Based Projects** 01345 * 01346 * @li <a href="http://TMRh20.blogspot.com"> Project Blog: TMRh20.blogspot.com </a> 01347 * @li <a href="http://maniacalbits.blogspot.ca/"> Maniacal Bits Blog</a> 01348 * @li <a href="http://www.mysensors.org/">MySensors.org (User friendly sensor networks/IoT)</a> 01349 * @li <a href="https://github.com/mannkind/RF24Node_MsgProto"> RF24Node_MsgProto (MQTT)</a> 01350 * @li <a href="https://bitbucket.org/pjhardy/rf24sensornet/"> RF24SensorNet </a> 01351 * @li <a href="http://www.homeautomationforgeeks.com/rf24software.shtml">Home Automation for Geeks</a> 01352 * @li <a href="https://maniacbug.wordpress.com/2012/03/30/rf24network/"> Original Maniacbug RF24Network Blog Post</a> 01353 * @li <a href="https://github.com/maniacbug/RF24"> ManiacBug on GitHub (Original Library Author)</a> 01354 * 01355 * 01356 * <br> 01357 * 01358 * @section Platform_Support Platform Support Pages 01359 * 01360 * @li <a href="Arduino.html"><b>Arduino</b></a> (Uno, Nano, Mega, Due, Galileo, etc) 01361 * @li <a href="ATTiny.html"><b>ATTiny</b></a> 01362 * @li Linux ( <a href="RPi.html"><b>RPi</b></a> , <a href="BBB.html"><b>BBB</b></a>, <a href="MRAA.html"><b>MRAA</b></a> supported boards ( Galileo, Edison, etc)) 01363 * @li <a href="Python.html"><b>Python</b></a> wrapper available for RPi 01364 * 01365 * <br> 01366 * **General µC Pin layout** (See the individual board support pages for more info) 01367 * 01368 * The table below shows how to connect the the pins of the NRF24L01(+) to different boards. 01369 * CE and CSN are configurable. 01370 * 01371 * | PIN | NRF24L01 | Arduino UNO | ATtiny25/45/85 [0] | ATtiny44/84 [1] | LittleWire [2] | RPI | RPi -P1 Connector | 01372 * |-----|----------|-------------|--------------------|-----------------|-------------------------|------------|-------------------| 01373 * | 1 | GND | GND | pin 4 | pin 14 | GND | rpi-gnd | (25) | 01374 * | 2 | VCC | 3.3V | pin 8 | pin 1 | regulator 3.3V required | rpi-3v3 | (17) | 01375 * | 3 | CE | digIO 7 | pin 2 | pin 12 | pin to 3.3V | rpi-gpio22 | (15) | 01376 * | 4 | CSN | digIO 8 | pin 3 | pin 11 | RESET | rpi-gpio8 | (24) | 01377 * | 5 | SCK | digIO 13 | pin 7 | pin 9 | SCK | rpi-sckl | (23) | 01378 * | 6 | MOSI | digIO 11 | pin 6 | pin 7 | MOSI | rpi-mosi | (19) | 01379 * | 7 | MISO | digIO 12 | pin 5 | pin 8 | MISO | rpi-miso | (21) | 01380 * | 8 | IRQ | - | - | - | - | - | - | 01381 * 01382 * @li [0] https://learn.sparkfun.com/tutorials/tiny-avr-programmer-hookup-guide/attiny85-use-hints 01383 * @li [1] http://highlowtech.org/?p=1695 01384 * @li [2] http://littlewire.cc/ 01385 * <br><br><br> 01386 * 01387 * 01388 * 01389 * 01390 * @page Arduino Arduino 01391 * 01392 * RF24 is fully compatible with Arduino boards <br> 01393 * See <b> http://www.arduino.cc/en/Reference/Board </b> and <b> http://arduino.cc/en/Reference/SPI </b> for more information 01394 * 01395 * RF24 makes use of the standard hardware SPI pins (MISO,MOSI,SCK) and requires two additional pins, to control 01396 * the chip-select and chip-enable functions.<br> 01397 * These pins must be chosen and designated by the user, in RF24 radio(ce_pin,cs_pin); and can use any 01398 * available pins. 01399 * 01400 * <br> 01401 * @section ARD_DUE Arduino Due 01402 * 01403 * RF24 makes use of the extended SPI functionality available on the Arduino Due, and requires one of the 01404 * defined hardware SS/CS pins to be designated in RF24 radio(ce_pin,cs_pin);<br> 01405 * See http://arduino.cc/en/Reference/DueExtendedSPI for more information 01406 * 01407 * Initial Due support taken from https://github.com/mcrosson/RF24/tree/due 01408 * 01409 * <br> 01410 * @section Alternate_SPI Alternate SPI Support 01411 * 01412 * RF24 supports alternate SPI methods, in case the standard hardware SPI pins are otherwise unavailable. 01413 * 01414 * <br> 01415 * **Software Driven SPI** 01416 * 01417 * Software driven SPI is provided by the <a href=https://github.com/greiman/DigitalIO>DigitalIO</a> library 01418 * 01419 * Setup:<br> 01420 * 1. Install the digitalIO library<br> 01421 * 2. Open RF24_config.h in a text editor. Uncomment the line #define SOFTSPI<br> 01422 * 3. In your sketch, add #include DigitalIO.h 01423 * 01424 * @note Note: Pins are listed as follows and can be modified by editing the RF24_config.h file<br> 01425 * 01426 * const uint8_t SOFT_SPI_MISO_PIN = 16; 01427 * const uint8_t SOFT_SPI_MOSI_PIN = 15; 01428 * const uint8_t SOFT_SPI_SCK_PIN = 14; 01429 * 01430 * <br> 01431 * **Alternate Hardware (UART) Driven SPI** 01432 * 01433 * The Serial Port (UART) on Arduino can also function in SPI mode, and can double-buffer data, while the 01434 * default SPI hardware cannot. 01435 * 01436 * The SPI_UART library is available at https://github.com/TMRh20/Sketches/tree/master/SPI_UART 01437 * 01438 * Enabling: 01439 * 1. Install the SPI_UART library 01440 * 2. Edit RF24_config.h and uncomment #define SPI_UART 01441 * 3. In your sketch, add @code #include <SPI_UART.h> @endcode 01442 * 01443 * SPI_UART SPI Pin Connections: 01444 * | NRF |Arduino Uno Pin| 01445 * |-----|---------------| 01446 * | MOSI| TX(0) | 01447 * | MISO| RX(1) | 01448 * | SCK | XCK(4) | 01449 * | CE | User Specified| 01450 * | CSN | User Specified| 01451 * 01452 * 01453 * @note SPI_UART on Mega boards requires soldering to an unused pin on the chip. <br>See 01454 * https://github.com/TMRh20/RF24/issues/24 for more information on SPI_UART. 01455 * 01456 * @page ATTiny ATTiny 01457 * 01458 * ATTiny support is built into the library, so users are not required to include SPI.h in their sketches<br> 01459 * See the included rf24ping85 example for pin info and usage 01460 * 01461 * Some versions of Arduino IDE may require a patch to allow use of the full program space on ATTiny<br> 01462 * See https://github.com/TCWORLD/ATTinyCore/tree/master/PCREL%20Patch%20for%20GCC for ATTiny patch 01463 * 01464 * ATTiny board support initially added from https://github.com/jscrane/RF24 01465 * 01466 * @section Hardware Hardware Configuration 01467 * By tong67 ( https://github.com/tong67 ) 01468 * 01469 * **ATtiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 4** 01470 * @code 01471 * +-\/-+ 01472 * NC PB5 1|o |8 Vcc --- nRF24L01 VCC, pin2 --- LED --- 5V 01473 * nRF24L01 CE, pin3 --- PB3 2| |7 PB2 --- nRF24L01 SCK, pin5 01474 * nRF24L01 CSN, pin4 --- PB4 3| |6 PB1 --- nRF24L01 MOSI, pin6 01475 * nRF24L01 GND, pin1 --- GND 4| |5 PB0 --- nRF24L01 MISO, pin7 01476 * +----+ 01477 * @endcode 01478 * 01479 * <br> 01480 * **ATtiny25/45/85 Pin map with CE_PIN 3 and CSN_PIN 3** => PB3 and PB4 are free to use for application <br> 01481 * Circuit idea from http://nerdralph.blogspot.ca/2014/01/nrf24l01-control-with-3-attiny85-pins.html <br> 01482 * Original RC combination was 1K/100nF. 22K/10nF combination worked better. <br> 01483 * For best settletime delay value in RF24::csn() the timingSearch3pin.ino sketch can be used. <br> 01484 * This configuration is enabled when CE_PIN and CSN_PIN are equal, e.g. both 3 <br> 01485 * Because CE is always high the power consumption is higher than for 5 pins solution <br> 01486 * @code 01487 * ^^ 01488 * +-\/-+ nRF24L01 CE, pin3 ------| // 01489 * PB5 1|o |8 Vcc --- nRF24L01 VCC, pin2 ------x----------x--|<|-- 5V 01490 * NC PB3 2| |7 PB2 --- nRF24L01 SCK, pin5 --|<|---x-[22k]--| LED 01491 * NC PB4 3| |6 PB1 --- nRF24L01 MOSI, pin6 1n4148 | 01492 * nRF24L01 GND, pin1 -x- GND 4| |5 PB0 --- nRF24L01 MISO, pin7 | 01493 * | +----+ | 01494 * |-----------------------------------------------||----x-- nRF24L01 CSN, pin4 01495 * 10nF 01496 * @endcode 01497 * 01498 * <br> 01499 * **ATtiny24/44/84 Pin map with CE_PIN 8 and CSN_PIN 7** <br> 01500 * Schematic provided and successfully tested by Carmine Pastore (https://github.com/Carminepz) <br> 01501 * @code 01502 * +-\/-+ 01503 * nRF24L01 VCC, pin2 --- VCC 1|o |14 GND --- nRF24L01 GND, pin1 01504 * PB0 2| |13 AREF 01505 * PB1 3| |12 PA1 01506 * PB3 4| |11 PA2 --- nRF24L01 CE, pin3 01507 * PB2 5| |10 PA3 --- nRF24L01 CSN, pin4 01508 * PA7 6| |9 PA4 --- nRF24L01 SCK, pin5 01509 * nRF24L01 MISO, pin7 --- PA6 7| |8 PA5 --- nRF24L01 MOSI, pin6 01510 * +----+ 01511 * @endcode 01512 * 01513 * <br> 01514 * **ATtiny2313/4313 Pin map with CE_PIN 12 and CSN_PIN 13** <br> 01515 * @code 01516 * +-\/-+ 01517 * PA2 1|o |20 VCC --- nRF24L01 VCC, pin2 01518 * PD0 2| |19 PB7 --- nRF24L01 SCK, pin5 01519 * PD1 3| |18 PB6 --- nRF24L01 MOSI, pin6 01520 * PA1 4| |17 PB5 --- nRF24L01 MISO, pin7 01521 * PA0 5| |16 PB4 --- nRF24L01 CSN, pin4 01522 * PD2 6| |15 PB3 --- nRF24L01 CE, pin3 01523 * PD3 7| |14 PB2 01524 * PD4 8| |13 PB1 01525 * PD5 9| |12 PB0 01526 * nRF24L01 GND, pin1 --- GND 10| |11 PD6 01527 * +----+ 01528 * @endcode 01529 * 01530 * <br><br><br> 01531 * 01532 * 01533 * 01534 * 01535 * 01536 * 01537 * @page BBB BeagleBone Black 01538 * 01539 * BeagleBone Black is supported via MRAA or SPIDEV. 01540 * 01541 * @note The SPIDEV option should work with most Linux systems supporting SPIDEV. <br> 01542 * Users may need to edit the RF24/utility/BBB/spi.cpp file to configure the spi device. (Defaults: "/dev/spidev1.0"; or "/dev/spidev1.1"; ) 01543 * 01544 * <br> 01545 * @section AutoInstall Automated Install 01546 *(**Designed & Tested on RPi** - Defaults to SPIDEV on BBB) 01547 * 01548 * 01549 * 1. Download the install.sh file from http://tmrh20.github.io/RF24Installer/RPi/install.sh 01550 * @code wget http://tmrh20.github.io/RF24Installer/RPi/install.sh @endcode 01551 * 2. Make it executable: 01552 * @code chmod +x install.sh @endcode 01553 * 3. Run it and choose your options 01554 * @code ./install.sh @endcode 01555 * 4. Run an example from one of the libraries 01556 * @code 01557 * cd rf24libs/RF24/examples_RPi 01558 * @endcode 01559 * Edit the gettingstarted example, to set your pin configuration 01560 * @code nano gettingstarted.cpp 01561 * make 01562 * sudo ./gettingstarted 01563 * @endcode 01564 * 01565 * <br> 01566 * @section ManInstall Manual Install 01567 * 1. Make a directory to contain the RF24 and possibly RF24Network lib and enter it: 01568 * @code 01569 * mkdir ~/rf24libs 01570 * cd ~/rf24libs 01571 * @endcode 01572 * 2. Clone the RF24 repo: 01573 * @code git clone https://github.com/tmrh20/RF24.git RF24 @endcode 01574 * 3. Change to the new RF24 directory 01575 * @code cd RF24 @endcode 01576 * 4. Build the library, and run an example file: 01577 * **Note:** See the <a href="http://iotdk.intel.com/docs/master/mraa/index.html">MRAA </a> documentation for more info on installing MRAA 01578 * @code sudo make install OR sudo make install RF24_MRAA=1 @endcode 01579 * @code 01580 * cd examples_RPi 01581 * @endcode 01582 * Edit the gettingstarted example, to set your pin configuration 01583 * @code nano gettingstarted.cpp 01584 * make 01585 * sudo ./gettingstarted 01586 * @endcode 01587 * 01588 * <br><br> 01589 * 01590 * @page MRAA MRAA 01591 * 01592 * MRAA is a Low Level Skeleton Library for Communication on GNU/Linux platforms <br> 01593 * See http://iotdk.intel.com/docs/master/mraa/index.html for more information 01594 * 01595 * RF24 supports all MRAA supported platforms, but might not be tested on each individual platform due to the wide range of hardware support:<br> 01596 * <a href="https://github.com/TMRh20/RF24/issues">Report an RF24 bug or issue </a> 01597 * 01598 * @section Setup Setup 01599 * 1. Install the MRAA lib 01600 * 2. As per your device, SPI may need to be enabled 01601 * 01602 * @section MRAA_Install Install 01603 * 01604 * 1. Make a directory to contain the RF24 and possibly RF24Network lib and enter it: 01605 * @code 01606 * mkdir ~/rf24libs 01607 * cd ~/rf24libs 01608 * @endcode 01609 * 2. Clone the RF24 repo: 01610 * @code git clone https://github.com/tmrh20/RF24.git RF24 @endcode 01611 * 3. Change to the new RF24 directory 01612 * @code cd RF24 @endcode 01613 * 4. Build the library: 01614 * @code sudo make install -B RF24_MRAA=1 @endcode 01615 * 5. Configure the correct pins in gettingstarted.cpp (See http://iotdk.intel.com/docs/master/mraa/index.html ) 01616 * @code 01617 * cd examples_RPi 01618 * nano gettingstarted.cpp 01619 * @endcode 01620 * 6. Build an example 01621 * @code 01622 * make 01623 * sudo ./gettingstarted 01624 * @endcode 01625 * 01626 * <br><br><br> 01627 * 01628 * 01629 * 01630 * 01631 * @page RPi Raspberry Pi 01632 * 01633 * RF24 supports a variety of Linux based devices via various drivers. Some boards like RPi can utilize multiple methods 01634 * to drive the GPIO and SPI functionality. 01635 * 01636 * <br> 01637 * @section PreConfig Potential PreConfiguration 01638 * 01639 * If SPI is not already enabled, load it on boot: 01640 * @code sudo raspi-config @endcode 01641 * A. Update the tool via the menu as required<br> 01642 * B. Select **Advanced** and **enable the SPI kernel module** <br> 01643 * C. Update other software and libraries: 01644 * @code sudo apt-get update @endcode 01645 * @code sudo apt-get upgrade @endcode 01646 * <br> 01647 * @section AutoInstall Automated Install 01648 * 01649 * 1. Download the install.sh file from http://tmrh20.github.io/RF24Installer/RPi/install.sh 01650 * @code wget http://tmrh20.github.io/RF24Installer/RPi/install.sh @endcode 01651 * 2. Make it executable: 01652 * @code chmod +x install.sh @endcode 01653 * 3. Run it and choose your options 01654 * @code ./install.sh @endcode 01655 * 4. Run an example from one of the libraries 01656 * @code 01657 * cd rf24libs/RF24/examples_RPi 01658 * make 01659 * sudo ./gettingstarted 01660 * @endcode 01661 * <br><br> 01662 * @section ManInstall Manual Install 01663 * 1. Make a directory to contain the RF24 and possibly RF24Network lib and enter it: 01664 * @code 01665 * mkdir ~/rf24libs 01666 * cd ~/rf24libs 01667 * @endcode 01668 * 2. Clone the RF24 repo: 01669 * @code git clone https://github.com/tmrh20/RF24.git RF24 @endcode 01670 * 3. Change to the new RF24 directory 01671 * @code cd RF24 @endcode 01672 * 4. Build the library, and run an example file: 01673 * @code sudo make install 01674 * cd examples_RPi 01675 * make 01676 * sudo ./gettingstarted 01677 * @endcode 01678 * 01679 * <br><br> 01680 * @section Build Build Options 01681 * The default build on Raspberry Pi utilizes the included **BCM2835** driver from http://www.airspayce.com/mikem/bcm2835 01682 * 1. @code sudo make install -B @endcode 01683 * 01684 * Build using the **MRAA** library from http://iotdk.intel.com/docs/master/mraa/index.html <br> 01685 * MRAA is not included. See the <a href="MRAA.html">MRAA</a> platform page for more information. 01686 * 01687 * 1. Install, and build MRAA: 01688 * @code 01689 * git clone https://github.com/intel-iot-devkit/mraa.git 01690 * cd mraa 01691 * mkdir build 01692 * cd build 01693 * cmake .. -DBUILDSWIGNODE=OFF 01694 * sudo make install 01695 * @endcode 01696 * 01697 * 2. Complete the install <br> 01698 * @code nano /etc/ld.so.conf @endcode 01699 * Add the line @code /usr/local/lib/arm-linux-gnueabihf @endcode 01700 * Run @code sudo ldconfig @endcode 01701 * 01702 * 3. Install RF24, using MRAA 01703 * @code sudo make install -B RF24_MRAA=1 @endcode 01704 * See the gettingstarted example for an example of pin configuration 01705 * 01706 * Build using **spidev**: 01707 * 01708 * 1. Edit the RF24/utility/BBB/spi.cpp file 01709 * 2. Change the default device definition to @code this->device = "/dev/spidev0.0";; @endcode 01710 * 3. Run @code sudo make install -B RF24_SPIDEV=1 @endcode 01711 * 4. See the gettingstarted example for an example of pin configuration 01712 * 01713 * <br> 01714 * @section Pins Connections and Pin Configuration 01715 * 01716 * 01717 * Using pin 15/GPIO 22 for CE, pin 24/GPIO8 (CE0) for CSN 01718 * 01719 * Can use either RPi CE0 or CE1 pins for radio CSN.<br> 01720 * Choose any RPi output pin for radio CE pin. 01721 * 01722 * **BCM2835 Constructor:** 01723 * @code 01724 * RF24 radio(RPI_V2_GPIO_P1_15,BCM2835_SPI_CS0, BCM2835_SPI_SPEED_8MHZ); 01725 * or 01726 * RF24 radio(RPI_V2_GPIO_P1_15,BCM2835_SPI_CS1, BCM2835_SPI_SPEED_8MHZ); 01727 * 01728 * RPi B+: 01729 * RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ); 01730 * or 01731 * RF24 radio(RPI_BPLUS_GPIO_J8_15,RPI_BPLUS_GPIO_J8_26, BCM2835_SPI_SPEED_8MHZ); 01732 * 01733 * General: 01734 * RF24 radio(22,0); 01735 * or 01736 * RF24 radio(22,1); 01737 * 01738 * @endcode 01739 * See the gettingstarted example for an example of pin configuration 01740 * 01741 * See http://www.airspayce.com/mikem/bcm2835/index.html for BCM2835 class documentation. 01742 * <br><br> 01743 * **MRAA Constructor:** 01744 * 01745 * @code RF24 radio(15,0); @endcode 01746 * 01747 * See http://iotdk.intel.com/docs/master/mraa/rasppi.html 01748 * <br><br> 01749 * **SPI_DEV Constructor** 01750 * 01751 * @code RF24 radio(22,0); @endcode 01752 * 01753 * See http://pi.gadgetoid.com/pinout 01754 * 01755 * **Pins:** 01756 * 01757 * | PIN | NRF24L01 | RPI | RPi -P1 Connector | 01758 * |-----|----------|------------|-------------------| 01759 * | 1 | GND | rpi-gnd | (25) | 01760 * | 2 | VCC | rpi-3v3 | (17) | 01761 * | 3 | CE | rpi-gpio22 | (15) | 01762 * | 4 | CSN | rpi-gpio8 | (24) | 01763 * | 5 | SCK | rpi-sckl | (23) | 01764 * | 6 | MOSI | rpi-mosi | (19) | 01765 * | 7 | MISO | rpi-miso | (21) | 01766 * | 8 | IRQ | - | - | 01767 * 01768 * 01769 * 01770 * 01771 * <br><br> 01772 **************** 01773 * 01774 * Based on the arduino lib from J. Coliz <maniacbug@ymail.com> <br> 01775 * the library was berryfied by Purinda Gunasekara <purinda@gmail.com> <br> 01776 * then forked from github stanleyseow/RF24 to https://github.com/jscrane/RF24-rpi <br> 01777 * Network lib also based on https://github.com/farconada/RF24Network 01778 * 01779 * 01780 * 01781 * 01782 * <br><br><br> 01783 * 01784 * 01785 * 01786 * @page Python Python Wrapper (by https://github.com/mz-fuzzy) 01787 * 01788 * @section Install Installation: 01789 * 01790 * Install the boost libraries: (Note: Only the python libraries should be needed, this is just for simplicity) 01791 * 01792 * @code sudo apt-get install libboost1.50-all @endcode 01793 * 01794 * Build the library: 01795 * 01796 * @code ./setup.py build @endcode 01797 * 01798 * Install the library 01799 * 01800 * @code sudo ./setup.py install @endcode 01801 * 01802 * 01803 * See the additional <a href="pages.html">Platform Support</a> pages for information on connecting your hardware <br> 01804 * See the included <a href="pingpair_dyn_8py-example.html">example </a> for usage information. 01805 * 01806 * Running the Example: 01807 * 01808 * Edit the pingpair_dyn.py example to configure the appropriate pins per the above documentation: 01809 * 01810 * @code nano pingpair_dyn.py @endcode 01811 * 01812 * Configure another device, Arduino or RPi with the <a href="pingpair_dyn_8py-example.html">pingpair_dyn</a> example 01813 * 01814 * Run the example 01815 * 01816 * @code sudo ./pingpair_dyn.py @endcode 01817 * 01818 * <br><br><br> 01819 * 01820 * 01821 * @page Portability RF24 Portability 01822 * 01823 * The RF24 radio driver mainly utilizes the <a href="http://arduino.cc/en/reference/homePage">Arduino API</a> for GPIO, SPI, and timing functions, which are easily replicated 01824 * on various platforms. <br>Support files for these platforms are stored under RF24/utility, and can be modified to provide 01825 * the required functionality. 01826 * 01827 * <br> 01828 * @section Hardware_Templates Basic Hardware Template 01829 * 01830 * **RF24/utility** 01831 * 01832 * The RF24 library now includes a basic hardware template to assist in porting to various platforms. <br> The following files can be included 01833 * to replicate standard Arduino functions as needed, allowing devices from ATTiny to Raspberry Pi to utilize the same core RF24 driver. 01834 * 01835 * | File | Purpose | 01836 * |--------------------|------------------------------------------------------------------------------| 01837 * | RF24_arch_config.h | Basic Arduino/AVR compatibility, includes for remaining support files, etc | 01838 * | includes.h | Linux only. Defines specific platform, include correct RF24_arch_config file | 01839 * | spi.h | Provides standardized SPI ( transfer() ) methods | 01840 * | gpio.h | Provides standardized GPIO ( digitalWrite() ) methods | 01841 * | compatibility.h | Provides standardized timing (millis(), delay()) methods | 01842 * | your_custom_file.h | Provides access to custom drivers for spi,gpio, etc | 01843 * 01844 * <br> 01845 * Examples are provided via the included hardware support templates in **RF24/utility** <br> 01846 * See the <a href="modules.html">modules</a> page for examples of class declarations 01847 * 01848 *<br> 01849 * @section Device_Detection Device Detection 01850 * 01851 * 1. The main detection for Linux devices is done in the Makefile, with the includes.h from the proper hardware directory copied to RF24/utility/includes.h <br> 01852 * 2. Secondary detection is completed in RF24_config.h, causing the include.h file to be included for all supported Linux devices <br> 01853 * 3. RF24.h contains the declaration for SPI and GPIO objects 'spi' and 'gpio' to be used for porting-in related functions. 01854 * 01855 * <br> 01856 * @section Ported_Code Code 01857 * To have your ported code included in this library, or for assistance in porting, create a pull request or open an issue at https://github.com/TMRh20/RF24 01858 * 01859 * 01860 *<br><br><br> 01861 */ 01862 01863 #endif // __RF24_H__ 01864
Generated on Sat Dec 3 2022 08:21:58 by
1.7.2