nRF_24 module library for MBED

Dependents:   IeTI_MOD24_nrf_emit IeTI_MOD24 Arts_DMX512_carteV3_MIDI_nRF IeTI_nRF24

Committer:
villemejane
Date:
Thu Sep 16 14:08:31 2021 +0000
Revision:
0:87e6628220a6
nRF_24 module library for MBED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
villemejane 0:87e6628220a6 1 /****************************************************************************/
villemejane 0:87e6628220a6 2 /* Test MOD-24LR / nrf24L01 */
villemejane 0:87e6628220a6 3 /****************************************************************************/
villemejane 0:87e6628220a6 4 /* LEnsE / Julien VILLEMEJANE / Institut d'Optique Graduate School */
villemejane 0:87e6628220a6 5 /****************************************************************************/
villemejane 0:87e6628220a6 6 /* Bibliothèque */
villemejane 0:87e6628220a6 7 /****************************************************************************/
villemejane 0:87e6628220a6 8 /* Test réalisé sur Nucléo-F411RE */
villemejane 0:87e6628220a6 9 /****************************************************************************/
villemejane 0:87e6628220a6 10
villemejane 0:87e6628220a6 11 #ifndef __MOD24NRF_H__
villemejane 0:87e6628220a6 12 #define __MOD24NRF_H__
villemejane 0:87e6628220a6 13
villemejane 0:87e6628220a6 14 /**
villemejane 0:87e6628220a6 15 * Includes
villemejane 0:87e6628220a6 16 */
villemejane 0:87e6628220a6 17 #include "mbed.h"
villemejane 0:87e6628220a6 18
villemejane 0:87e6628220a6 19 /**
villemejane 0:87e6628220a6 20 * Defines
villemejane 0:87e6628220a6 21 */
villemejane 0:87e6628220a6 22 #define NRF24L01P_TX_PWR_ZERO_DB 0
villemejane 0:87e6628220a6 23 #define NRF24L01P_TX_PWR_MINUS_6_DB -6
villemejane 0:87e6628220a6 24 #define NRF24L01P_TX_PWR_MINUS_12_DB -12
villemejane 0:87e6628220a6 25 #define NRF24L01P_TX_PWR_MINUS_18_DB -18
villemejane 0:87e6628220a6 26
villemejane 0:87e6628220a6 27 #define NRF24L01P_DATARATE_250_KBPS 250
villemejane 0:87e6628220a6 28 #define NRF24L01P_DATARATE_1_MBPS 1000
villemejane 0:87e6628220a6 29 #define NRF24L01P_DATARATE_2_MBPS 2000
villemejane 0:87e6628220a6 30
villemejane 0:87e6628220a6 31 #define NRF24L01P_CRC_NONE 0
villemejane 0:87e6628220a6 32 #define NRF24L01P_CRC_8_BIT 8
villemejane 0:87e6628220a6 33 #define NRF24L01P_CRC_16_BIT 16
villemejane 0:87e6628220a6 34
villemejane 0:87e6628220a6 35 #define NRF24L01P_MIN_RF_FREQUENCY 2400
villemejane 0:87e6628220a6 36 #define NRF24L01P_MAX_RF_FREQUENCY 2525
villemejane 0:87e6628220a6 37
villemejane 0:87e6628220a6 38 #define NRF24L01P_PIPE_P0 0
villemejane 0:87e6628220a6 39 #define NRF24L01P_PIPE_P1 1
villemejane 0:87e6628220a6 40 #define NRF24L01P_PIPE_P2 2
villemejane 0:87e6628220a6 41 #define NRF24L01P_PIPE_P3 3
villemejane 0:87e6628220a6 42 #define NRF24L01P_PIPE_P4 4
villemejane 0:87e6628220a6 43 #define NRF24L01P_PIPE_P5 5
villemejane 0:87e6628220a6 44
villemejane 0:87e6628220a6 45 /**
villemejane 0:87e6628220a6 46 * Default setup for the nRF24L01+, based on the Sparkfun "Nordic Serial Interface Board"
villemejane 0:87e6628220a6 47 * for evaluation (http://www.sparkfun.com/products/9019)
villemejane 0:87e6628220a6 48 */
villemejane 0:87e6628220a6 49 #define DEFAULT_NRF24L01P_ADDRESS ((unsigned long long) 0xE7E7E7E7E7 )
villemejane 0:87e6628220a6 50 #define DEFAULT_NRF24L01P_ADDRESS_WIDTH 5
villemejane 0:87e6628220a6 51 #define DEFAULT_NRF24L01P_CRC NRF24L01P_CRC_8_BIT
villemejane 0:87e6628220a6 52 #define DEFAULT_NRF24L01P_RF_FREQUENCY (NRF24L01P_MIN_RF_FREQUENCY + 2)
villemejane 0:87e6628220a6 53 #define DEFAULT_NRF24L01P_DATARATE NRF24L01P_DATARATE_1_MBPS
villemejane 0:87e6628220a6 54 #define DEFAULT_NRF24L01P_TX_PWR NRF24L01P_TX_PWR_ZERO_DB
villemejane 0:87e6628220a6 55 #define DEFAULT_NRF24L01P_TRANSFER_SIZE 4
villemejane 0:87e6628220a6 56
villemejane 0:87e6628220a6 57 /**
villemejane 0:87e6628220a6 58 * nRF24L01+ Single Chip 2.4GHz Transceiver from Nordic Semiconductor.
villemejane 0:87e6628220a6 59 */
villemejane 0:87e6628220a6 60 class nRF24L01P {
villemejane 0:87e6628220a6 61
villemejane 0:87e6628220a6 62 public:
villemejane 0:87e6628220a6 63
villemejane 0:87e6628220a6 64 /**
villemejane 0:87e6628220a6 65 * Constructor.
villemejane 0:87e6628220a6 66 *
villemejane 0:87e6628220a6 67 * @param mosi mbed pin to use for MOSI line of SPI interface.
villemejane 0:87e6628220a6 68 * @param miso mbed pin to use for MISO line of SPI interface.
villemejane 0:87e6628220a6 69 * @param sck mbed pin to use for SCK line of SPI interface.
villemejane 0:87e6628220a6 70 * @param csn mbed pin to use for not chip select line of SPI interface.
villemejane 0:87e6628220a6 71 * @param ce mbed pin to use for the chip enable line.
villemejane 0:87e6628220a6 72 * @param irq mbed pin to use for the interrupt request line.
villemejane 0:87e6628220a6 73 */
villemejane 0:87e6628220a6 74 nRF24L01P(PinName mosi, PinName miso, PinName sck, PinName csn, PinName ce, PinName irq = NC);
villemejane 0:87e6628220a6 75
villemejane 0:87e6628220a6 76 /**
villemejane 0:87e6628220a6 77 * Set the RF frequency.
villemejane 0:87e6628220a6 78 *
villemejane 0:87e6628220a6 79 * @param frequency the frequency of RF transmission in MHz (2400..2525).
villemejane 0:87e6628220a6 80 */
villemejane 0:87e6628220a6 81 void setRfFrequency(int frequency = DEFAULT_NRF24L01P_RF_FREQUENCY);
villemejane 0:87e6628220a6 82
villemejane 0:87e6628220a6 83 /**
villemejane 0:87e6628220a6 84 * Get the RF frequency.
villemejane 0:87e6628220a6 85 *
villemejane 0:87e6628220a6 86 * @return the frequency of RF transmission in MHz (2400..2525).
villemejane 0:87e6628220a6 87 */
villemejane 0:87e6628220a6 88 int getRfFrequency(void);
villemejane 0:87e6628220a6 89
villemejane 0:87e6628220a6 90 /**
villemejane 0:87e6628220a6 91 * Set the RF output power.
villemejane 0:87e6628220a6 92 *
villemejane 0:87e6628220a6 93 * @param power the RF output power in dBm (0, -6, -12 or -18).
villemejane 0:87e6628220a6 94 */
villemejane 0:87e6628220a6 95 void setRfOutputPower(int power = DEFAULT_NRF24L01P_TX_PWR);
villemejane 0:87e6628220a6 96
villemejane 0:87e6628220a6 97 /**
villemejane 0:87e6628220a6 98 * Get the RF output power.
villemejane 0:87e6628220a6 99 *
villemejane 0:87e6628220a6 100 * @return the RF output power in dBm (0, -6, -12 or -18).
villemejane 0:87e6628220a6 101 */
villemejane 0:87e6628220a6 102 int getRfOutputPower(void);
villemejane 0:87e6628220a6 103
villemejane 0:87e6628220a6 104 /**
villemejane 0:87e6628220a6 105 * Set the Air data rate.
villemejane 0:87e6628220a6 106 *
villemejane 0:87e6628220a6 107 * @param rate the air data rate in kbps (250, 1M or 2M).
villemejane 0:87e6628220a6 108 */
villemejane 0:87e6628220a6 109 void setAirDataRate(int rate = DEFAULT_NRF24L01P_DATARATE);
villemejane 0:87e6628220a6 110
villemejane 0:87e6628220a6 111 /**
villemejane 0:87e6628220a6 112 * Get the Air data rate.
villemejane 0:87e6628220a6 113 *
villemejane 0:87e6628220a6 114 * @return the air data rate in kbps (250, 1M or 2M).
villemejane 0:87e6628220a6 115 */
villemejane 0:87e6628220a6 116 int getAirDataRate(void);
villemejane 0:87e6628220a6 117
villemejane 0:87e6628220a6 118 /**
villemejane 0:87e6628220a6 119 * Set the CRC width.
villemejane 0:87e6628220a6 120 *
villemejane 0:87e6628220a6 121 * @param width the number of bits for the CRC (0, 8 or 16).
villemejane 0:87e6628220a6 122 */
villemejane 0:87e6628220a6 123 void setCrcWidth(int width = DEFAULT_NRF24L01P_CRC);
villemejane 0:87e6628220a6 124
villemejane 0:87e6628220a6 125 /**
villemejane 0:87e6628220a6 126 * Get the CRC width.
villemejane 0:87e6628220a6 127 *
villemejane 0:87e6628220a6 128 * @return the number of bits for the CRC (0, 8 or 16).
villemejane 0:87e6628220a6 129 */
villemejane 0:87e6628220a6 130 int getCrcWidth(void);
villemejane 0:87e6628220a6 131
villemejane 0:87e6628220a6 132 /**
villemejane 0:87e6628220a6 133 * Set the Receive address.
villemejane 0:87e6628220a6 134 *
villemejane 0:87e6628220a6 135 * @param address address associated with the particular pipe
villemejane 0:87e6628220a6 136 * @param width width of the address in bytes (3..5)
villemejane 0:87e6628220a6 137 * @param pipe pipe to associate the address with (0..5, default 0)
villemejane 0:87e6628220a6 138 *
villemejane 0:87e6628220a6 139 * Note that Pipes 0 & 1 have 3, 4 or 5 byte addresses,
villemejane 0:87e6628220a6 140 * while Pipes 2..5 only use the lowest byte (bits 7..0) of the
villemejane 0:87e6628220a6 141 * address provided here, and use 2, 3 or 4 bytes from Pipe 1's address.
villemejane 0:87e6628220a6 142 * The width parameter is ignored for Pipes 2..5.
villemejane 0:87e6628220a6 143 */
villemejane 0:87e6628220a6 144 void setRxAddress(unsigned long long address = DEFAULT_NRF24L01P_ADDRESS, int width = DEFAULT_NRF24L01P_ADDRESS_WIDTH, int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 145
villemejane 0:87e6628220a6 146 void setRxAddress(unsigned long msb_address, unsigned long lsb_address, int width, int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 147
villemejane 0:87e6628220a6 148 /**
villemejane 0:87e6628220a6 149 * Set the Transmit address.
villemejane 0:87e6628220a6 150 *
villemejane 0:87e6628220a6 151 * @param address address for transmission
villemejane 0:87e6628220a6 152 * @param width width of the address in bytes (3..5)
villemejane 0:87e6628220a6 153 *
villemejane 0:87e6628220a6 154 * Note that the address width is shared with the Receive pipes,
villemejane 0:87e6628220a6 155 * so a change to that address width affect transmissions.
villemejane 0:87e6628220a6 156 */
villemejane 0:87e6628220a6 157 void setTxAddress(unsigned long long address = DEFAULT_NRF24L01P_ADDRESS, int width = DEFAULT_NRF24L01P_ADDRESS_WIDTH);
villemejane 0:87e6628220a6 158
villemejane 0:87e6628220a6 159 void setTxAddress(unsigned long msb_address, unsigned long lsb_address, int width);
villemejane 0:87e6628220a6 160
villemejane 0:87e6628220a6 161 /**
villemejane 0:87e6628220a6 162 * Get the Receive address.
villemejane 0:87e6628220a6 163 *
villemejane 0:87e6628220a6 164 * @param pipe pipe to get the address from (0..5, default 0)
villemejane 0:87e6628220a6 165 * @return the address associated with the particular pipe
villemejane 0:87e6628220a6 166 */
villemejane 0:87e6628220a6 167 unsigned long long getRxAddress(int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 168
villemejane 0:87e6628220a6 169 /**
villemejane 0:87e6628220a6 170 * Get the Transmit address.
villemejane 0:87e6628220a6 171 *
villemejane 0:87e6628220a6 172 * @return address address for transmission
villemejane 0:87e6628220a6 173 */
villemejane 0:87e6628220a6 174 unsigned long long getTxAddress(void);
villemejane 0:87e6628220a6 175
villemejane 0:87e6628220a6 176 /**
villemejane 0:87e6628220a6 177 * Set the transfer size.
villemejane 0:87e6628220a6 178 *
villemejane 0:87e6628220a6 179 * @param size the size of the transfer, in bytes (1..32)
villemejane 0:87e6628220a6 180 * @param pipe pipe for the transfer (0..5, default 0)
villemejane 0:87e6628220a6 181 */
villemejane 0:87e6628220a6 182 void setTransferSize(int size = DEFAULT_NRF24L01P_TRANSFER_SIZE, int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 183
villemejane 0:87e6628220a6 184 /**
villemejane 0:87e6628220a6 185 * Get the transfer size.
villemejane 0:87e6628220a6 186 *
villemejane 0:87e6628220a6 187 * @return the size of the transfer, in bytes (1..32).
villemejane 0:87e6628220a6 188 */
villemejane 0:87e6628220a6 189 int getTransferSize(int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 190
villemejane 0:87e6628220a6 191
villemejane 0:87e6628220a6 192 /**
villemejane 0:87e6628220a6 193 * Get the RPD (Received Power Detector) state.
villemejane 0:87e6628220a6 194 *
villemejane 0:87e6628220a6 195 * @return true if the received power exceeded -64dBm
villemejane 0:87e6628220a6 196 */
villemejane 0:87e6628220a6 197 bool getRPD(void);
villemejane 0:87e6628220a6 198
villemejane 0:87e6628220a6 199 /**
villemejane 0:87e6628220a6 200 * Put the nRF24L01+ into Receive mode
villemejane 0:87e6628220a6 201 */
villemejane 0:87e6628220a6 202 void setReceiveMode(void);
villemejane 0:87e6628220a6 203
villemejane 0:87e6628220a6 204 /**
villemejane 0:87e6628220a6 205 * Put the nRF24L01+ into Transmit mode
villemejane 0:87e6628220a6 206 */
villemejane 0:87e6628220a6 207 void setTransmitMode(void);
villemejane 0:87e6628220a6 208
villemejane 0:87e6628220a6 209 /**
villemejane 0:87e6628220a6 210 * Power up the nRF24L01+ into Standby mode
villemejane 0:87e6628220a6 211 */
villemejane 0:87e6628220a6 212 void powerUp(void);
villemejane 0:87e6628220a6 213
villemejane 0:87e6628220a6 214 /**
villemejane 0:87e6628220a6 215 * Power down the nRF24L01+ into Power Down mode
villemejane 0:87e6628220a6 216 */
villemejane 0:87e6628220a6 217 void powerDown(void);
villemejane 0:87e6628220a6 218
villemejane 0:87e6628220a6 219 /**
villemejane 0:87e6628220a6 220 * Enable the nRF24L01+ to Receive or Transmit (using the CE pin)
villemejane 0:87e6628220a6 221 */
villemejane 0:87e6628220a6 222 void enable(void);
villemejane 0:87e6628220a6 223
villemejane 0:87e6628220a6 224 /**
villemejane 0:87e6628220a6 225 * Disable the nRF24L01+ to Receive or Transmit (using the CE pin)
villemejane 0:87e6628220a6 226 */
villemejane 0:87e6628220a6 227 void disable(void);
villemejane 0:87e6628220a6 228
villemejane 0:87e6628220a6 229 /**
villemejane 0:87e6628220a6 230 * Transmit data
villemejane 0:87e6628220a6 231 *
villemejane 0:87e6628220a6 232 * @param pipe is ignored (included for consistency with file write routine)
villemejane 0:87e6628220a6 233 * @param data pointer to an array of bytes to write
villemejane 0:87e6628220a6 234 * @param count the number of bytes to send (1..32)
villemejane 0:87e6628220a6 235 * @return the number of bytes actually written, or -1 for an error
villemejane 0:87e6628220a6 236 */
villemejane 0:87e6628220a6 237 int write(int pipe, char *data, int count);
villemejane 0:87e6628220a6 238
villemejane 0:87e6628220a6 239 /**
villemejane 0:87e6628220a6 240 * Receive data
villemejane 0:87e6628220a6 241 *
villemejane 0:87e6628220a6 242 * @param pipe the receive pipe to get data from
villemejane 0:87e6628220a6 243 * @param data pointer to an array of bytes to store the received data
villemejane 0:87e6628220a6 244 * @param count the number of bytes to receive (1..32)
villemejane 0:87e6628220a6 245 * @return the number of bytes actually received, 0 if none are received, or -1 for an error
villemejane 0:87e6628220a6 246 */
villemejane 0:87e6628220a6 247 int read(int pipe, char *data, int count);
villemejane 0:87e6628220a6 248
villemejane 0:87e6628220a6 249 /**
villemejane 0:87e6628220a6 250 * Determine if there is data available to read
villemejane 0:87e6628220a6 251 *
villemejane 0:87e6628220a6 252 * @param pipe the receive pipe to check for data
villemejane 0:87e6628220a6 253 * @return true if the is data waiting in the given pipe
villemejane 0:87e6628220a6 254 */
villemejane 0:87e6628220a6 255 bool readable(int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 256
villemejane 0:87e6628220a6 257 /**
villemejane 0:87e6628220a6 258 * Disable all receive pipes
villemejane 0:87e6628220a6 259 *
villemejane 0:87e6628220a6 260 * Note: receive pipes are enabled when their address is set.
villemejane 0:87e6628220a6 261 */
villemejane 0:87e6628220a6 262 void disableAllRxPipes(void);
villemejane 0:87e6628220a6 263
villemejane 0:87e6628220a6 264 /**
villemejane 0:87e6628220a6 265 * Disable AutoAcknowledge function
villemejane 0:87e6628220a6 266 */
villemejane 0:87e6628220a6 267 void disableAutoAcknowledge(void);
villemejane 0:87e6628220a6 268
villemejane 0:87e6628220a6 269 /**
villemejane 0:87e6628220a6 270 * Enable AutoAcknowledge function
villemejane 0:87e6628220a6 271 *
villemejane 0:87e6628220a6 272 * @param pipe the receive pipe
villemejane 0:87e6628220a6 273 */
villemejane 0:87e6628220a6 274 void enableAutoAcknowledge(int pipe = NRF24L01P_PIPE_P0);
villemejane 0:87e6628220a6 275
villemejane 0:87e6628220a6 276 /**
villemejane 0:87e6628220a6 277 * Disable AutoRetransmit function
villemejane 0:87e6628220a6 278 */
villemejane 0:87e6628220a6 279 void disableAutoRetransmit(void);
villemejane 0:87e6628220a6 280
villemejane 0:87e6628220a6 281 /**
villemejane 0:87e6628220a6 282 * Enable AutoRetransmit function
villemejane 0:87e6628220a6 283 *
villemejane 0:87e6628220a6 284 * @param delay the delay between restransmits, in uS (250uS..4000uS)
villemejane 0:87e6628220a6 285 * @param count number of retransmits before generating an error (1..15)
villemejane 0:87e6628220a6 286 */
villemejane 0:87e6628220a6 287 void enableAutoRetransmit(int delay, int count);
villemejane 0:87e6628220a6 288
villemejane 0:87e6628220a6 289 private:
villemejane 0:87e6628220a6 290
villemejane 0:87e6628220a6 291 /**
villemejane 0:87e6628220a6 292 * Get the contents of an addressable register.
villemejane 0:87e6628220a6 293 *
villemejane 0:87e6628220a6 294 * @param regAddress address of the register
villemejane 0:87e6628220a6 295 * @return the contents of the register
villemejane 0:87e6628220a6 296 */
villemejane 0:87e6628220a6 297 int getRegister(int regAddress);
villemejane 0:87e6628220a6 298
villemejane 0:87e6628220a6 299 /**
villemejane 0:87e6628220a6 300 * Set the contents of an addressable register.
villemejane 0:87e6628220a6 301 *
villemejane 0:87e6628220a6 302 * @param regAddress address of the register
villemejane 0:87e6628220a6 303 * @param regData data to write to the register
villemejane 0:87e6628220a6 304 */
villemejane 0:87e6628220a6 305 void setRegister(int regAddress, int regData);
villemejane 0:87e6628220a6 306
villemejane 0:87e6628220a6 307 /**
villemejane 0:87e6628220a6 308 * Get the contents of the status register.
villemejane 0:87e6628220a6 309 *
villemejane 0:87e6628220a6 310 * @return the contents of the status register
villemejane 0:87e6628220a6 311 */
villemejane 0:87e6628220a6 312 int getStatusRegister(void);
villemejane 0:87e6628220a6 313
villemejane 0:87e6628220a6 314 SPI spi_;
villemejane 0:87e6628220a6 315 DigitalOut nCS_;
villemejane 0:87e6628220a6 316 DigitalOut ce_;
villemejane 0:87e6628220a6 317 InterruptIn nIRQ_;
villemejane 0:87e6628220a6 318
villemejane 0:87e6628220a6 319 int mode;
villemejane 0:87e6628220a6 320
villemejane 0:87e6628220a6 321 };
villemejane 0:87e6628220a6 322
villemejane 0:87e6628220a6 323 #endif /* __MOD24NRF_H__ */