For robots and stuff

Dependents:   Base Station

Committer:
jjones646
Date:
Wed Dec 31 22:16:01 2014 +0000
Revision:
2:c42a035d71ed
Parent:
1:05a48c038381
adding dummy cc1101 support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jjones646 0:c5afea7b9057 1 /*
jjones646 0:c5afea7b9057 2 Copyright (c) 2007 Stefan Engelke <mbox@stefanengelke.de>
jjones646 0:c5afea7b9057 3
jjones646 0:c5afea7b9057 4 Permission is hereby granted, free of charge, to any person
jjones646 0:c5afea7b9057 5 obtaining a copy of this software and associated documentation
jjones646 0:c5afea7b9057 6 files (the "Software"), to deal in the Software without
jjones646 0:c5afea7b9057 7 restriction, including without limitation the rights to use, copy,
jjones646 0:c5afea7b9057 8 modify, merge, publish, distribute, sublicense, and/or sell copies
jjones646 0:c5afea7b9057 9 of the Software, and to permit persons to whom the Software is
jjones646 0:c5afea7b9057 10 furnished to do so, subject to the following conditions:
jjones646 0:c5afea7b9057 11
jjones646 0:c5afea7b9057 12 The above copyright notice and this permission notice shall be
jjones646 0:c5afea7b9057 13 included in all copies or substantial portions of the Software.
jjones646 0:c5afea7b9057 14
jjones646 0:c5afea7b9057 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
jjones646 0:c5afea7b9057 16 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
jjones646 0:c5afea7b9057 17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
jjones646 0:c5afea7b9057 18 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
jjones646 0:c5afea7b9057 19 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
jjones646 0:c5afea7b9057 20 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jjones646 0:c5afea7b9057 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
jjones646 0:c5afea7b9057 22 DEALINGS IN THE SOFTWARE.
jjones646 0:c5afea7b9057 23 */
jjones646 0:c5afea7b9057 24
jjones646 0:c5afea7b9057 25 /* Memory Map */
jjones646 0:c5afea7b9057 26 #define CONFIG 0x00
jjones646 0:c5afea7b9057 27 #define EN_AA 0x01
jjones646 0:c5afea7b9057 28 #define EN_RXADDR 0x02
jjones646 0:c5afea7b9057 29 #define SETUP_AW 0x03
jjones646 0:c5afea7b9057 30 #define SETUP_RETR 0x04
jjones646 0:c5afea7b9057 31 #define RF_CH 0x05
jjones646 0:c5afea7b9057 32 #define RF_SETUP 0x06
jjones646 0:c5afea7b9057 33 #define STATUS 0x07
jjones646 0:c5afea7b9057 34 #define OBSERVE_TX 0x08
jjones646 0:c5afea7b9057 35 #define CD 0x09
jjones646 0:c5afea7b9057 36 #define RX_ADDR_P0 0x0A
jjones646 0:c5afea7b9057 37 #define RX_ADDR_P1 0x0B
jjones646 0:c5afea7b9057 38 #define RX_ADDR_P2 0x0C
jjones646 0:c5afea7b9057 39 #define RX_ADDR_P3 0x0D
jjones646 0:c5afea7b9057 40 #define RX_ADDR_P4 0x0E
jjones646 0:c5afea7b9057 41 #define RX_ADDR_P5 0x0F
jjones646 0:c5afea7b9057 42 #define TX_ADDR 0x10
jjones646 0:c5afea7b9057 43 #define RX_PW_P0 0x11
jjones646 0:c5afea7b9057 44 #define RX_PW_P1 0x12
jjones646 0:c5afea7b9057 45 #define RX_PW_P2 0x13
jjones646 0:c5afea7b9057 46 #define RX_PW_P3 0x14
jjones646 0:c5afea7b9057 47 #define RX_PW_P4 0x15
jjones646 0:c5afea7b9057 48 #define RX_PW_P5 0x16
jjones646 0:c5afea7b9057 49 #define FIFO_STATUS 0x17
jjones646 0:c5afea7b9057 50 #define DYNPD 0x1C
jjones646 0:c5afea7b9057 51 #define FEATURE 0x1D
jjones646 0:c5afea7b9057 52
jjones646 0:c5afea7b9057 53 /* Bit Mnemonics */
jjones646 0:c5afea7b9057 54 #define MASK_RX_DR 6
jjones646 0:c5afea7b9057 55 #define MASK_TX_DS 5
jjones646 0:c5afea7b9057 56 #define MASK_MAX_RT 4
jjones646 0:c5afea7b9057 57 #define EN_CRC 3
jjones646 0:c5afea7b9057 58 #define CRCO 2
jjones646 0:c5afea7b9057 59 #define PWR_UP 1
jjones646 0:c5afea7b9057 60 #define PRIM_RX 0
jjones646 0:c5afea7b9057 61 #define ENAA_P5 5
jjones646 0:c5afea7b9057 62 #define ENAA_P4 4
jjones646 0:c5afea7b9057 63 #define ENAA_P3 3
jjones646 0:c5afea7b9057 64 #define ENAA_P2 2
jjones646 0:c5afea7b9057 65 #define ENAA_P1 1
jjones646 0:c5afea7b9057 66 #define ENAA_P0 0
jjones646 0:c5afea7b9057 67 #define ERX_P5 5
jjones646 0:c5afea7b9057 68 #define ERX_P4 4
jjones646 0:c5afea7b9057 69 #define ERX_P3 3
jjones646 0:c5afea7b9057 70 #define ERX_P2 2
jjones646 0:c5afea7b9057 71 #define ERX_P1 1
jjones646 0:c5afea7b9057 72 #define ERX_P0 0
jjones646 0:c5afea7b9057 73 #define AW 0
jjones646 0:c5afea7b9057 74 #define ARD 4
jjones646 0:c5afea7b9057 75 #define ARC 0
jjones646 0:c5afea7b9057 76 #define PLL_LOCK 4
jjones646 0:c5afea7b9057 77 #define RF_DR 3
jjones646 0:c5afea7b9057 78 #define RF_PWR 6
jjones646 0:c5afea7b9057 79 #define RX_DR 6
jjones646 0:c5afea7b9057 80 #define TX_DS 5
jjones646 0:c5afea7b9057 81 #define MAX_RT 4
jjones646 0:c5afea7b9057 82 #define RX_P_NO 1
jjones646 0:c5afea7b9057 83 #define TX_FULL 0
jjones646 0:c5afea7b9057 84 #define PLOS_CNT 4
jjones646 0:c5afea7b9057 85 #define ARC_CNT 0
jjones646 0:c5afea7b9057 86 #define TX_REUSE 6
jjones646 0:c5afea7b9057 87 #define FIFO_FULL 5
jjones646 0:c5afea7b9057 88 #define TX_EMPTY 4
jjones646 0:c5afea7b9057 89 #define RX_FULL 1
jjones646 0:c5afea7b9057 90 #define RX_EMPTY 0
jjones646 0:c5afea7b9057 91 #define DPL_P5 5
jjones646 0:c5afea7b9057 92 #define DPL_P4 4
jjones646 0:c5afea7b9057 93 #define DPL_P3 3
jjones646 0:c5afea7b9057 94 #define DPL_P2 2
jjones646 0:c5afea7b9057 95 #define DPL_P1 1
jjones646 0:c5afea7b9057 96 #define DPL_P0 0
jjones646 0:c5afea7b9057 97 #define EN_DPL 2
jjones646 0:c5afea7b9057 98 #define EN_ACK_PAY 1
jjones646 0:c5afea7b9057 99 #define EN_DYN_ACK 0
jjones646 0:c5afea7b9057 100
jjones646 0:c5afea7b9057 101 /* Instruction Mnemonics */
jjones646 0:c5afea7b9057 102 #define R_REGISTER 0x00
jjones646 0:c5afea7b9057 103 #define W_REGISTER 0x20
jjones646 0:c5afea7b9057 104 #define REGISTER_MASK 0x1F
jjones646 0:c5afea7b9057 105 #define ACTIVATE 0x50
jjones646 0:c5afea7b9057 106 #define R_RX_PL_WID 0x60
jjones646 0:c5afea7b9057 107 #define R_RX_PAYLOAD 0x61
jjones646 0:c5afea7b9057 108 #define W_TX_PAYLOAD 0xA0
jjones646 0:c5afea7b9057 109 #define W_ACK_PAYLOAD 0xA8
jjones646 0:c5afea7b9057 110 #define FLUSH_TX 0xE1
jjones646 0:c5afea7b9057 111 #define FLUSH_RX 0xE2
jjones646 0:c5afea7b9057 112 #define REUSE_TX_PL 0xE3
jjones646 0:c5afea7b9057 113 #define NOP 0xFF
jjones646 0:c5afea7b9057 114
jjones646 0:c5afea7b9057 115 /* Non-P omissions */
jjones646 0:c5afea7b9057 116 #define LNA_HCURR 0
jjones646 0:c5afea7b9057 117
jjones646 0:c5afea7b9057 118 /* P model memory Map */
jjones646 0:c5afea7b9057 119 #define RPD 0x09
jjones646 0:c5afea7b9057 120
jjones646 0:c5afea7b9057 121 /* P model bit Mnemonics */
jjones646 0:c5afea7b9057 122 #define RF_DR_LOW 5
jjones646 0:c5afea7b9057 123 #define RF_DR_HIGH 3
jjones646 0:c5afea7b9057 124 #define RF_PWR_LOW 1
jjones646 0:c5afea7b9057 125 #define RF_PWR_HIGH 2
jjones646 0:c5afea7b9057 126
jjones646 0:c5afea7b9057 127 #define HIGH 1
jjones646 0:c5afea7b9057 128 #define LOW 0
jjones646 0:c5afea7b9057 129 #define _BV(n) (1 << n)
jjones646 0:c5afea7b9057 130
jjones646 0:c5afea7b9057 131 /*
jjones646 0:c5afea7b9057 132 Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>
jjones646 0:c5afea7b9057 133
jjones646 0:c5afea7b9057 134 This program is free software; you can redistribute it and/or
jjones646 0:c5afea7b9057 135 modify it under the terms of the GNU General Public License
jjones646 0:c5afea7b9057 136 version 2 as published by the Free Software Foundation.
jjones646 0:c5afea7b9057 137 */
jjones646 0:c5afea7b9057 138
jjones646 0:c5afea7b9057 139 /**
jjones646 0:c5afea7b9057 140 * @file RF24.h
jjones646 0:c5afea7b9057 141 *
jjones646 0:c5afea7b9057 142 * Class declaration for RF24 and helper enums
jjones646 0:c5afea7b9057 143 */
jjones646 0:c5afea7b9057 144
jjones646 0:c5afea7b9057 145 #ifndef __RF24_H__
jjones646 0:c5afea7b9057 146 #define __RF24_H__
jjones646 0:c5afea7b9057 147
jjones646 0:c5afea7b9057 148 #include <mbed.h>
jjones646 0:c5afea7b9057 149
jjones646 0:c5afea7b9057 150 /**
jjones646 0:c5afea7b9057 151 * Power Amplifier level.
jjones646 0:c5afea7b9057 152 *
jjones646 0:c5afea7b9057 153 * For use with setPALevel()
jjones646 0:c5afea7b9057 154 */
jjones646 0:c5afea7b9057 155 typedef enum { RF24_PA_MIN = 0,RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX, RF24_PA_ERROR } rf24_pa_dbm_e ;
jjones646 0:c5afea7b9057 156
jjones646 0:c5afea7b9057 157 /**
jjones646 0:c5afea7b9057 158 * Data rate. How fast data moves through the air.
jjones646 0:c5afea7b9057 159 *
jjones646 0:c5afea7b9057 160 * For use with setDataRate()
jjones646 0:c5afea7b9057 161 */
jjones646 0:c5afea7b9057 162 typedef enum { RF24_1MBPS = 0, RF24_2MBPS, RF24_250KBPS } rf24_datarate_e;
jjones646 0:c5afea7b9057 163
jjones646 0:c5afea7b9057 164 /**
jjones646 0:c5afea7b9057 165 * CRC Length. How big (if any) of a CRC is included.
jjones646 0:c5afea7b9057 166 *
jjones646 0:c5afea7b9057 167 * For use with setCRCLength()
jjones646 0:c5afea7b9057 168 */
jjones646 0:c5afea7b9057 169 typedef enum { RF24_CRC_DISABLED = 0, RF24_CRC_8, RF24_CRC_16 } rf24_crclength_e;
jjones646 0:c5afea7b9057 170
jjones646 0:c5afea7b9057 171 /**
jjones646 0:c5afea7b9057 172 * Driver for nRF24L01(+) 2.4GHz Wireless Transceiver
jjones646 0:c5afea7b9057 173 */
jjones646 0:c5afea7b9057 174
jjones646 0:c5afea7b9057 175 class RF24
jjones646 0:c5afea7b9057 176 {
jjones646 0:c5afea7b9057 177 private:
jjones646 0:c5afea7b9057 178 DigitalOut ce_pin; /**< "Chip Enable" pin, activates the RX or TX role */
jjones646 0:c5afea7b9057 179 DigitalOut csn_pin; /**< SPI Chip select */
jjones646 0:c5afea7b9057 180 bool wide_band; /* 2Mbs data rate in use? */
jjones646 0:c5afea7b9057 181 bool p_variant; /* False for RF24L01 and true for RF24L01P */
jjones646 0:c5afea7b9057 182 uint8_t payload_size; /**< Fixed size of payloads */
jjones646 0:c5afea7b9057 183 bool ack_payload_available; /**< Whether there is an ack payload waiting */
jjones646 0:c5afea7b9057 184 bool dynamic_payloads_enabled; /**< Whether dynamic payloads are enabled. */
jjones646 0:c5afea7b9057 185 uint8_t ack_payload_length; /**< Dynamic size of pending ack payload. */
jjones646 0:c5afea7b9057 186 uint64_t pipe0_reading_address; /**< Last address set on pipe 0 for reading. */
jjones646 0:c5afea7b9057 187 SPI spi;
jjones646 0:c5afea7b9057 188 Timer mainTimer;
jjones646 0:c5afea7b9057 189
jjones646 0:c5afea7b9057 190 protected:
jjones646 0:c5afea7b9057 191 /**
jjones646 0:c5afea7b9057 192 * @name Low-level internal interface.
jjones646 0:c5afea7b9057 193 *
jjones646 0:c5afea7b9057 194 * Protected methods that address the chip directly. Regular users cannot
jjones646 0:c5afea7b9057 195 * ever call these. They are documented for completeness and for developers who
jjones646 0:c5afea7b9057 196 * may want to extend this class.
jjones646 0:c5afea7b9057 197 */
jjones646 0:c5afea7b9057 198 /**@{*/
jjones646 0:c5afea7b9057 199
jjones646 0:c5afea7b9057 200 /**
jjones646 0:c5afea7b9057 201 * Set chip select pin
jjones646 0:c5afea7b9057 202 *
jjones646 0:c5afea7b9057 203 * Running SPI bus at PI_CLOCK_DIV2 so we don't waste time transferring data
jjones646 0:c5afea7b9057 204 * and best of all, we make use of the radio's FIFO buffers. A lower speed
jjones646 0:c5afea7b9057 205 * means we're less likely to effectively leverage our FIFOs and pay a higher
jjones646 0:c5afea7b9057 206 * AVR runtime cost as toll.
jjones646 0:c5afea7b9057 207 *
jjones646 0:c5afea7b9057 208 * @param mode HIGH to take this unit off the SPI bus, LOW to put it on
jjones646 0:c5afea7b9057 209 */
jjones646 0:c5afea7b9057 210 void csn(int mode);
jjones646 0:c5afea7b9057 211
jjones646 0:c5afea7b9057 212 /**
jjones646 0:c5afea7b9057 213 * Set chip enable
jjones646 0:c5afea7b9057 214 *
jjones646 0:c5afea7b9057 215 * @param level HIGH to actively begin transmission or LOW to put in standby. Please see data sheet
jjones646 0:c5afea7b9057 216 * for a much more detailed description of this pin.
jjones646 0:c5afea7b9057 217 */
jjones646 0:c5afea7b9057 218 void ce(int level);
jjones646 0:c5afea7b9057 219
jjones646 0:c5afea7b9057 220
jjones646 0:c5afea7b9057 221 /**
jjones646 0:c5afea7b9057 222 * Read a chunk of data in from a register
jjones646 0:c5afea7b9057 223 *
jjones646 0:c5afea7b9057 224 * @param reg Which register. Use constants from nRF24L01.h
jjones646 0:c5afea7b9057 225 * @param buf Where to put the data
jjones646 0:c5afea7b9057 226 * @param len How many bytes of data to transfer
jjones646 0:c5afea7b9057 227 * @return Current value of status register
jjones646 0:c5afea7b9057 228 */
jjones646 0:c5afea7b9057 229 uint8_t read_register(uint8_t reg, uint8_t* buf, uint8_t len);
jjones646 0:c5afea7b9057 230
jjones646 0:c5afea7b9057 231 /**
jjones646 0:c5afea7b9057 232 * Read single byte from a register
jjones646 0:c5afea7b9057 233 *
jjones646 0:c5afea7b9057 234 * @param reg Which register. Use constants from nRF24L01.h
jjones646 0:c5afea7b9057 235 * @return Current value of register @p reg
jjones646 0:c5afea7b9057 236 */
jjones646 0:c5afea7b9057 237 uint8_t read_register(uint8_t reg);
jjones646 0:c5afea7b9057 238
jjones646 0:c5afea7b9057 239 /**
jjones646 0:c5afea7b9057 240 * Write a chunk of data to a register
jjones646 0:c5afea7b9057 241 *
jjones646 0:c5afea7b9057 242 * @param reg Which register. Use constants from nRF24L01.h
jjones646 0:c5afea7b9057 243 * @param buf Where to get the data
jjones646 0:c5afea7b9057 244 * @param len How many bytes of data to transfer
jjones646 0:c5afea7b9057 245 * @return Current value of status register
jjones646 0:c5afea7b9057 246 */
jjones646 0:c5afea7b9057 247 uint8_t write_register(uint8_t reg, const uint8_t* buf, uint8_t len);
jjones646 0:c5afea7b9057 248
jjones646 0:c5afea7b9057 249 /**
jjones646 0:c5afea7b9057 250 * Write a single byte to a register
jjones646 0:c5afea7b9057 251 *
jjones646 0:c5afea7b9057 252 * @param reg Which register. Use constants from nRF24L01.h
jjones646 0:c5afea7b9057 253 * @param value The new value to write
jjones646 0:c5afea7b9057 254 * @return Current value of status register
jjones646 0:c5afea7b9057 255 */
jjones646 0:c5afea7b9057 256 uint8_t write_register(uint8_t reg, uint8_t value);
jjones646 0:c5afea7b9057 257
jjones646 0:c5afea7b9057 258 /**
jjones646 0:c5afea7b9057 259 * Write the transmit payload
jjones646 0:c5afea7b9057 260 *
jjones646 0:c5afea7b9057 261 * The size of data written is the fixed payload size, see getPayloadSize()
jjones646 0:c5afea7b9057 262 *
jjones646 0:c5afea7b9057 263 * @param buf Where to get the data
jjones646 0:c5afea7b9057 264 * @param len Number of bytes to be sent
jjones646 0:c5afea7b9057 265 * @return Current value of status register
jjones646 0:c5afea7b9057 266 */
jjones646 0:c5afea7b9057 267 uint8_t write_payload(const void* buf, uint8_t len);
jjones646 0:c5afea7b9057 268
jjones646 0:c5afea7b9057 269 /**
jjones646 0:c5afea7b9057 270 * Read the receive payload
jjones646 0:c5afea7b9057 271 *
jjones646 0:c5afea7b9057 272 * The size of data read is the fixed payload size, see getPayloadSize()
jjones646 0:c5afea7b9057 273 *
jjones646 0:c5afea7b9057 274 * @param buf Where to put the data
jjones646 0:c5afea7b9057 275 * @param len Maximum number of bytes to read
jjones646 0:c5afea7b9057 276 * @return Current value of status register
jjones646 0:c5afea7b9057 277 */
jjones646 0:c5afea7b9057 278 uint8_t read_payload(void* buf, uint8_t len);
jjones646 0:c5afea7b9057 279
jjones646 0:c5afea7b9057 280
jjones646 0:c5afea7b9057 281 /**
jjones646 0:c5afea7b9057 282 * Decode and print the given status to stdout
jjones646 0:c5afea7b9057 283 *
jjones646 0:c5afea7b9057 284 * @param status Status value to print
jjones646 0:c5afea7b9057 285 *
jjones646 0:c5afea7b9057 286 * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
jjones646 0:c5afea7b9057 287 */
jjones646 0:c5afea7b9057 288 void print_status(uint8_t status);
jjones646 0:c5afea7b9057 289
jjones646 0:c5afea7b9057 290 /**
jjones646 0:c5afea7b9057 291 * Decode and print the given 'observe_tx' value to stdout
jjones646 0:c5afea7b9057 292 *
jjones646 0:c5afea7b9057 293 * @param value The observe_tx value to print
jjones646 0:c5afea7b9057 294 *
jjones646 0:c5afea7b9057 295 * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
jjones646 0:c5afea7b9057 296 */
jjones646 0:c5afea7b9057 297 void print_observe_tx(uint8_t value);
jjones646 0:c5afea7b9057 298
jjones646 0:c5afea7b9057 299 /**
jjones646 0:c5afea7b9057 300 * Print the name and value of an 8-bit register to stdout
jjones646 0:c5afea7b9057 301 *
jjones646 0:c5afea7b9057 302 * Optionally it can print some quantity of successive
jjones646 0:c5afea7b9057 303 * registers on the same line. This is useful for printing a group
jjones646 0:c5afea7b9057 304 * of related registers on one line.
jjones646 0:c5afea7b9057 305 *
jjones646 0:c5afea7b9057 306 * @param name Name of the register
jjones646 0:c5afea7b9057 307 * @param reg Which register. Use constants from nRF24L01.h
jjones646 0:c5afea7b9057 308 * @param qty How many successive registers to print
jjones646 0:c5afea7b9057 309 */
jjones646 0:c5afea7b9057 310 void print_byte_register(const char* name, uint8_t reg, uint8_t qty = 1);
jjones646 0:c5afea7b9057 311
jjones646 0:c5afea7b9057 312 /**
jjones646 0:c5afea7b9057 313 * Print the name and value of a 40-bit address register to stdout
jjones646 0:c5afea7b9057 314 *
jjones646 0:c5afea7b9057 315 * Optionally it can print some quantity of successive
jjones646 0:c5afea7b9057 316 * registers on the same line. This is useful for printing a group
jjones646 0:c5afea7b9057 317 * of related registers on one line.
jjones646 0:c5afea7b9057 318 *
jjones646 0:c5afea7b9057 319 * @param name Name of the register
jjones646 0:c5afea7b9057 320 * @param reg Which register. Use constants from nRF24L01.h
jjones646 0:c5afea7b9057 321 * @param qty How many successive registers to print
jjones646 0:c5afea7b9057 322 */
jjones646 0:c5afea7b9057 323 void print_address_register(const char* name, uint8_t reg, uint8_t qty = 1);
jjones646 0:c5afea7b9057 324
jjones646 0:c5afea7b9057 325 /**
jjones646 0:c5afea7b9057 326 * Turn on or off the special features of the chip
jjones646 0:c5afea7b9057 327 *
jjones646 0:c5afea7b9057 328 * The chip has certain 'features' which are only available when the 'features'
jjones646 0:c5afea7b9057 329 * are enabled. See the datasheet for details.
jjones646 0:c5afea7b9057 330 */
jjones646 0:c5afea7b9057 331 void toggle_features(void);
jjones646 0:c5afea7b9057 332 /**@}*/
jjones646 0:c5afea7b9057 333
jjones646 0:c5afea7b9057 334 public:
jjones646 0:c5afea7b9057 335 /**
jjones646 0:c5afea7b9057 336 * @name Primary public interface
jjones646 0:c5afea7b9057 337 *
jjones646 0:c5afea7b9057 338 * These are the main methods you need to operate the chip
jjones646 0:c5afea7b9057 339 */
jjones646 0:c5afea7b9057 340 /**@{*/
jjones646 0:c5afea7b9057 341
jjones646 0:c5afea7b9057 342 /**
jjones646 0:c5afea7b9057 343 * Constructor
jjones646 0:c5afea7b9057 344 *
jjones646 0:c5afea7b9057 345 * Creates a new instance of this driver. Before using, you create an instance
jjones646 0:c5afea7b9057 346 * and send in the unique pins that this chip is connected to.
jjones646 0:c5afea7b9057 347 *
jjones646 0:c5afea7b9057 348 * @param _cepin The pin attached to Chip Enable on the RF module
jjones646 0:c5afea7b9057 349 * @param _cspin The pin attached to Chip Select
jjones646 0:c5afea7b9057 350 */
jjones646 0:c5afea7b9057 351 RF24(PinName mosi, PinName miso, PinName sck, PinName _csnpin, PinName _cepin);
jjones646 0:c5afea7b9057 352
jjones646 0:c5afea7b9057 353 /**
jjones646 0:c5afea7b9057 354 * Begin operation of the chip
jjones646 0:c5afea7b9057 355 *
jjones646 0:c5afea7b9057 356 * Call this in setup(), before calling any other methods.
jjones646 0:c5afea7b9057 357 */
jjones646 0:c5afea7b9057 358 void begin(void);
jjones646 0:c5afea7b9057 359
jjones646 0:c5afea7b9057 360 /**
jjones646 0:c5afea7b9057 361 * Retrieve the current status of the chip
jjones646 0:c5afea7b9057 362 *
jjones646 0:c5afea7b9057 363 * @return Current value of status register
jjones646 0:c5afea7b9057 364 */
jjones646 0:c5afea7b9057 365 uint8_t get_status(void);
jjones646 0:c5afea7b9057 366
jjones646 0:c5afea7b9057 367 /**
jjones646 0:c5afea7b9057 368 * Empty the receive buffer
jjones646 0:c5afea7b9057 369 *
jjones646 0:c5afea7b9057 370 * @return Current value of status register
jjones646 0:c5afea7b9057 371 */
jjones646 0:c5afea7b9057 372 uint8_t flush_rx(void);
jjones646 0:c5afea7b9057 373
jjones646 0:c5afea7b9057 374 /**
jjones646 0:c5afea7b9057 375 * Empty the transmit buffer
jjones646 0:c5afea7b9057 376 *
jjones646 0:c5afea7b9057 377 * @return Current value of status register
jjones646 0:c5afea7b9057 378 */
jjones646 0:c5afea7b9057 379 uint8_t flush_tx(void);
jjones646 0:c5afea7b9057 380
jjones646 0:c5afea7b9057 381 /**
jjones646 0:c5afea7b9057 382 * Start listening on the pipes opened for reading.
jjones646 0:c5afea7b9057 383 *
jjones646 0:c5afea7b9057 384 * Be sure to call openReadingPipe() first. Do not call write() while
jjones646 0:c5afea7b9057 385 * in this mode, without first calling stopListening(). Call
jjones646 0:c5afea7b9057 386 * isAvailable() to check for incoming traffic, and read() to get it.
jjones646 0:c5afea7b9057 387 */
jjones646 0:c5afea7b9057 388 void startListening(void);
jjones646 0:c5afea7b9057 389
jjones646 0:c5afea7b9057 390 /**
jjones646 0:c5afea7b9057 391 * Stop listening for incoming messages
jjones646 0:c5afea7b9057 392 *
jjones646 0:c5afea7b9057 393 * Do this before calling write().
jjones646 0:c5afea7b9057 394 */
jjones646 0:c5afea7b9057 395 void stopListening(void);
jjones646 0:c5afea7b9057 396
jjones646 0:c5afea7b9057 397 /**
jjones646 0:c5afea7b9057 398 * Write to the open writing pipe
jjones646 0:c5afea7b9057 399 *
jjones646 0:c5afea7b9057 400 * Be sure to call openWritingPipe() first to set the destination
jjones646 0:c5afea7b9057 401 * of where to write to.
jjones646 0:c5afea7b9057 402 *
jjones646 0:c5afea7b9057 403 * This blocks until the message is successfully acknowledged by
jjones646 0:c5afea7b9057 404 * the receiver or the timeout/retransmit maxima are reached. In
jjones646 0:c5afea7b9057 405 * the current configuration, the max delay here is 60ms.
jjones646 0:c5afea7b9057 406 *
jjones646 0:c5afea7b9057 407 * The maximum size of data written is the fixed payload size, see
jjones646 0:c5afea7b9057 408 * getPayloadSize(). However, you can write less, and the remainder
jjones646 0:c5afea7b9057 409 * will just be filled with zeroes.
jjones646 0:c5afea7b9057 410 *
jjones646 0:c5afea7b9057 411 * @param buf Pointer to the data to be sent
jjones646 0:c5afea7b9057 412 * @param len Number of bytes to be sent
jjones646 0:c5afea7b9057 413 * @return True if the payload was delivered successfully false if not
jjones646 0:c5afea7b9057 414 */
jjones646 0:c5afea7b9057 415 bool write( const void* buf, uint8_t len );
jjones646 0:c5afea7b9057 416
jjones646 0:c5afea7b9057 417 /**
jjones646 0:c5afea7b9057 418 * Test whether there are bytes available to be read
jjones646 0:c5afea7b9057 419 *
jjones646 0:c5afea7b9057 420 * @return True if there is a payload available, false if none is
jjones646 0:c5afea7b9057 421 */
jjones646 0:c5afea7b9057 422 bool available(void);
jjones646 0:c5afea7b9057 423
jjones646 0:c5afea7b9057 424 /**
jjones646 0:c5afea7b9057 425 * Read the payload
jjones646 0:c5afea7b9057 426 *
jjones646 0:c5afea7b9057 427 * Return the last payload received
jjones646 0:c5afea7b9057 428 *
jjones646 0:c5afea7b9057 429 * The size of data read is the fixed payload size, see getPayloadSize()
jjones646 0:c5afea7b9057 430 *
jjones646 0:c5afea7b9057 431 * @note I specifically chose 'void*' as a data type to make it easier
jjones646 0:c5afea7b9057 432 * for beginners to use. No casting needed.
jjones646 0:c5afea7b9057 433 *
jjones646 0:c5afea7b9057 434 * @param buf Pointer to a buffer where the data should be written
jjones646 0:c5afea7b9057 435 * @param len Maximum number of bytes to read into the buffer
jjones646 0:c5afea7b9057 436 * @return True if the payload was delivered successfully false if not
jjones646 0:c5afea7b9057 437 */
jjones646 0:c5afea7b9057 438 bool read( void* buf, uint8_t len );
jjones646 0:c5afea7b9057 439
jjones646 0:c5afea7b9057 440 /**
jjones646 0:c5afea7b9057 441 * Open a pipe for writing
jjones646 0:c5afea7b9057 442 *
jjones646 0:c5afea7b9057 443 * Only one pipe can be open at once, but you can change the pipe
jjones646 0:c5afea7b9057 444 * you'll listen to. Do not call this while actively listening.
jjones646 0:c5afea7b9057 445 * Remember to stopListening() first.
jjones646 0:c5afea7b9057 446 *
jjones646 0:c5afea7b9057 447 * Addresses are 40-bit hex values, e.g.:
jjones646 0:c5afea7b9057 448 *
jjones646 0:c5afea7b9057 449 * @code
jjones646 0:c5afea7b9057 450 * openWritingPipe(0xF0F0F0F0F0);
jjones646 0:c5afea7b9057 451 * @endcode
jjones646 0:c5afea7b9057 452 *
jjones646 0:c5afea7b9057 453 * @param address The 40-bit address of the pipe to open. This can be
jjones646 0:c5afea7b9057 454 * any value whatsoever, as long as you are the only one writing to it
jjones646 0:c5afea7b9057 455 * and only one other radio is listening to it. Coordinate these pipe
jjones646 0:c5afea7b9057 456 * addresses amongst nodes on the network.
jjones646 0:c5afea7b9057 457 */
jjones646 0:c5afea7b9057 458 void openWritingPipe(uint64_t address);
jjones646 0:c5afea7b9057 459
jjones646 0:c5afea7b9057 460 /**
jjones646 0:c5afea7b9057 461 * Open a pipe for reading
jjones646 0:c5afea7b9057 462 *
jjones646 0:c5afea7b9057 463 * Up to 6 pipes can be open for reading at once. Open all the
jjones646 0:c5afea7b9057 464 * reading pipes, and then call startListening().
jjones646 0:c5afea7b9057 465 *
jjones646 0:c5afea7b9057 466 * @see openWritingPipe
jjones646 0:c5afea7b9057 467 *
jjones646 0:c5afea7b9057 468 * @warning Pipes 1-5 should share the first 32 bits.
jjones646 0:c5afea7b9057 469 * Only the least significant byte should be unique, e.g.
jjones646 0:c5afea7b9057 470 * @code
jjones646 0:c5afea7b9057 471 * openReadingPipe(1,0xF0F0F0F0AA);
jjones646 0:c5afea7b9057 472 * openReadingPipe(2,0xF0F0F0F066);
jjones646 0:c5afea7b9057 473 * @endcode
jjones646 0:c5afea7b9057 474 *
jjones646 0:c5afea7b9057 475 * @warning Pipe 0 is also used by the writing pipe. So if you open
jjones646 0:c5afea7b9057 476 * pipe 0 for reading, and then startListening(), it will overwrite the
jjones646 0:c5afea7b9057 477 * writing pipe. Ergo, do an openWritingPipe() again before write().
jjones646 0:c5afea7b9057 478 *
jjones646 0:c5afea7b9057 479 * @todo Enforce the restriction that pipes 1-5 must share the top 32 bits
jjones646 0:c5afea7b9057 480 *
jjones646 0:c5afea7b9057 481 * @param number Which pipe# to open, 0-5.
jjones646 0:c5afea7b9057 482 * @param address The 40-bit address of the pipe to open.
jjones646 0:c5afea7b9057 483 */
jjones646 0:c5afea7b9057 484 void openReadingPipe(uint8_t number, uint64_t address);
jjones646 0:c5afea7b9057 485
jjones646 0:c5afea7b9057 486 /**@}*/
jjones646 0:c5afea7b9057 487 /**
jjones646 0:c5afea7b9057 488 * @name Optional Configurators
jjones646 0:c5afea7b9057 489 *
jjones646 0:c5afea7b9057 490 * Methods you can use to get or set the configuration of the chip.
jjones646 0:c5afea7b9057 491 * None are required. Calling begin() sets up a reasonable set of
jjones646 0:c5afea7b9057 492 * defaults.
jjones646 0:c5afea7b9057 493 */
jjones646 0:c5afea7b9057 494 /**@{*/
jjones646 0:c5afea7b9057 495 /**
jjones646 0:c5afea7b9057 496 * Set the number and delay of retries upon failed submit
jjones646 0:c5afea7b9057 497 *
jjones646 0:c5afea7b9057 498 * @param delay How long to wait between each retry, in multiples of 250us,
jjones646 0:c5afea7b9057 499 * max is 15. 0 means 250us, 15 means 4000us.
jjones646 0:c5afea7b9057 500 * @param count How many retries before giving up, max 15
jjones646 0:c5afea7b9057 501 */
jjones646 0:c5afea7b9057 502 void setRetries(uint8_t delay, uint8_t count);
jjones646 0:c5afea7b9057 503
jjones646 0:c5afea7b9057 504 /**
jjones646 0:c5afea7b9057 505 * Set RF communication channel
jjones646 0:c5afea7b9057 506 *
jjones646 0:c5afea7b9057 507 * @param channel Which RF channel to communicate on, 0-127
jjones646 0:c5afea7b9057 508 */
jjones646 0:c5afea7b9057 509 void setChannel(uint8_t channel);
jjones646 0:c5afea7b9057 510
jjones646 0:c5afea7b9057 511 /**
jjones646 0:c5afea7b9057 512 * Set Static Payload Size
jjones646 0:c5afea7b9057 513 *
jjones646 0:c5afea7b9057 514 * This implementation uses a pre-stablished fixed payload size for all
jjones646 0:c5afea7b9057 515 * transmissions. If this method is never called, the driver will always
jjones646 0:c5afea7b9057 516 * transmit the maximum payload size (32 bytes), no matter how much
jjones646 0:c5afea7b9057 517 * was sent to write().
jjones646 0:c5afea7b9057 518 *
jjones646 0:c5afea7b9057 519 * @todo Implement variable-sized payloads feature
jjones646 0:c5afea7b9057 520 *
jjones646 0:c5afea7b9057 521 * @param size The number of bytes in the payload
jjones646 0:c5afea7b9057 522 */
jjones646 0:c5afea7b9057 523 void setPayloadSize(uint8_t size);
jjones646 0:c5afea7b9057 524
jjones646 0:c5afea7b9057 525 /**
jjones646 0:c5afea7b9057 526 * Get Static Payload Size
jjones646 0:c5afea7b9057 527 *
jjones646 0:c5afea7b9057 528 * @see setPayloadSize()
jjones646 0:c5afea7b9057 529 *
jjones646 0:c5afea7b9057 530 * @return The number of bytes in the payload
jjones646 0:c5afea7b9057 531 */
jjones646 0:c5afea7b9057 532 uint8_t getPayloadSize(void);
jjones646 0:c5afea7b9057 533
jjones646 0:c5afea7b9057 534 /**
jjones646 0:c5afea7b9057 535 * Get Dynamic Payload Size
jjones646 0:c5afea7b9057 536 *
jjones646 0:c5afea7b9057 537 * For dynamic payloads, this pulls the size of the payload off
jjones646 0:c5afea7b9057 538 * the chip
jjones646 0:c5afea7b9057 539 *
jjones646 0:c5afea7b9057 540 * @return Payload length of last-received dynamic payload
jjones646 0:c5afea7b9057 541 */
jjones646 0:c5afea7b9057 542 uint8_t getDynamicPayloadSize(void);
jjones646 0:c5afea7b9057 543
jjones646 0:c5afea7b9057 544 /**
jjones646 0:c5afea7b9057 545 * Enable custom payloads on the acknowledge packets
jjones646 0:c5afea7b9057 546 *
jjones646 0:c5afea7b9057 547 * Ack payloads are a handy way to return data back to senders without
jjones646 0:c5afea7b9057 548 * manually changing the radio modes on both units.
jjones646 0:c5afea7b9057 549 *
jjones646 0:c5afea7b9057 550 * @see examples/pingpair_pl/pingpair_pl.pde
jjones646 0:c5afea7b9057 551 */
jjones646 0:c5afea7b9057 552 void enableAckPayload(void);
jjones646 0:c5afea7b9057 553
jjones646 0:c5afea7b9057 554 /**
jjones646 0:c5afea7b9057 555 * Enable dynamically-sized payloads
jjones646 0:c5afea7b9057 556 *
jjones646 0:c5afea7b9057 557 * This way you don't always have to send large packets just to send them
jjones646 0:c5afea7b9057 558 * once in a while. This enables dynamic payloads on ALL pipes.
jjones646 0:c5afea7b9057 559 *
jjones646 0:c5afea7b9057 560 * @see examples/pingpair_pl/pingpair_dyn.pde
jjones646 0:c5afea7b9057 561 */
jjones646 0:c5afea7b9057 562 void enableDynamicPayloads(void);
jjones646 0:c5afea7b9057 563
jjones646 0:c5afea7b9057 564 /**
jjones646 0:c5afea7b9057 565 * Determine whether the hardware is an nRF24L01+ or not.
jjones646 0:c5afea7b9057 566 *
jjones646 0:c5afea7b9057 567 * @return true if the hardware is nRF24L01+ (or compatible) and false
jjones646 0:c5afea7b9057 568 * if its not.
jjones646 0:c5afea7b9057 569 */
jjones646 0:c5afea7b9057 570 bool isPVariant(void) ;
jjones646 0:c5afea7b9057 571
jjones646 0:c5afea7b9057 572 /**
jjones646 0:c5afea7b9057 573 * Enable or disable auto-acknowlede packets
jjones646 0:c5afea7b9057 574 *
jjones646 0:c5afea7b9057 575 * This is enabled by default, so it's only needed if you want to turn
jjones646 0:c5afea7b9057 576 * it off for some reason.
jjones646 0:c5afea7b9057 577 *
jjones646 0:c5afea7b9057 578 * @param enable Whether to enable (true) or disable (false) auto-acks
jjones646 0:c5afea7b9057 579 */
jjones646 0:c5afea7b9057 580 void setAutoAck(bool enable);
jjones646 0:c5afea7b9057 581
jjones646 0:c5afea7b9057 582 /**
jjones646 0:c5afea7b9057 583 * Enable or disable auto-acknowlede packets on a per pipeline basis.
jjones646 0:c5afea7b9057 584 *
jjones646 0:c5afea7b9057 585 * AA is enabled by default, so it's only needed if you want to turn
jjones646 0:c5afea7b9057 586 * it off/on for some reason on a per pipeline basis.
jjones646 0:c5afea7b9057 587 *
jjones646 0:c5afea7b9057 588 * @param pipe Which pipeline to modify
jjones646 0:c5afea7b9057 589 * @param enable Whether to enable (true) or disable (false) auto-acks
jjones646 0:c5afea7b9057 590 */
jjones646 0:c5afea7b9057 591 void setAutoAck( uint8_t pipe, bool enable ) ;
jjones646 0:c5afea7b9057 592
jjones646 0:c5afea7b9057 593 /**
jjones646 0:c5afea7b9057 594 * Set Power Amplifier (PA) level to one of four levels.
jjones646 0:c5afea7b9057 595 * Relative mnemonics have been used to allow for future PA level
jjones646 0:c5afea7b9057 596 * changes. According to 6.5 of the nRF24L01+ specification sheet,
jjones646 0:c5afea7b9057 597 * they translate to: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
jjones646 0:c5afea7b9057 598 * RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm.
jjones646 0:c5afea7b9057 599 *
jjones646 0:c5afea7b9057 600 * @param level Desired PA level.
jjones646 0:c5afea7b9057 601 */
jjones646 0:c5afea7b9057 602 void setPALevel( rf24_pa_dbm_e level ) ;
jjones646 0:c5afea7b9057 603
jjones646 0:c5afea7b9057 604 /**
jjones646 0:c5afea7b9057 605 * Fetches the current PA level.
jjones646 0:c5afea7b9057 606 *
jjones646 0:c5afea7b9057 607 * @return Returns a value from the rf24_pa_dbm_e enum describing
jjones646 0:c5afea7b9057 608 * the current PA setting. Please remember, all values represented
jjones646 0:c5afea7b9057 609 * by the enum mnemonics are negative dBm. See setPALevel for
jjones646 0:c5afea7b9057 610 * return value descriptions.
jjones646 0:c5afea7b9057 611 */
jjones646 0:c5afea7b9057 612 rf24_pa_dbm_e getPALevel( void ) ;
jjones646 0:c5afea7b9057 613
jjones646 0:c5afea7b9057 614 /**
jjones646 0:c5afea7b9057 615 * Set the transmission data rate
jjones646 0:c5afea7b9057 616 *
jjones646 0:c5afea7b9057 617 * @warning setting RF24_250KBPS will fail for non-plus units
jjones646 0:c5afea7b9057 618 *
jjones646 0:c5afea7b9057 619 * @param speed RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps
jjones646 0:c5afea7b9057 620 * @return true if the change was successful
jjones646 0:c5afea7b9057 621 */
jjones646 0:c5afea7b9057 622 bool setDataRate(rf24_datarate_e speed);
jjones646 0:c5afea7b9057 623
jjones646 0:c5afea7b9057 624 /**
jjones646 0:c5afea7b9057 625 * Fetches the transmission data rate
jjones646 0:c5afea7b9057 626 *
jjones646 0:c5afea7b9057 627 * @return Returns the hardware's currently configured datarate. The value
jjones646 0:c5afea7b9057 628 * is one of 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS, as defined in the
jjones646 0:c5afea7b9057 629 * rf24_datarate_e enum.
jjones646 0:c5afea7b9057 630 */
jjones646 0:c5afea7b9057 631 rf24_datarate_e getDataRate( void ) ;
jjones646 0:c5afea7b9057 632
jjones646 0:c5afea7b9057 633 /**
jjones646 0:c5afea7b9057 634 * Set the CRC length
jjones646 0:c5afea7b9057 635 *
jjones646 0:c5afea7b9057 636 * @param length RF24_CRC_8 for 8-bit or RF24_CRC_16 for 16-bit
jjones646 0:c5afea7b9057 637 */
jjones646 0:c5afea7b9057 638 void setCRCLength(rf24_crclength_e length);
jjones646 0:c5afea7b9057 639
jjones646 0:c5afea7b9057 640 /**
jjones646 0:c5afea7b9057 641 * Get the CRC length
jjones646 0:c5afea7b9057 642 *
jjones646 0:c5afea7b9057 643 * @return RF24_DISABLED if disabled or RF24_CRC_8 for 8-bit or RF24_CRC_16 for 16-bit
jjones646 0:c5afea7b9057 644 */
jjones646 0:c5afea7b9057 645 rf24_crclength_e getCRCLength(void);
jjones646 0:c5afea7b9057 646
jjones646 0:c5afea7b9057 647 /**
jjones646 0:c5afea7b9057 648 * Disable CRC validation
jjones646 0:c5afea7b9057 649 *
jjones646 0:c5afea7b9057 650 */
jjones646 0:c5afea7b9057 651 void disableCRC( void ) ;
jjones646 0:c5afea7b9057 652
jjones646 0:c5afea7b9057 653 /**@}*/
jjones646 0:c5afea7b9057 654 /**
jjones646 0:c5afea7b9057 655 * @name Advanced Operation
jjones646 0:c5afea7b9057 656 *
jjones646 0:c5afea7b9057 657 * Methods you can use to drive the chip in more advanced ways
jjones646 0:c5afea7b9057 658 */
jjones646 0:c5afea7b9057 659 /**@{*/
jjones646 0:c5afea7b9057 660
jjones646 0:c5afea7b9057 661 /**
jjones646 0:c5afea7b9057 662 * Print a giant block of debugging information to stdout
jjones646 0:c5afea7b9057 663 *
jjones646 0:c5afea7b9057 664 * @warning Does nothing if stdout is not defined. See fdevopen in stdio.h
jjones646 0:c5afea7b9057 665 */
jjones646 0:c5afea7b9057 666 void printDetails(void);
jjones646 0:c5afea7b9057 667
jjones646 0:c5afea7b9057 668 /**
jjones646 0:c5afea7b9057 669 * Enter low-power mode
jjones646 0:c5afea7b9057 670 *
jjones646 0:c5afea7b9057 671 * To return to normal power mode, either write() some data or
jjones646 0:c5afea7b9057 672 * startListening, or powerUp().
jjones646 0:c5afea7b9057 673 */
jjones646 0:c5afea7b9057 674 void powerDown(void);
jjones646 0:c5afea7b9057 675
jjones646 0:c5afea7b9057 676 /**
jjones646 0:c5afea7b9057 677 * Leave low-power mode - making radio more responsive
jjones646 0:c5afea7b9057 678 *
jjones646 0:c5afea7b9057 679 * To return to low power mode, call powerDown().
jjones646 0:c5afea7b9057 680 */
jjones646 0:c5afea7b9057 681 void powerUp(void) ;
jjones646 0:c5afea7b9057 682
jjones646 0:c5afea7b9057 683 /**
jjones646 0:c5afea7b9057 684 * Test whether there are bytes available to be read
jjones646 0:c5afea7b9057 685 *
jjones646 0:c5afea7b9057 686 * Use this version to discover on which pipe the message
jjones646 0:c5afea7b9057 687 * arrived.
jjones646 0:c5afea7b9057 688 *
jjones646 0:c5afea7b9057 689 * @param[out] pipe_num Which pipe has the payload available
jjones646 0:c5afea7b9057 690 * @return True if there is a payload available, false if none is
jjones646 0:c5afea7b9057 691 */
jjones646 0:c5afea7b9057 692 bool available(uint8_t* pipe_num);
jjones646 0:c5afea7b9057 693
jjones646 0:c5afea7b9057 694 /**
jjones646 0:c5afea7b9057 695 * Non-blocking write to the open writing pipe
jjones646 0:c5afea7b9057 696 *
jjones646 0:c5afea7b9057 697 * Just like write(), but it returns immediately. To find out what happened
jjones646 0:c5afea7b9057 698 * to the send, catch the IRQ and then call whatHappened().
jjones646 0:c5afea7b9057 699 *
jjones646 0:c5afea7b9057 700 * @see write()
jjones646 0:c5afea7b9057 701 * @see whatHappened()
jjones646 0:c5afea7b9057 702 *
jjones646 0:c5afea7b9057 703 * @param buf Pointer to the data to be sent
jjones646 0:c5afea7b9057 704 * @param len Number of bytes to be sent
jjones646 0:c5afea7b9057 705 * @return True if the payload was delivered successfully false if not
jjones646 0:c5afea7b9057 706 */
jjones646 0:c5afea7b9057 707 void startWrite( const void* buf, uint8_t len );
jjones646 0:c5afea7b9057 708
jjones646 0:c5afea7b9057 709 /**
jjones646 0:c5afea7b9057 710 * Write an ack payload for the specified pipe
jjones646 0:c5afea7b9057 711 *
jjones646 0:c5afea7b9057 712 * The next time a message is received on @p pipe, the data in @p buf will
jjones646 0:c5afea7b9057 713 * be sent back in the acknowledgement.
jjones646 0:c5afea7b9057 714 *
jjones646 0:c5afea7b9057 715 * @warning According to the data sheet, only three of these can be pending
jjones646 0:c5afea7b9057 716 * at any time. I have not tested this.
jjones646 0:c5afea7b9057 717 *
jjones646 0:c5afea7b9057 718 * @param pipe Which pipe# (typically 1-5) will get this response.
jjones646 0:c5afea7b9057 719 * @param buf Pointer to data that is sent
jjones646 0:c5afea7b9057 720 * @param len Length of the data to send, up to 32 bytes max. Not affected
jjones646 0:c5afea7b9057 721 * by the static payload set by setPayloadSize().
jjones646 0:c5afea7b9057 722 */
jjones646 0:c5afea7b9057 723 void writeAckPayload(uint8_t pipe, const void* buf, uint8_t len);
jjones646 0:c5afea7b9057 724
jjones646 0:c5afea7b9057 725 /**
jjones646 0:c5afea7b9057 726 * Determine if an ack payload was received in the most recent call to
jjones646 0:c5afea7b9057 727 * write().
jjones646 0:c5afea7b9057 728 *
jjones646 0:c5afea7b9057 729 * Call read() to retrieve the ack payload.
jjones646 0:c5afea7b9057 730 *
jjones646 0:c5afea7b9057 731 * @warning Calling this function clears the internal flag which indicates
jjones646 0:c5afea7b9057 732 * a payload is available. If it returns true, you must read the packet
jjones646 0:c5afea7b9057 733 * out as the very next interaction with the radio, or the results are
jjones646 0:c5afea7b9057 734 * undefined.
jjones646 0:c5afea7b9057 735 *
jjones646 0:c5afea7b9057 736 * @return True if an ack payload is available.
jjones646 0:c5afea7b9057 737 */
jjones646 0:c5afea7b9057 738 bool isAckPayloadAvailable(void);
jjones646 0:c5afea7b9057 739
jjones646 0:c5afea7b9057 740 /**
jjones646 0:c5afea7b9057 741 * Call this when you get an interrupt to find out why
jjones646 0:c5afea7b9057 742 *
jjones646 0:c5afea7b9057 743 * Tells you what caused the interrupt, and clears the state of
jjones646 0:c5afea7b9057 744 * interrupts.
jjones646 0:c5afea7b9057 745 *
jjones646 0:c5afea7b9057 746 * @param[out] tx_ok The send was successful (TX_DS)
jjones646 0:c5afea7b9057 747 * @param[out] tx_fail The send failed, too many retries (MAX_RT)
jjones646 0:c5afea7b9057 748 * @param[out] rx_ready There is a message waiting to be read (RX_DS)
jjones646 0:c5afea7b9057 749 */
jjones646 0:c5afea7b9057 750 void whatHappened(bool& tx_ok,bool& tx_fail,bool& rx_ready);
jjones646 0:c5afea7b9057 751
jjones646 0:c5afea7b9057 752 /**
jjones646 0:c5afea7b9057 753 * Test whether there was a carrier on the line for the
jjones646 0:c5afea7b9057 754 * previous listening period.
jjones646 0:c5afea7b9057 755 *
jjones646 0:c5afea7b9057 756 * Useful to check for interference on the current channel.
jjones646 0:c5afea7b9057 757 *
jjones646 0:c5afea7b9057 758 * @return true if was carrier, false if not
jjones646 0:c5afea7b9057 759 */
jjones646 0:c5afea7b9057 760 bool testCarrier(void);
jjones646 0:c5afea7b9057 761
jjones646 0:c5afea7b9057 762 /**
jjones646 0:c5afea7b9057 763 * Test whether a signal (carrier or otherwise) greater than
jjones646 0:c5afea7b9057 764 * or equal to -64dBm is present on the channel. Valid only
jjones646 0:c5afea7b9057 765 * on nRF24L01P (+) hardware. On nRF24L01, use testCarrier().
jjones646 0:c5afea7b9057 766 *
jjones646 0:c5afea7b9057 767 * Useful to check for interference on the current channel and
jjones646 0:c5afea7b9057 768 * channel hopping strategies.
jjones646 0:c5afea7b9057 769 *
jjones646 0:c5afea7b9057 770 * @return true if signal => -64dBm, false if not
jjones646 0:c5afea7b9057 771 */
jjones646 0:c5afea7b9057 772 bool testRPD(void) ;
jjones646 0:c5afea7b9057 773
jjones646 0:c5afea7b9057 774 uint8_t min(uint8_t, uint8_t);
jjones646 0:c5afea7b9057 775 };
jjones646 0:c5afea7b9057 776
jjones646 0:c5afea7b9057 777
jjones646 0:c5afea7b9057 778 #endif // __RF24_H__
jjones646 0:c5afea7b9057 779 // vim:ai:cin:sts=2 sw=2 ft=cpp