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 * @file nRF24L01P.cpp
villemejane 0:87e6628220a6 3 *
villemejane 0:87e6628220a6 4 * @author Owen Edwards
villemejane 0:87e6628220a6 5 *
villemejane 0:87e6628220a6 6 * @section LICENSE
villemejane 0:87e6628220a6 7 *
villemejane 0:87e6628220a6 8 * Copyright (c) 2010 Owen Edwards
villemejane 0:87e6628220a6 9 *
villemejane 0:87e6628220a6 10 * This program is free software: you can redistribute it and/or modify
villemejane 0:87e6628220a6 11 * it under the terms of the GNU General Public License as published by
villemejane 0:87e6628220a6 12 * the Free Software Foundation, either version 3 of the License, or
villemejane 0:87e6628220a6 13 * (at your option) any later version.
villemejane 0:87e6628220a6 14 *
villemejane 0:87e6628220a6 15 * This program is distributed in the hope that it will be useful,
villemejane 0:87e6628220a6 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
villemejane 0:87e6628220a6 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
villemejane 0:87e6628220a6 18 * GNU General Public License for more details.
villemejane 0:87e6628220a6 19 *
villemejane 0:87e6628220a6 20 * You should have received a copy of the GNU General Public License
villemejane 0:87e6628220a6 21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
villemejane 0:87e6628220a6 22 *
villemejane 0:87e6628220a6 23 * The above copyright notice and this permission notice shall be included in
villemejane 0:87e6628220a6 24 * all copies or substantial portions of the Software.
villemejane 0:87e6628220a6 25 *
villemejane 0:87e6628220a6 26 * @section DESCRIPTION
villemejane 0:87e6628220a6 27 *
villemejane 0:87e6628220a6 28 * nRF24L01+ Single Chip 2.4GHz Transceiver from Nordic Semiconductor.
villemejane 0:87e6628220a6 29 *
villemejane 0:87e6628220a6 30 * Datasheet:
villemejane 0:87e6628220a6 31 *
villemejane 0:87e6628220a6 32 * http://www.nordicsemi.no/files/Product/data_sheet/nRF24L01P_Product_Specification_1_0.pdf
villemejane 0:87e6628220a6 33 */
villemejane 0:87e6628220a6 34
villemejane 0:87e6628220a6 35 /**
villemejane 0:87e6628220a6 36 * Includes
villemejane 0:87e6628220a6 37 */
villemejane 0:87e6628220a6 38 #include "MOD24_NRF.h"
villemejane 0:87e6628220a6 39
villemejane 0:87e6628220a6 40 /**
villemejane 0:87e6628220a6 41 * Defines
villemejane 0:87e6628220a6 42 *
villemejane 0:87e6628220a6 43 * (Note that all defines here start with an underscore, e.g. '_NRF24L01P_MODE_UNKNOWN',
villemejane 0:87e6628220a6 44 * and are local to this library. The defines in the nRF24L01P.h file do not start
villemejane 0:87e6628220a6 45 * with the underscore, and can be used by code to access this library.)
villemejane 0:87e6628220a6 46 */
villemejane 0:87e6628220a6 47
villemejane 0:87e6628220a6 48 typedef enum {
villemejane 0:87e6628220a6 49 _NRF24L01P_MODE_UNKNOWN,
villemejane 0:87e6628220a6 50 _NRF24L01P_MODE_POWER_DOWN,
villemejane 0:87e6628220a6 51 _NRF24L01P_MODE_STANDBY,
villemejane 0:87e6628220a6 52 _NRF24L01P_MODE_RX,
villemejane 0:87e6628220a6 53 _NRF24L01P_MODE_TX,
villemejane 0:87e6628220a6 54 } nRF24L01P_Mode_Type;
villemejane 0:87e6628220a6 55
villemejane 0:87e6628220a6 56 /*
villemejane 0:87e6628220a6 57 * The following FIFOs are present in nRF24L01+:
villemejane 0:87e6628220a6 58 * TX three level, 32 byte FIFO
villemejane 0:87e6628220a6 59 * RX three level, 32 byte FIFO
villemejane 0:87e6628220a6 60 */
villemejane 0:87e6628220a6 61 #define _NRF24L01P_TX_FIFO_COUNT 3
villemejane 0:87e6628220a6 62 #define _NRF24L01P_RX_FIFO_COUNT 3
villemejane 0:87e6628220a6 63
villemejane 0:87e6628220a6 64 #define _NRF24L01P_TX_FIFO_SIZE 32
villemejane 0:87e6628220a6 65 #define _NRF24L01P_RX_FIFO_SIZE 32
villemejane 0:87e6628220a6 66
villemejane 0:87e6628220a6 67 #define _NRF24L01P_SPI_MAX_DATA_RATE 10000000
villemejane 0:87e6628220a6 68
villemejane 0:87e6628220a6 69 #define _NRF24L01P_SPI_CMD_RD_REG 0x00
villemejane 0:87e6628220a6 70 #define _NRF24L01P_SPI_CMD_WR_REG 0x20
villemejane 0:87e6628220a6 71 #define _NRF24L01P_SPI_CMD_RD_RX_PAYLOAD 0x61
villemejane 0:87e6628220a6 72 #define _NRF24L01P_SPI_CMD_WR_TX_PAYLOAD 0xa0
villemejane 0:87e6628220a6 73 #define _NRF24L01P_SPI_CMD_FLUSH_TX 0xe1
villemejane 0:87e6628220a6 74 #define _NRF24L01P_SPI_CMD_FLUSH_RX 0xe2
villemejane 0:87e6628220a6 75 #define _NRF24L01P_SPI_CMD_REUSE_TX_PL 0xe3
villemejane 0:87e6628220a6 76 #define _NRF24L01P_SPI_CMD_R_RX_PL_WID 0x60
villemejane 0:87e6628220a6 77 #define _NRF24L01P_SPI_CMD_W_ACK_PAYLOAD 0xa8
villemejane 0:87e6628220a6 78 #define _NRF24L01P_SPI_CMD_W_TX_PYLD_NO_ACK 0xb0
villemejane 0:87e6628220a6 79 #define _NRF24L01P_SPI_CMD_NOP 0xff
villemejane 0:87e6628220a6 80
villemejane 0:87e6628220a6 81
villemejane 0:87e6628220a6 82 #define _NRF24L01P_REG_CONFIG 0x00
villemejane 0:87e6628220a6 83 #define _NRF24L01P_REG_EN_AA 0x01
villemejane 0:87e6628220a6 84 #define _NRF24L01P_REG_EN_RXADDR 0x02
villemejane 0:87e6628220a6 85 #define _NRF24L01P_REG_SETUP_AW 0x03
villemejane 0:87e6628220a6 86 #define _NRF24L01P_REG_SETUP_RETR 0x04
villemejane 0:87e6628220a6 87 #define _NRF24L01P_REG_RF_CH 0x05
villemejane 0:87e6628220a6 88 #define _NRF24L01P_REG_RF_SETUP 0x06
villemejane 0:87e6628220a6 89 #define _NRF24L01P_REG_STATUS 0x07
villemejane 0:87e6628220a6 90 #define _NRF24L01P_REG_OBSERVE_TX 0x08
villemejane 0:87e6628220a6 91 #define _NRF24L01P_REG_RPD 0x09
villemejane 0:87e6628220a6 92 #define _NRF24L01P_REG_RX_ADDR_P0 0x0a
villemejane 0:87e6628220a6 93 #define _NRF24L01P_REG_RX_ADDR_P1 0x0b
villemejane 0:87e6628220a6 94 #define _NRF24L01P_REG_RX_ADDR_P2 0x0c
villemejane 0:87e6628220a6 95 #define _NRF24L01P_REG_RX_ADDR_P3 0x0d
villemejane 0:87e6628220a6 96 #define _NRF24L01P_REG_RX_ADDR_P4 0x0e
villemejane 0:87e6628220a6 97 #define _NRF24L01P_REG_RX_ADDR_P5 0x0f
villemejane 0:87e6628220a6 98 #define _NRF24L01P_REG_TX_ADDR 0x10
villemejane 0:87e6628220a6 99 #define _NRF24L01P_REG_RX_PW_P0 0x11
villemejane 0:87e6628220a6 100 #define _NRF24L01P_REG_RX_PW_P1 0x12
villemejane 0:87e6628220a6 101 #define _NRF24L01P_REG_RX_PW_P2 0x13
villemejane 0:87e6628220a6 102 #define _NRF24L01P_REG_RX_PW_P3 0x14
villemejane 0:87e6628220a6 103 #define _NRF24L01P_REG_RX_PW_P4 0x15
villemejane 0:87e6628220a6 104 #define _NRF24L01P_REG_RX_PW_P5 0x16
villemejane 0:87e6628220a6 105 #define _NRF24L01P_REG_FIFO_STATUS 0x17
villemejane 0:87e6628220a6 106 #define _NRF24L01P_REG_DYNPD 0x1c
villemejane 0:87e6628220a6 107 #define _NRF24L01P_REG_FEATURE 0x1d
villemejane 0:87e6628220a6 108
villemejane 0:87e6628220a6 109 #define _NRF24L01P_REG_ADDRESS_MASK 0x1f
villemejane 0:87e6628220a6 110
villemejane 0:87e6628220a6 111 // CONFIG register:
villemejane 0:87e6628220a6 112 #define _NRF24L01P_CONFIG_PRIM_RX (1<<0)
villemejane 0:87e6628220a6 113 #define _NRF24L01P_CONFIG_PWR_UP (1<<1)
villemejane 0:87e6628220a6 114 #define _NRF24L01P_CONFIG_CRC0 (1<<2)
villemejane 0:87e6628220a6 115 #define _NRF24L01P_CONFIG_EN_CRC (1<<3)
villemejane 0:87e6628220a6 116 #define _NRF24L01P_CONFIG_MASK_MAX_RT (1<<4)
villemejane 0:87e6628220a6 117 #define _NRF24L01P_CONFIG_MASK_TX_DS (1<<5)
villemejane 0:87e6628220a6 118 #define _NRF24L01P_CONFIG_MASK_RX_DR (1<<6)
villemejane 0:87e6628220a6 119
villemejane 0:87e6628220a6 120 #define _NRF24L01P_CONFIG_CRC_MASK (_NRF24L01P_CONFIG_EN_CRC|_NRF24L01P_CONFIG_CRC0)
villemejane 0:87e6628220a6 121 #define _NRF24L01P_CONFIG_CRC_NONE (0)
villemejane 0:87e6628220a6 122 #define _NRF24L01P_CONFIG_CRC_8BIT (_NRF24L01P_CONFIG_EN_CRC)
villemejane 0:87e6628220a6 123 #define _NRF24L01P_CONFIG_CRC_16BIT (_NRF24L01P_CONFIG_EN_CRC|_NRF24L01P_CONFIG_CRC0)
villemejane 0:87e6628220a6 124
villemejane 0:87e6628220a6 125 // EN_AA register:
villemejane 0:87e6628220a6 126 #define _NRF24L01P_EN_AA_NONE 0
villemejane 0:87e6628220a6 127
villemejane 0:87e6628220a6 128 // EN_RXADDR register:
villemejane 0:87e6628220a6 129 #define _NRF24L01P_EN_RXADDR_NONE 0
villemejane 0:87e6628220a6 130
villemejane 0:87e6628220a6 131 // SETUP_AW register:
villemejane 0:87e6628220a6 132 #define _NRF24L01P_SETUP_AW_AW_MASK (0x3<<0)
villemejane 0:87e6628220a6 133 #define _NRF24L01P_SETUP_AW_AW_3BYTE (0x1<<0)
villemejane 0:87e6628220a6 134 #define _NRF24L01P_SETUP_AW_AW_4BYTE (0x2<<0)
villemejane 0:87e6628220a6 135 #define _NRF24L01P_SETUP_AW_AW_5BYTE (0x3<<0)
villemejane 0:87e6628220a6 136
villemejane 0:87e6628220a6 137 // SETUP_RETR register:
villemejane 0:87e6628220a6 138 #define _NRF24L01P_SETUP_RETR_NONE 0
villemejane 0:87e6628220a6 139
villemejane 0:87e6628220a6 140 // RF_SETUP register:
villemejane 0:87e6628220a6 141 #define _NRF24L01P_RF_SETUP_RF_PWR_MASK (0x3<<1)
villemejane 0:87e6628220a6 142 #define _NRF24L01P_RF_SETUP_RF_PWR_0DBM (0x3<<1)
villemejane 0:87e6628220a6 143 #define _NRF24L01P_RF_SETUP_RF_PWR_MINUS_6DBM (0x2<<1)
villemejane 0:87e6628220a6 144 #define _NRF24L01P_RF_SETUP_RF_PWR_MINUS_12DBM (0x1<<1)
villemejane 0:87e6628220a6 145 #define _NRF24L01P_RF_SETUP_RF_PWR_MINUS_18DBM (0x0<<1)
villemejane 0:87e6628220a6 146
villemejane 0:87e6628220a6 147 #define _NRF24L01P_RF_SETUP_RF_DR_HIGH_BIT (1 << 3)
villemejane 0:87e6628220a6 148 #define _NRF24L01P_RF_SETUP_RF_DR_LOW_BIT (1 << 5)
villemejane 0:87e6628220a6 149 #define _NRF24L01P_RF_SETUP_RF_DR_MASK (_NRF24L01P_RF_SETUP_RF_DR_LOW_BIT|_NRF24L01P_RF_SETUP_RF_DR_HIGH_BIT)
villemejane 0:87e6628220a6 150 #define _NRF24L01P_RF_SETUP_RF_DR_250KBPS (_NRF24L01P_RF_SETUP_RF_DR_LOW_BIT)
villemejane 0:87e6628220a6 151 #define _NRF24L01P_RF_SETUP_RF_DR_1MBPS (0)
villemejane 0:87e6628220a6 152 #define _NRF24L01P_RF_SETUP_RF_DR_2MBPS (_NRF24L01P_RF_SETUP_RF_DR_HIGH_BIT)
villemejane 0:87e6628220a6 153
villemejane 0:87e6628220a6 154 // STATUS register:
villemejane 0:87e6628220a6 155 #define _NRF24L01P_STATUS_TX_FULL (1<<0)
villemejane 0:87e6628220a6 156 #define _NRF24L01P_STATUS_RX_P_NO (0x7<<1)
villemejane 0:87e6628220a6 157 #define _NRF24L01P_STATUS_MAX_RT (1<<4)
villemejane 0:87e6628220a6 158 #define _NRF24L01P_STATUS_TX_DS (1<<5)
villemejane 0:87e6628220a6 159 #define _NRF24L01P_STATUS_RX_DR (1<<6)
villemejane 0:87e6628220a6 160
villemejane 0:87e6628220a6 161 // RX_PW_P0..RX_PW_P5 registers:
villemejane 0:87e6628220a6 162 #define _NRF24L01P_RX_PW_Px_MASK 0x3F
villemejane 0:87e6628220a6 163
villemejane 0:87e6628220a6 164 #define _NRF24L01P_TIMING_Tundef2pd_us 100000 // 100mS
villemejane 0:87e6628220a6 165 #define _NRF24L01P_TIMING_Tstby2a_us 130 // 130uS
villemejane 0:87e6628220a6 166 #define _NRF24L01P_TIMING_Thce_us 10 // 10uS
villemejane 0:87e6628220a6 167 #define _NRF24L01P_TIMING_Tpd2stby_us 4500 // 4.5mS worst case
villemejane 0:87e6628220a6 168 #define _NRF24L01P_TIMING_Tpece2csn_us 4 // 4uS
villemejane 0:87e6628220a6 169
villemejane 0:87e6628220a6 170 /**
villemejane 0:87e6628220a6 171 * Methods
villemejane 0:87e6628220a6 172 */
villemejane 0:87e6628220a6 173
villemejane 0:87e6628220a6 174 nRF24L01P::nRF24L01P(PinName mosi,
villemejane 0:87e6628220a6 175 PinName miso,
villemejane 0:87e6628220a6 176 PinName sck,
villemejane 0:87e6628220a6 177 PinName csn,
villemejane 0:87e6628220a6 178 PinName ce,
villemejane 0:87e6628220a6 179 PinName irq) : spi_(mosi, miso, sck), nCS_(csn), ce_(ce), nIRQ_(irq) {
villemejane 0:87e6628220a6 180
villemejane 0:87e6628220a6 181 mode = _NRF24L01P_MODE_UNKNOWN;
villemejane 0:87e6628220a6 182
villemejane 0:87e6628220a6 183 disable();
villemejane 0:87e6628220a6 184
villemejane 0:87e6628220a6 185 nCS_ = 1;
villemejane 0:87e6628220a6 186
villemejane 0:87e6628220a6 187 spi_.frequency(_NRF24L01P_SPI_MAX_DATA_RATE/5); // 2Mbit, 1/5th the maximum transfer rate for the SPI bus
villemejane 0:87e6628220a6 188 spi_.format(8,0); // 8-bit, ClockPhase = 0, ClockPolarity = 0
villemejane 0:87e6628220a6 189
villemejane 0:87e6628220a6 190 wait_us(_NRF24L01P_TIMING_Tundef2pd_us); // Wait for Power-on reset
villemejane 0:87e6628220a6 191
villemejane 0:87e6628220a6 192 setRegister(_NRF24L01P_REG_CONFIG, 0); // Power Down
villemejane 0:87e6628220a6 193
villemejane 0:87e6628220a6 194 setRegister(_NRF24L01P_REG_STATUS, _NRF24L01P_STATUS_MAX_RT|_NRF24L01P_STATUS_TX_DS|_NRF24L01P_STATUS_RX_DR); // Clear any pending interrupts
villemejane 0:87e6628220a6 195
villemejane 0:87e6628220a6 196 //
villemejane 0:87e6628220a6 197 // Setup default configuration
villemejane 0:87e6628220a6 198 //
villemejane 0:87e6628220a6 199 disableAllRxPipes();
villemejane 0:87e6628220a6 200 setRfFrequency();
villemejane 0:87e6628220a6 201 setRfOutputPower();
villemejane 0:87e6628220a6 202 setAirDataRate();
villemejane 0:87e6628220a6 203 setCrcWidth();
villemejane 0:87e6628220a6 204 setTxAddress();
villemejane 0:87e6628220a6 205 setRxAddress();
villemejane 0:87e6628220a6 206 disableAutoAcknowledge();
villemejane 0:87e6628220a6 207 disableAutoRetransmit();
villemejane 0:87e6628220a6 208 setTransferSize();
villemejane 0:87e6628220a6 209
villemejane 0:87e6628220a6 210 mode = _NRF24L01P_MODE_POWER_DOWN;
villemejane 0:87e6628220a6 211
villemejane 0:87e6628220a6 212 }
villemejane 0:87e6628220a6 213
villemejane 0:87e6628220a6 214
villemejane 0:87e6628220a6 215 void nRF24L01P::powerUp(void) {
villemejane 0:87e6628220a6 216
villemejane 0:87e6628220a6 217 int config = getRegister(_NRF24L01P_REG_CONFIG);
villemejane 0:87e6628220a6 218
villemejane 0:87e6628220a6 219 config |= _NRF24L01P_CONFIG_PWR_UP;
villemejane 0:87e6628220a6 220
villemejane 0:87e6628220a6 221 setRegister(_NRF24L01P_REG_CONFIG, config);
villemejane 0:87e6628220a6 222
villemejane 0:87e6628220a6 223 // Wait until the nRF24L01+ powers up
villemejane 0:87e6628220a6 224 wait_us( _NRF24L01P_TIMING_Tpd2stby_us );
villemejane 0:87e6628220a6 225
villemejane 0:87e6628220a6 226 mode = _NRF24L01P_MODE_STANDBY;
villemejane 0:87e6628220a6 227
villemejane 0:87e6628220a6 228 }
villemejane 0:87e6628220a6 229
villemejane 0:87e6628220a6 230
villemejane 0:87e6628220a6 231 void nRF24L01P::powerDown(void) {
villemejane 0:87e6628220a6 232
villemejane 0:87e6628220a6 233 int config = getRegister(_NRF24L01P_REG_CONFIG);
villemejane 0:87e6628220a6 234
villemejane 0:87e6628220a6 235 config &= ~_NRF24L01P_CONFIG_PWR_UP;
villemejane 0:87e6628220a6 236
villemejane 0:87e6628220a6 237 setRegister(_NRF24L01P_REG_CONFIG, config);
villemejane 0:87e6628220a6 238
villemejane 0:87e6628220a6 239 // Wait until the nRF24L01+ powers down
villemejane 0:87e6628220a6 240 wait_us( _NRF24L01P_TIMING_Tpd2stby_us ); // This *may* not be necessary (no timing is shown in the Datasheet), but just to be safe
villemejane 0:87e6628220a6 241
villemejane 0:87e6628220a6 242 mode = _NRF24L01P_MODE_POWER_DOWN;
villemejane 0:87e6628220a6 243
villemejane 0:87e6628220a6 244 }
villemejane 0:87e6628220a6 245
villemejane 0:87e6628220a6 246
villemejane 0:87e6628220a6 247 void nRF24L01P::setReceiveMode(void) {
villemejane 0:87e6628220a6 248
villemejane 0:87e6628220a6 249 if ( _NRF24L01P_MODE_POWER_DOWN == mode ) powerUp();
villemejane 0:87e6628220a6 250
villemejane 0:87e6628220a6 251 int config = getRegister(_NRF24L01P_REG_CONFIG);
villemejane 0:87e6628220a6 252
villemejane 0:87e6628220a6 253 config |= _NRF24L01P_CONFIG_PRIM_RX;
villemejane 0:87e6628220a6 254
villemejane 0:87e6628220a6 255 setRegister(_NRF24L01P_REG_CONFIG, config);
villemejane 0:87e6628220a6 256
villemejane 0:87e6628220a6 257 mode = _NRF24L01P_MODE_RX;
villemejane 0:87e6628220a6 258
villemejane 0:87e6628220a6 259 }
villemejane 0:87e6628220a6 260
villemejane 0:87e6628220a6 261
villemejane 0:87e6628220a6 262 void nRF24L01P::setTransmitMode(void) {
villemejane 0:87e6628220a6 263
villemejane 0:87e6628220a6 264 if ( _NRF24L01P_MODE_POWER_DOWN == mode ) powerUp();
villemejane 0:87e6628220a6 265
villemejane 0:87e6628220a6 266 int config = getRegister(_NRF24L01P_REG_CONFIG);
villemejane 0:87e6628220a6 267
villemejane 0:87e6628220a6 268 config &= ~_NRF24L01P_CONFIG_PRIM_RX;
villemejane 0:87e6628220a6 269
villemejane 0:87e6628220a6 270 setRegister(_NRF24L01P_REG_CONFIG, config);
villemejane 0:87e6628220a6 271
villemejane 0:87e6628220a6 272 mode = _NRF24L01P_MODE_TX;
villemejane 0:87e6628220a6 273
villemejane 0:87e6628220a6 274 }
villemejane 0:87e6628220a6 275
villemejane 0:87e6628220a6 276
villemejane 0:87e6628220a6 277 void nRF24L01P::enable(void) {
villemejane 0:87e6628220a6 278
villemejane 0:87e6628220a6 279 ce_ = 1;
villemejane 0:87e6628220a6 280 wait_us( _NRF24L01P_TIMING_Tpece2csn_us );
villemejane 0:87e6628220a6 281
villemejane 0:87e6628220a6 282 }
villemejane 0:87e6628220a6 283
villemejane 0:87e6628220a6 284
villemejane 0:87e6628220a6 285 void nRF24L01P::disable(void) {
villemejane 0:87e6628220a6 286
villemejane 0:87e6628220a6 287 ce_ = 0;
villemejane 0:87e6628220a6 288
villemejane 0:87e6628220a6 289 }
villemejane 0:87e6628220a6 290
villemejane 0:87e6628220a6 291 void nRF24L01P::setRfFrequency(int frequency) {
villemejane 0:87e6628220a6 292
villemejane 0:87e6628220a6 293 if ( ( frequency < NRF24L01P_MIN_RF_FREQUENCY ) || ( frequency > NRF24L01P_MAX_RF_FREQUENCY ) ) {
villemejane 0:87e6628220a6 294
villemejane 0:87e6628220a6 295 error( "nRF24L01P: Invalid RF Frequency setting %d\r\n", frequency );
villemejane 0:87e6628220a6 296 return;
villemejane 0:87e6628220a6 297
villemejane 0:87e6628220a6 298 }
villemejane 0:87e6628220a6 299
villemejane 0:87e6628220a6 300 int channel = ( frequency - NRF24L01P_MIN_RF_FREQUENCY ) & 0x7F;
villemejane 0:87e6628220a6 301
villemejane 0:87e6628220a6 302 setRegister(_NRF24L01P_REG_RF_CH, channel);
villemejane 0:87e6628220a6 303
villemejane 0:87e6628220a6 304 }
villemejane 0:87e6628220a6 305
villemejane 0:87e6628220a6 306
villemejane 0:87e6628220a6 307 int nRF24L01P::getRfFrequency(void) {
villemejane 0:87e6628220a6 308
villemejane 0:87e6628220a6 309 int channel = getRegister(_NRF24L01P_REG_RF_CH) & 0x7F;
villemejane 0:87e6628220a6 310
villemejane 0:87e6628220a6 311 return ( channel + NRF24L01P_MIN_RF_FREQUENCY );
villemejane 0:87e6628220a6 312
villemejane 0:87e6628220a6 313 }
villemejane 0:87e6628220a6 314
villemejane 0:87e6628220a6 315
villemejane 0:87e6628220a6 316 void nRF24L01P::setRfOutputPower(int power) {
villemejane 0:87e6628220a6 317
villemejane 0:87e6628220a6 318 int rfSetup = getRegister(_NRF24L01P_REG_RF_SETUP) & ~_NRF24L01P_RF_SETUP_RF_PWR_MASK;
villemejane 0:87e6628220a6 319
villemejane 0:87e6628220a6 320 switch ( power ) {
villemejane 0:87e6628220a6 321
villemejane 0:87e6628220a6 322 case NRF24L01P_TX_PWR_ZERO_DB:
villemejane 0:87e6628220a6 323 rfSetup |= _NRF24L01P_RF_SETUP_RF_PWR_0DBM;
villemejane 0:87e6628220a6 324 break;
villemejane 0:87e6628220a6 325
villemejane 0:87e6628220a6 326 case NRF24L01P_TX_PWR_MINUS_6_DB:
villemejane 0:87e6628220a6 327 rfSetup |= _NRF24L01P_RF_SETUP_RF_PWR_MINUS_6DBM;
villemejane 0:87e6628220a6 328 break;
villemejane 0:87e6628220a6 329
villemejane 0:87e6628220a6 330 case NRF24L01P_TX_PWR_MINUS_12_DB:
villemejane 0:87e6628220a6 331 rfSetup |= _NRF24L01P_RF_SETUP_RF_PWR_MINUS_12DBM;
villemejane 0:87e6628220a6 332 break;
villemejane 0:87e6628220a6 333
villemejane 0:87e6628220a6 334 case NRF24L01P_TX_PWR_MINUS_18_DB:
villemejane 0:87e6628220a6 335 rfSetup |= _NRF24L01P_RF_SETUP_RF_PWR_MINUS_18DBM;
villemejane 0:87e6628220a6 336 break;
villemejane 0:87e6628220a6 337
villemejane 0:87e6628220a6 338 default:
villemejane 0:87e6628220a6 339 error( "nRF24L01P: Invalid RF Output Power setting %d\r\n", power );
villemejane 0:87e6628220a6 340 return;
villemejane 0:87e6628220a6 341
villemejane 0:87e6628220a6 342 }
villemejane 0:87e6628220a6 343
villemejane 0:87e6628220a6 344 setRegister(_NRF24L01P_REG_RF_SETUP, rfSetup);
villemejane 0:87e6628220a6 345
villemejane 0:87e6628220a6 346 }
villemejane 0:87e6628220a6 347
villemejane 0:87e6628220a6 348
villemejane 0:87e6628220a6 349 int nRF24L01P::getRfOutputPower(void) {
villemejane 0:87e6628220a6 350
villemejane 0:87e6628220a6 351 int rfPwr = getRegister(_NRF24L01P_REG_RF_SETUP) & _NRF24L01P_RF_SETUP_RF_PWR_MASK;
villemejane 0:87e6628220a6 352
villemejane 0:87e6628220a6 353 switch ( rfPwr ) {
villemejane 0:87e6628220a6 354
villemejane 0:87e6628220a6 355 case _NRF24L01P_RF_SETUP_RF_PWR_0DBM:
villemejane 0:87e6628220a6 356 return NRF24L01P_TX_PWR_ZERO_DB;
villemejane 0:87e6628220a6 357
villemejane 0:87e6628220a6 358 case _NRF24L01P_RF_SETUP_RF_PWR_MINUS_6DBM:
villemejane 0:87e6628220a6 359 return NRF24L01P_TX_PWR_MINUS_6_DB;
villemejane 0:87e6628220a6 360
villemejane 0:87e6628220a6 361 case _NRF24L01P_RF_SETUP_RF_PWR_MINUS_12DBM:
villemejane 0:87e6628220a6 362 return NRF24L01P_TX_PWR_MINUS_12_DB;
villemejane 0:87e6628220a6 363
villemejane 0:87e6628220a6 364 case _NRF24L01P_RF_SETUP_RF_PWR_MINUS_18DBM:
villemejane 0:87e6628220a6 365 return NRF24L01P_TX_PWR_MINUS_18_DB;
villemejane 0:87e6628220a6 366
villemejane 0:87e6628220a6 367 default:
villemejane 0:87e6628220a6 368 error( "nRF24L01P: Unknown RF Output Power value %d\r\n", rfPwr );
villemejane 0:87e6628220a6 369 return 0;
villemejane 0:87e6628220a6 370
villemejane 0:87e6628220a6 371 }
villemejane 0:87e6628220a6 372 }
villemejane 0:87e6628220a6 373
villemejane 0:87e6628220a6 374
villemejane 0:87e6628220a6 375 void nRF24L01P::setAirDataRate(int rate) {
villemejane 0:87e6628220a6 376
villemejane 0:87e6628220a6 377 int rfSetup = getRegister(_NRF24L01P_REG_RF_SETUP) & ~_NRF24L01P_RF_SETUP_RF_DR_MASK;
villemejane 0:87e6628220a6 378
villemejane 0:87e6628220a6 379 switch ( rate ) {
villemejane 0:87e6628220a6 380
villemejane 0:87e6628220a6 381 case NRF24L01P_DATARATE_250_KBPS:
villemejane 0:87e6628220a6 382 rfSetup |= _NRF24L01P_RF_SETUP_RF_DR_250KBPS;
villemejane 0:87e6628220a6 383 break;
villemejane 0:87e6628220a6 384
villemejane 0:87e6628220a6 385 case NRF24L01P_DATARATE_1_MBPS:
villemejane 0:87e6628220a6 386 rfSetup |= _NRF24L01P_RF_SETUP_RF_DR_1MBPS;
villemejane 0:87e6628220a6 387 break;
villemejane 0:87e6628220a6 388
villemejane 0:87e6628220a6 389 case NRF24L01P_DATARATE_2_MBPS:
villemejane 0:87e6628220a6 390 rfSetup |= _NRF24L01P_RF_SETUP_RF_DR_2MBPS;
villemejane 0:87e6628220a6 391 break;
villemejane 0:87e6628220a6 392
villemejane 0:87e6628220a6 393 default:
villemejane 0:87e6628220a6 394 error( "nRF24L01P: Invalid Air Data Rate setting %d\r\n", rate );
villemejane 0:87e6628220a6 395 return;
villemejane 0:87e6628220a6 396
villemejane 0:87e6628220a6 397 }
villemejane 0:87e6628220a6 398
villemejane 0:87e6628220a6 399 setRegister(_NRF24L01P_REG_RF_SETUP, rfSetup);
villemejane 0:87e6628220a6 400
villemejane 0:87e6628220a6 401 }
villemejane 0:87e6628220a6 402
villemejane 0:87e6628220a6 403
villemejane 0:87e6628220a6 404 int nRF24L01P::getAirDataRate(void) {
villemejane 0:87e6628220a6 405
villemejane 0:87e6628220a6 406 int rfDataRate = getRegister(_NRF24L01P_REG_RF_SETUP) & _NRF24L01P_RF_SETUP_RF_DR_MASK;
villemejane 0:87e6628220a6 407
villemejane 0:87e6628220a6 408 switch ( rfDataRate ) {
villemejane 0:87e6628220a6 409
villemejane 0:87e6628220a6 410 case _NRF24L01P_RF_SETUP_RF_DR_250KBPS:
villemejane 0:87e6628220a6 411 return NRF24L01P_DATARATE_250_KBPS;
villemejane 0:87e6628220a6 412
villemejane 0:87e6628220a6 413 case _NRF24L01P_RF_SETUP_RF_DR_1MBPS:
villemejane 0:87e6628220a6 414 return NRF24L01P_DATARATE_1_MBPS;
villemejane 0:87e6628220a6 415
villemejane 0:87e6628220a6 416 case _NRF24L01P_RF_SETUP_RF_DR_2MBPS:
villemejane 0:87e6628220a6 417 return NRF24L01P_DATARATE_2_MBPS;
villemejane 0:87e6628220a6 418
villemejane 0:87e6628220a6 419 default:
villemejane 0:87e6628220a6 420 error( "nRF24L01P: Unknown Air Data Rate value %d\r\n", rfDataRate );
villemejane 0:87e6628220a6 421 return 0;
villemejane 0:87e6628220a6 422
villemejane 0:87e6628220a6 423 }
villemejane 0:87e6628220a6 424 }
villemejane 0:87e6628220a6 425
villemejane 0:87e6628220a6 426
villemejane 0:87e6628220a6 427 void nRF24L01P::setCrcWidth(int width) {
villemejane 0:87e6628220a6 428
villemejane 0:87e6628220a6 429 int config = getRegister(_NRF24L01P_REG_CONFIG) & ~_NRF24L01P_CONFIG_CRC_MASK;
villemejane 0:87e6628220a6 430
villemejane 0:87e6628220a6 431 switch ( width ) {
villemejane 0:87e6628220a6 432
villemejane 0:87e6628220a6 433 case NRF24L01P_CRC_NONE:
villemejane 0:87e6628220a6 434 config |= _NRF24L01P_CONFIG_CRC_NONE;
villemejane 0:87e6628220a6 435 break;
villemejane 0:87e6628220a6 436
villemejane 0:87e6628220a6 437 case NRF24L01P_CRC_8_BIT:
villemejane 0:87e6628220a6 438 config |= _NRF24L01P_CONFIG_CRC_8BIT;
villemejane 0:87e6628220a6 439 break;
villemejane 0:87e6628220a6 440
villemejane 0:87e6628220a6 441 case NRF24L01P_CRC_16_BIT:
villemejane 0:87e6628220a6 442 config |= _NRF24L01P_CONFIG_CRC_16BIT;
villemejane 0:87e6628220a6 443 break;
villemejane 0:87e6628220a6 444
villemejane 0:87e6628220a6 445 default:
villemejane 0:87e6628220a6 446 error( "nRF24L01P: Invalid CRC Width setting %d\r\n", width );
villemejane 0:87e6628220a6 447 return;
villemejane 0:87e6628220a6 448
villemejane 0:87e6628220a6 449 }
villemejane 0:87e6628220a6 450
villemejane 0:87e6628220a6 451 setRegister(_NRF24L01P_REG_CONFIG, config);
villemejane 0:87e6628220a6 452
villemejane 0:87e6628220a6 453 }
villemejane 0:87e6628220a6 454
villemejane 0:87e6628220a6 455
villemejane 0:87e6628220a6 456 int nRF24L01P::getCrcWidth(void) {
villemejane 0:87e6628220a6 457
villemejane 0:87e6628220a6 458 int crcWidth = getRegister(_NRF24L01P_REG_CONFIG) & _NRF24L01P_CONFIG_CRC_MASK;
villemejane 0:87e6628220a6 459
villemejane 0:87e6628220a6 460 switch ( crcWidth ) {
villemejane 0:87e6628220a6 461
villemejane 0:87e6628220a6 462 case _NRF24L01P_CONFIG_CRC_NONE:
villemejane 0:87e6628220a6 463 return NRF24L01P_CRC_NONE;
villemejane 0:87e6628220a6 464
villemejane 0:87e6628220a6 465 case _NRF24L01P_CONFIG_CRC_8BIT:
villemejane 0:87e6628220a6 466 return NRF24L01P_CRC_8_BIT;
villemejane 0:87e6628220a6 467
villemejane 0:87e6628220a6 468 case _NRF24L01P_CONFIG_CRC_16BIT:
villemejane 0:87e6628220a6 469 return NRF24L01P_CRC_16_BIT;
villemejane 0:87e6628220a6 470
villemejane 0:87e6628220a6 471 default:
villemejane 0:87e6628220a6 472 error( "nRF24L01P: Unknown CRC Width value %d\r\n", crcWidth );
villemejane 0:87e6628220a6 473 return 0;
villemejane 0:87e6628220a6 474
villemejane 0:87e6628220a6 475 }
villemejane 0:87e6628220a6 476 }
villemejane 0:87e6628220a6 477
villemejane 0:87e6628220a6 478
villemejane 0:87e6628220a6 479 void nRF24L01P::setTransferSize(int size, int pipe) {
villemejane 0:87e6628220a6 480
villemejane 0:87e6628220a6 481 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 482
villemejane 0:87e6628220a6 483 error( "nRF24L01P: Invalid Transfer Size pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 484 return;
villemejane 0:87e6628220a6 485
villemejane 0:87e6628220a6 486 }
villemejane 0:87e6628220a6 487
villemejane 0:87e6628220a6 488 if ( ( size < 0 ) || ( size > _NRF24L01P_RX_FIFO_SIZE ) ) {
villemejane 0:87e6628220a6 489
villemejane 0:87e6628220a6 490 error( "nRF24L01P: Invalid Transfer Size setting %d\r\n", size );
villemejane 0:87e6628220a6 491 return;
villemejane 0:87e6628220a6 492
villemejane 0:87e6628220a6 493 }
villemejane 0:87e6628220a6 494
villemejane 0:87e6628220a6 495 int rxPwPxRegister = _NRF24L01P_REG_RX_PW_P0 + ( pipe - NRF24L01P_PIPE_P0 );
villemejane 0:87e6628220a6 496
villemejane 0:87e6628220a6 497 setRegister(rxPwPxRegister, ( size & _NRF24L01P_RX_PW_Px_MASK ) );
villemejane 0:87e6628220a6 498
villemejane 0:87e6628220a6 499 }
villemejane 0:87e6628220a6 500
villemejane 0:87e6628220a6 501
villemejane 0:87e6628220a6 502 int nRF24L01P::getTransferSize(int pipe) {
villemejane 0:87e6628220a6 503
villemejane 0:87e6628220a6 504 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 505
villemejane 0:87e6628220a6 506 error( "nRF24L01P: Invalid Transfer Size pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 507 return 0;
villemejane 0:87e6628220a6 508
villemejane 0:87e6628220a6 509 }
villemejane 0:87e6628220a6 510
villemejane 0:87e6628220a6 511 int rxPwPxRegister = _NRF24L01P_REG_RX_PW_P0 + ( pipe - NRF24L01P_PIPE_P0 );
villemejane 0:87e6628220a6 512
villemejane 0:87e6628220a6 513 int size = getRegister(rxPwPxRegister);
villemejane 0:87e6628220a6 514
villemejane 0:87e6628220a6 515 return ( size & _NRF24L01P_RX_PW_Px_MASK );
villemejane 0:87e6628220a6 516
villemejane 0:87e6628220a6 517 }
villemejane 0:87e6628220a6 518
villemejane 0:87e6628220a6 519
villemejane 0:87e6628220a6 520 void nRF24L01P::disableAllRxPipes(void) {
villemejane 0:87e6628220a6 521
villemejane 0:87e6628220a6 522 setRegister(_NRF24L01P_REG_EN_RXADDR, _NRF24L01P_EN_RXADDR_NONE);
villemejane 0:87e6628220a6 523
villemejane 0:87e6628220a6 524 }
villemejane 0:87e6628220a6 525
villemejane 0:87e6628220a6 526
villemejane 0:87e6628220a6 527 void nRF24L01P::disableAutoAcknowledge(void) {
villemejane 0:87e6628220a6 528
villemejane 0:87e6628220a6 529 setRegister(_NRF24L01P_REG_EN_AA, _NRF24L01P_EN_AA_NONE);
villemejane 0:87e6628220a6 530
villemejane 0:87e6628220a6 531 }
villemejane 0:87e6628220a6 532
villemejane 0:87e6628220a6 533
villemejane 0:87e6628220a6 534 void nRF24L01P::enableAutoAcknowledge(int pipe) {
villemejane 0:87e6628220a6 535
villemejane 0:87e6628220a6 536 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 537
villemejane 0:87e6628220a6 538 error( "nRF24L01P: Invalid Enable AutoAcknowledge pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 539 return;
villemejane 0:87e6628220a6 540
villemejane 0:87e6628220a6 541 }
villemejane 0:87e6628220a6 542
villemejane 0:87e6628220a6 543 int enAA = getRegister(_NRF24L01P_REG_EN_AA);
villemejane 0:87e6628220a6 544
villemejane 0:87e6628220a6 545 enAA |= ( 1 << (pipe - NRF24L01P_PIPE_P0) );
villemejane 0:87e6628220a6 546
villemejane 0:87e6628220a6 547 setRegister(_NRF24L01P_REG_EN_AA, enAA);
villemejane 0:87e6628220a6 548
villemejane 0:87e6628220a6 549 }
villemejane 0:87e6628220a6 550
villemejane 0:87e6628220a6 551
villemejane 0:87e6628220a6 552 void nRF24L01P::disableAutoRetransmit(void) {
villemejane 0:87e6628220a6 553
villemejane 0:87e6628220a6 554 setRegister(_NRF24L01P_REG_SETUP_RETR, _NRF24L01P_SETUP_RETR_NONE);
villemejane 0:87e6628220a6 555
villemejane 0:87e6628220a6 556 }
villemejane 0:87e6628220a6 557
villemejane 0:87e6628220a6 558 void nRF24L01P::setRxAddress(unsigned long long address, int width, int pipe) {
villemejane 0:87e6628220a6 559
villemejane 0:87e6628220a6 560 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 561
villemejane 0:87e6628220a6 562 error( "nRF24L01P: Invalid setRxAddress pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 563 return;
villemejane 0:87e6628220a6 564
villemejane 0:87e6628220a6 565 }
villemejane 0:87e6628220a6 566
villemejane 0:87e6628220a6 567 if ( ( pipe == NRF24L01P_PIPE_P0 ) || ( pipe == NRF24L01P_PIPE_P1 ) ) {
villemejane 0:87e6628220a6 568
villemejane 0:87e6628220a6 569 int setupAw = getRegister(_NRF24L01P_REG_SETUP_AW) & ~_NRF24L01P_SETUP_AW_AW_MASK;
villemejane 0:87e6628220a6 570
villemejane 0:87e6628220a6 571 switch ( width ) {
villemejane 0:87e6628220a6 572
villemejane 0:87e6628220a6 573 case 3:
villemejane 0:87e6628220a6 574 setupAw |= _NRF24L01P_SETUP_AW_AW_3BYTE;
villemejane 0:87e6628220a6 575 break;
villemejane 0:87e6628220a6 576
villemejane 0:87e6628220a6 577 case 4:
villemejane 0:87e6628220a6 578 setupAw |= _NRF24L01P_SETUP_AW_AW_4BYTE;
villemejane 0:87e6628220a6 579 break;
villemejane 0:87e6628220a6 580
villemejane 0:87e6628220a6 581 case 5:
villemejane 0:87e6628220a6 582 setupAw |= _NRF24L01P_SETUP_AW_AW_5BYTE;
villemejane 0:87e6628220a6 583 break;
villemejane 0:87e6628220a6 584
villemejane 0:87e6628220a6 585 default:
villemejane 0:87e6628220a6 586 error( "nRF24L01P: Invalid setRxAddress width setting %d\r\n", width );
villemejane 0:87e6628220a6 587 return;
villemejane 0:87e6628220a6 588
villemejane 0:87e6628220a6 589 }
villemejane 0:87e6628220a6 590
villemejane 0:87e6628220a6 591 setRegister(_NRF24L01P_REG_SETUP_AW, setupAw);
villemejane 0:87e6628220a6 592
villemejane 0:87e6628220a6 593 } else {
villemejane 0:87e6628220a6 594
villemejane 0:87e6628220a6 595 width = 1;
villemejane 0:87e6628220a6 596
villemejane 0:87e6628220a6 597 }
villemejane 0:87e6628220a6 598
villemejane 0:87e6628220a6 599 int rxAddrPxRegister = _NRF24L01P_REG_RX_ADDR_P0 + ( pipe - NRF24L01P_PIPE_P0 );
villemejane 0:87e6628220a6 600
villemejane 0:87e6628220a6 601 int cn = (_NRF24L01P_SPI_CMD_WR_REG | (rxAddrPxRegister & _NRF24L01P_REG_ADDRESS_MASK));
villemejane 0:87e6628220a6 602
villemejane 0:87e6628220a6 603 nCS_ = 0;
villemejane 0:87e6628220a6 604
villemejane 0:87e6628220a6 605 int status = spi_.write(cn);
villemejane 0:87e6628220a6 606
villemejane 0:87e6628220a6 607 while ( width-- > 0 ) {
villemejane 0:87e6628220a6 608
villemejane 0:87e6628220a6 609 //
villemejane 0:87e6628220a6 610 // LSByte first
villemejane 0:87e6628220a6 611 //
villemejane 0:87e6628220a6 612 spi_.write((int) (address & 0xFF));
villemejane 0:87e6628220a6 613 address >>= 8;
villemejane 0:87e6628220a6 614
villemejane 0:87e6628220a6 615 }
villemejane 0:87e6628220a6 616
villemejane 0:87e6628220a6 617 nCS_ = 1;
villemejane 0:87e6628220a6 618
villemejane 0:87e6628220a6 619 int enRxAddr = getRegister(_NRF24L01P_REG_EN_RXADDR);
villemejane 0:87e6628220a6 620
villemejane 0:87e6628220a6 621 enRxAddr |= (1 << ( pipe - NRF24L01P_PIPE_P0 ) );
villemejane 0:87e6628220a6 622
villemejane 0:87e6628220a6 623 setRegister(_NRF24L01P_REG_EN_RXADDR, enRxAddr);
villemejane 0:87e6628220a6 624 }
villemejane 0:87e6628220a6 625
villemejane 0:87e6628220a6 626 /*
villemejane 0:87e6628220a6 627 * This version of setRxAddress is just a wrapper for the version that takes 'long long's,
villemejane 0:87e6628220a6 628 * in case the main code doesn't want to deal with long long's.
villemejane 0:87e6628220a6 629 */
villemejane 0:87e6628220a6 630 void nRF24L01P::setRxAddress(unsigned long msb_address, unsigned long lsb_address, int width, int pipe) {
villemejane 0:87e6628220a6 631
villemejane 0:87e6628220a6 632 unsigned long long address = ( ( (unsigned long long) msb_address ) << 32 ) | ( ( (unsigned long long) lsb_address ) << 0 );
villemejane 0:87e6628220a6 633
villemejane 0:87e6628220a6 634 setRxAddress(address, width, pipe);
villemejane 0:87e6628220a6 635
villemejane 0:87e6628220a6 636 }
villemejane 0:87e6628220a6 637
villemejane 0:87e6628220a6 638
villemejane 0:87e6628220a6 639 /*
villemejane 0:87e6628220a6 640 * This version of setTxAddress is just a wrapper for the version that takes 'long long's,
villemejane 0:87e6628220a6 641 * in case the main code doesn't want to deal with long long's.
villemejane 0:87e6628220a6 642 */
villemejane 0:87e6628220a6 643 void nRF24L01P::setTxAddress(unsigned long msb_address, unsigned long lsb_address, int width) {
villemejane 0:87e6628220a6 644
villemejane 0:87e6628220a6 645 unsigned long long address = ( ( (unsigned long long) msb_address ) << 32 ) | ( ( (unsigned long long) lsb_address ) << 0 );
villemejane 0:87e6628220a6 646
villemejane 0:87e6628220a6 647 setTxAddress(address, width);
villemejane 0:87e6628220a6 648
villemejane 0:87e6628220a6 649 }
villemejane 0:87e6628220a6 650
villemejane 0:87e6628220a6 651
villemejane 0:87e6628220a6 652 void nRF24L01P::setTxAddress(unsigned long long address, int width) {
villemejane 0:87e6628220a6 653
villemejane 0:87e6628220a6 654 int setupAw = getRegister(_NRF24L01P_REG_SETUP_AW) & ~_NRF24L01P_SETUP_AW_AW_MASK;
villemejane 0:87e6628220a6 655
villemejane 0:87e6628220a6 656 switch ( width ) {
villemejane 0:87e6628220a6 657
villemejane 0:87e6628220a6 658 case 3:
villemejane 0:87e6628220a6 659 setupAw |= _NRF24L01P_SETUP_AW_AW_3BYTE;
villemejane 0:87e6628220a6 660 break;
villemejane 0:87e6628220a6 661
villemejane 0:87e6628220a6 662 case 4:
villemejane 0:87e6628220a6 663 setupAw |= _NRF24L01P_SETUP_AW_AW_4BYTE;
villemejane 0:87e6628220a6 664 break;
villemejane 0:87e6628220a6 665
villemejane 0:87e6628220a6 666 case 5:
villemejane 0:87e6628220a6 667 setupAw |= _NRF24L01P_SETUP_AW_AW_5BYTE;
villemejane 0:87e6628220a6 668 break;
villemejane 0:87e6628220a6 669
villemejane 0:87e6628220a6 670 default:
villemejane 0:87e6628220a6 671 error( "nRF24L01P: Invalid setTxAddress width setting %d\r\n", width );
villemejane 0:87e6628220a6 672 return;
villemejane 0:87e6628220a6 673
villemejane 0:87e6628220a6 674 }
villemejane 0:87e6628220a6 675
villemejane 0:87e6628220a6 676 setRegister(_NRF24L01P_REG_SETUP_AW, setupAw);
villemejane 0:87e6628220a6 677
villemejane 0:87e6628220a6 678 int cn = (_NRF24L01P_SPI_CMD_WR_REG | (_NRF24L01P_REG_TX_ADDR & _NRF24L01P_REG_ADDRESS_MASK));
villemejane 0:87e6628220a6 679
villemejane 0:87e6628220a6 680 nCS_ = 0;
villemejane 0:87e6628220a6 681
villemejane 0:87e6628220a6 682 int status = spi_.write(cn);
villemejane 0:87e6628220a6 683
villemejane 0:87e6628220a6 684 while ( width-- > 0 ) {
villemejane 0:87e6628220a6 685
villemejane 0:87e6628220a6 686 //
villemejane 0:87e6628220a6 687 // LSByte first
villemejane 0:87e6628220a6 688 //
villemejane 0:87e6628220a6 689 spi_.write((int) (address & 0xFF));
villemejane 0:87e6628220a6 690 address >>= 8;
villemejane 0:87e6628220a6 691
villemejane 0:87e6628220a6 692 }
villemejane 0:87e6628220a6 693
villemejane 0:87e6628220a6 694 nCS_ = 1;
villemejane 0:87e6628220a6 695
villemejane 0:87e6628220a6 696 }
villemejane 0:87e6628220a6 697
villemejane 0:87e6628220a6 698
villemejane 0:87e6628220a6 699 unsigned long long nRF24L01P::getRxAddress(int pipe) {
villemejane 0:87e6628220a6 700
villemejane 0:87e6628220a6 701 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 702
villemejane 0:87e6628220a6 703 error( "nRF24L01P: Invalid setRxAddress pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 704 return 0;
villemejane 0:87e6628220a6 705
villemejane 0:87e6628220a6 706 }
villemejane 0:87e6628220a6 707
villemejane 0:87e6628220a6 708 int width;
villemejane 0:87e6628220a6 709
villemejane 0:87e6628220a6 710 if ( ( pipe == NRF24L01P_PIPE_P0 ) || ( pipe == NRF24L01P_PIPE_P1 ) ) {
villemejane 0:87e6628220a6 711
villemejane 0:87e6628220a6 712 int setupAw = getRegister(_NRF24L01P_REG_SETUP_AW) & _NRF24L01P_SETUP_AW_AW_MASK;
villemejane 0:87e6628220a6 713
villemejane 0:87e6628220a6 714 switch ( setupAw ) {
villemejane 0:87e6628220a6 715
villemejane 0:87e6628220a6 716 case _NRF24L01P_SETUP_AW_AW_3BYTE:
villemejane 0:87e6628220a6 717 width = 3;
villemejane 0:87e6628220a6 718 break;
villemejane 0:87e6628220a6 719
villemejane 0:87e6628220a6 720 case _NRF24L01P_SETUP_AW_AW_4BYTE:
villemejane 0:87e6628220a6 721 width = 4;
villemejane 0:87e6628220a6 722 break;
villemejane 0:87e6628220a6 723
villemejane 0:87e6628220a6 724 case _NRF24L01P_SETUP_AW_AW_5BYTE:
villemejane 0:87e6628220a6 725 width = 5;
villemejane 0:87e6628220a6 726 break;
villemejane 0:87e6628220a6 727
villemejane 0:87e6628220a6 728 default:
villemejane 0:87e6628220a6 729 error( "nRF24L01P: Unknown getRxAddress width value %d\r\n", setupAw );
villemejane 0:87e6628220a6 730 return 0;
villemejane 0:87e6628220a6 731
villemejane 0:87e6628220a6 732 }
villemejane 0:87e6628220a6 733
villemejane 0:87e6628220a6 734 } else {
villemejane 0:87e6628220a6 735
villemejane 0:87e6628220a6 736 width = 1;
villemejane 0:87e6628220a6 737
villemejane 0:87e6628220a6 738 }
villemejane 0:87e6628220a6 739
villemejane 0:87e6628220a6 740 int rxAddrPxRegister = _NRF24L01P_REG_RX_ADDR_P0 + ( pipe - NRF24L01P_PIPE_P0 );
villemejane 0:87e6628220a6 741
villemejane 0:87e6628220a6 742 int cn = (_NRF24L01P_SPI_CMD_RD_REG | (rxAddrPxRegister & _NRF24L01P_REG_ADDRESS_MASK));
villemejane 0:87e6628220a6 743
villemejane 0:87e6628220a6 744 unsigned long long address = 0;
villemejane 0:87e6628220a6 745
villemejane 0:87e6628220a6 746 nCS_ = 0;
villemejane 0:87e6628220a6 747
villemejane 0:87e6628220a6 748 int status = spi_.write(cn);
villemejane 0:87e6628220a6 749
villemejane 0:87e6628220a6 750 for ( int i=0; i<width; i++ ) {
villemejane 0:87e6628220a6 751
villemejane 0:87e6628220a6 752 //
villemejane 0:87e6628220a6 753 // LSByte first
villemejane 0:87e6628220a6 754 //
villemejane 0:87e6628220a6 755 address |= ( ( (unsigned long long)( spi_.write(_NRF24L01P_SPI_CMD_NOP) & 0xFF ) ) << (i*8) );
villemejane 0:87e6628220a6 756
villemejane 0:87e6628220a6 757 }
villemejane 0:87e6628220a6 758
villemejane 0:87e6628220a6 759 nCS_ = 1;
villemejane 0:87e6628220a6 760
villemejane 0:87e6628220a6 761 if ( !( ( pipe == NRF24L01P_PIPE_P0 ) || ( pipe == NRF24L01P_PIPE_P1 ) ) ) {
villemejane 0:87e6628220a6 762
villemejane 0:87e6628220a6 763 address |= ( getRxAddress(NRF24L01P_PIPE_P1) & ~((unsigned long long) 0xFF) );
villemejane 0:87e6628220a6 764
villemejane 0:87e6628220a6 765 }
villemejane 0:87e6628220a6 766
villemejane 0:87e6628220a6 767 return address;
villemejane 0:87e6628220a6 768
villemejane 0:87e6628220a6 769 }
villemejane 0:87e6628220a6 770
villemejane 0:87e6628220a6 771
villemejane 0:87e6628220a6 772 unsigned long long nRF24L01P::getTxAddress(void) {
villemejane 0:87e6628220a6 773
villemejane 0:87e6628220a6 774 int setupAw = getRegister(_NRF24L01P_REG_SETUP_AW) & _NRF24L01P_SETUP_AW_AW_MASK;
villemejane 0:87e6628220a6 775
villemejane 0:87e6628220a6 776 int width;
villemejane 0:87e6628220a6 777
villemejane 0:87e6628220a6 778 switch ( setupAw ) {
villemejane 0:87e6628220a6 779
villemejane 0:87e6628220a6 780 case _NRF24L01P_SETUP_AW_AW_3BYTE:
villemejane 0:87e6628220a6 781 width = 3;
villemejane 0:87e6628220a6 782 break;
villemejane 0:87e6628220a6 783
villemejane 0:87e6628220a6 784 case _NRF24L01P_SETUP_AW_AW_4BYTE:
villemejane 0:87e6628220a6 785 width = 4;
villemejane 0:87e6628220a6 786 break;
villemejane 0:87e6628220a6 787
villemejane 0:87e6628220a6 788 case _NRF24L01P_SETUP_AW_AW_5BYTE:
villemejane 0:87e6628220a6 789 width = 5;
villemejane 0:87e6628220a6 790 break;
villemejane 0:87e6628220a6 791
villemejane 0:87e6628220a6 792 default:
villemejane 0:87e6628220a6 793 error( "nRF24L01P: Unknown getTxAddress width value %d\r\n", setupAw );
villemejane 0:87e6628220a6 794 return 0;
villemejane 0:87e6628220a6 795
villemejane 0:87e6628220a6 796 }
villemejane 0:87e6628220a6 797
villemejane 0:87e6628220a6 798 int cn = (_NRF24L01P_SPI_CMD_RD_REG | (_NRF24L01P_REG_TX_ADDR & _NRF24L01P_REG_ADDRESS_MASK));
villemejane 0:87e6628220a6 799
villemejane 0:87e6628220a6 800 unsigned long long address = 0;
villemejane 0:87e6628220a6 801
villemejane 0:87e6628220a6 802 nCS_ = 0;
villemejane 0:87e6628220a6 803
villemejane 0:87e6628220a6 804 int status = spi_.write(cn);
villemejane 0:87e6628220a6 805
villemejane 0:87e6628220a6 806 for ( int i=0; i<width; i++ ) {
villemejane 0:87e6628220a6 807
villemejane 0:87e6628220a6 808 //
villemejane 0:87e6628220a6 809 // LSByte first
villemejane 0:87e6628220a6 810 //
villemejane 0:87e6628220a6 811 address |= ( ( (unsigned long long)( spi_.write(_NRF24L01P_SPI_CMD_NOP) & 0xFF ) ) << (i*8) );
villemejane 0:87e6628220a6 812
villemejane 0:87e6628220a6 813 }
villemejane 0:87e6628220a6 814
villemejane 0:87e6628220a6 815 nCS_ = 1;
villemejane 0:87e6628220a6 816
villemejane 0:87e6628220a6 817 return address;
villemejane 0:87e6628220a6 818 }
villemejane 0:87e6628220a6 819
villemejane 0:87e6628220a6 820
villemejane 0:87e6628220a6 821 bool nRF24L01P::readable(int pipe) {
villemejane 0:87e6628220a6 822
villemejane 0:87e6628220a6 823 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 824
villemejane 0:87e6628220a6 825 error( "nRF24L01P: Invalid readable pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 826 return false;
villemejane 0:87e6628220a6 827
villemejane 0:87e6628220a6 828 }
villemejane 0:87e6628220a6 829
villemejane 0:87e6628220a6 830 int status = getStatusRegister();
villemejane 0:87e6628220a6 831
villemejane 0:87e6628220a6 832 return ( ( status & _NRF24L01P_STATUS_RX_DR ) && ( ( ( status & _NRF24L01P_STATUS_RX_P_NO ) >> 1 ) == ( pipe & 0x7 ) ) );
villemejane 0:87e6628220a6 833
villemejane 0:87e6628220a6 834 }
villemejane 0:87e6628220a6 835
villemejane 0:87e6628220a6 836
villemejane 0:87e6628220a6 837 int nRF24L01P::write(int pipe, char *data, int count) {
villemejane 0:87e6628220a6 838
villemejane 0:87e6628220a6 839 // Note: the pipe number is ignored in a Transmit / write
villemejane 0:87e6628220a6 840
villemejane 0:87e6628220a6 841 //
villemejane 0:87e6628220a6 842 // Save the CE state
villemejane 0:87e6628220a6 843 //
villemejane 0:87e6628220a6 844 int originalCe = ce_;
villemejane 0:87e6628220a6 845 disable();
villemejane 0:87e6628220a6 846
villemejane 0:87e6628220a6 847 if ( count <= 0 ) return 0;
villemejane 0:87e6628220a6 848
villemejane 0:87e6628220a6 849 if ( count > _NRF24L01P_TX_FIFO_SIZE ) count = _NRF24L01P_TX_FIFO_SIZE;
villemejane 0:87e6628220a6 850
villemejane 0:87e6628220a6 851 // Clear the Status bit
villemejane 0:87e6628220a6 852 setRegister(_NRF24L01P_REG_STATUS, _NRF24L01P_STATUS_TX_DS);
villemejane 0:87e6628220a6 853
villemejane 0:87e6628220a6 854 nCS_ = 0;
villemejane 0:87e6628220a6 855
villemejane 0:87e6628220a6 856 int status = spi_.write(_NRF24L01P_SPI_CMD_WR_TX_PAYLOAD);
villemejane 0:87e6628220a6 857
villemejane 0:87e6628220a6 858 for ( int i = 0; i < count; i++ ) {
villemejane 0:87e6628220a6 859
villemejane 0:87e6628220a6 860 spi_.write(*data++);
villemejane 0:87e6628220a6 861
villemejane 0:87e6628220a6 862 }
villemejane 0:87e6628220a6 863
villemejane 0:87e6628220a6 864 nCS_ = 1;
villemejane 0:87e6628220a6 865
villemejane 0:87e6628220a6 866 int originalMode = mode;
villemejane 0:87e6628220a6 867 setTransmitMode();
villemejane 0:87e6628220a6 868
villemejane 0:87e6628220a6 869 enable();
villemejane 0:87e6628220a6 870 wait_us(_NRF24L01P_TIMING_Thce_us);
villemejane 0:87e6628220a6 871 disable();
villemejane 0:87e6628220a6 872
villemejane 0:87e6628220a6 873 while ( !( getStatusRegister() & _NRF24L01P_STATUS_TX_DS ) ) {
villemejane 0:87e6628220a6 874
villemejane 0:87e6628220a6 875 // Wait for the transfer to complete
villemejane 0:87e6628220a6 876
villemejane 0:87e6628220a6 877 }
villemejane 0:87e6628220a6 878
villemejane 0:87e6628220a6 879 // Clear the Status bit
villemejane 0:87e6628220a6 880 setRegister(_NRF24L01P_REG_STATUS, _NRF24L01P_STATUS_TX_DS);
villemejane 0:87e6628220a6 881
villemejane 0:87e6628220a6 882 if ( originalMode == _NRF24L01P_MODE_RX ) {
villemejane 0:87e6628220a6 883
villemejane 0:87e6628220a6 884 setReceiveMode();
villemejane 0:87e6628220a6 885
villemejane 0:87e6628220a6 886 }
villemejane 0:87e6628220a6 887
villemejane 0:87e6628220a6 888 ce_ = originalCe;
villemejane 0:87e6628220a6 889 wait_us( _NRF24L01P_TIMING_Tpece2csn_us );
villemejane 0:87e6628220a6 890
villemejane 0:87e6628220a6 891 return count;
villemejane 0:87e6628220a6 892
villemejane 0:87e6628220a6 893 }
villemejane 0:87e6628220a6 894
villemejane 0:87e6628220a6 895
villemejane 0:87e6628220a6 896 int nRF24L01P::read(int pipe, char *data, int count) {
villemejane 0:87e6628220a6 897
villemejane 0:87e6628220a6 898 if ( ( pipe < NRF24L01P_PIPE_P0 ) || ( pipe > NRF24L01P_PIPE_P5 ) ) {
villemejane 0:87e6628220a6 899
villemejane 0:87e6628220a6 900 error( "nRF24L01P: Invalid read pipe number %d\r\n", pipe );
villemejane 0:87e6628220a6 901 return -1;
villemejane 0:87e6628220a6 902
villemejane 0:87e6628220a6 903 }
villemejane 0:87e6628220a6 904
villemejane 0:87e6628220a6 905 if ( count <= 0 ) return 0;
villemejane 0:87e6628220a6 906
villemejane 0:87e6628220a6 907 if ( count > _NRF24L01P_RX_FIFO_SIZE ) count = _NRF24L01P_RX_FIFO_SIZE;
villemejane 0:87e6628220a6 908
villemejane 0:87e6628220a6 909 if ( readable(pipe) ) {
villemejane 0:87e6628220a6 910
villemejane 0:87e6628220a6 911 nCS_ = 0;
villemejane 0:87e6628220a6 912
villemejane 0:87e6628220a6 913 int status = spi_.write(_NRF24L01P_SPI_CMD_R_RX_PL_WID);
villemejane 0:87e6628220a6 914
villemejane 0:87e6628220a6 915 int rxPayloadWidth = spi_.write(_NRF24L01P_SPI_CMD_NOP);
villemejane 0:87e6628220a6 916
villemejane 0:87e6628220a6 917 nCS_ = 1;
villemejane 0:87e6628220a6 918
villemejane 0:87e6628220a6 919 if ( ( rxPayloadWidth < 0 ) || ( rxPayloadWidth > _NRF24L01P_RX_FIFO_SIZE ) ) {
villemejane 0:87e6628220a6 920
villemejane 0:87e6628220a6 921 // Received payload error: need to flush the FIFO
villemejane 0:87e6628220a6 922
villemejane 0:87e6628220a6 923 nCS_ = 0;
villemejane 0:87e6628220a6 924
villemejane 0:87e6628220a6 925 int status = spi_.write(_NRF24L01P_SPI_CMD_FLUSH_RX);
villemejane 0:87e6628220a6 926
villemejane 0:87e6628220a6 927 int rxPayloadWidth = spi_.write(_NRF24L01P_SPI_CMD_NOP);
villemejane 0:87e6628220a6 928
villemejane 0:87e6628220a6 929 nCS_ = 1;
villemejane 0:87e6628220a6 930
villemejane 0:87e6628220a6 931 //
villemejane 0:87e6628220a6 932 // At this point, we should retry the reception,
villemejane 0:87e6628220a6 933 // but for now we'll just fall through...
villemejane 0:87e6628220a6 934 //
villemejane 0:87e6628220a6 935
villemejane 0:87e6628220a6 936 } else {
villemejane 0:87e6628220a6 937
villemejane 0:87e6628220a6 938 if ( rxPayloadWidth < count ) count = rxPayloadWidth;
villemejane 0:87e6628220a6 939
villemejane 0:87e6628220a6 940 nCS_ = 0;
villemejane 0:87e6628220a6 941
villemejane 0:87e6628220a6 942 int status = spi_.write(_NRF24L01P_SPI_CMD_RD_RX_PAYLOAD);
villemejane 0:87e6628220a6 943
villemejane 0:87e6628220a6 944 for ( int i = 0; i < count; i++ ) {
villemejane 0:87e6628220a6 945
villemejane 0:87e6628220a6 946 *data++ = spi_.write(_NRF24L01P_SPI_CMD_NOP);
villemejane 0:87e6628220a6 947
villemejane 0:87e6628220a6 948 }
villemejane 0:87e6628220a6 949
villemejane 0:87e6628220a6 950 nCS_ = 1;
villemejane 0:87e6628220a6 951
villemejane 0:87e6628220a6 952 // Clear the Status bit
villemejane 0:87e6628220a6 953 setRegister(_NRF24L01P_REG_STATUS, _NRF24L01P_STATUS_RX_DR);
villemejane 0:87e6628220a6 954
villemejane 0:87e6628220a6 955 return count;
villemejane 0:87e6628220a6 956
villemejane 0:87e6628220a6 957 }
villemejane 0:87e6628220a6 958
villemejane 0:87e6628220a6 959 } else {
villemejane 0:87e6628220a6 960
villemejane 0:87e6628220a6 961 //
villemejane 0:87e6628220a6 962 // What should we do if there is no 'readable' data?
villemejane 0:87e6628220a6 963 // We could wait for data to arrive, but for now, we'll
villemejane 0:87e6628220a6 964 // just return with no data.
villemejane 0:87e6628220a6 965 //
villemejane 0:87e6628220a6 966 return 0;
villemejane 0:87e6628220a6 967
villemejane 0:87e6628220a6 968 }
villemejane 0:87e6628220a6 969
villemejane 0:87e6628220a6 970 //
villemejane 0:87e6628220a6 971 // We get here because an error condition occured;
villemejane 0:87e6628220a6 972 // We could wait for data to arrive, but for now, we'll
villemejane 0:87e6628220a6 973 // just return with no data.
villemejane 0:87e6628220a6 974 //
villemejane 0:87e6628220a6 975 return -1;
villemejane 0:87e6628220a6 976
villemejane 0:87e6628220a6 977 }
villemejane 0:87e6628220a6 978
villemejane 0:87e6628220a6 979 void nRF24L01P::setRegister(int regAddress, int regData) {
villemejane 0:87e6628220a6 980
villemejane 0:87e6628220a6 981 //
villemejane 0:87e6628220a6 982 // Save the CE state
villemejane 0:87e6628220a6 983 //
villemejane 0:87e6628220a6 984 int originalCe = ce_;
villemejane 0:87e6628220a6 985 disable();
villemejane 0:87e6628220a6 986
villemejane 0:87e6628220a6 987 int cn = (_NRF24L01P_SPI_CMD_WR_REG | (regAddress & _NRF24L01P_REG_ADDRESS_MASK));
villemejane 0:87e6628220a6 988
villemejane 0:87e6628220a6 989 nCS_ = 0;
villemejane 0:87e6628220a6 990
villemejane 0:87e6628220a6 991 int status = spi_.write(cn);
villemejane 0:87e6628220a6 992
villemejane 0:87e6628220a6 993 spi_.write(regData & 0xFF);
villemejane 0:87e6628220a6 994
villemejane 0:87e6628220a6 995 nCS_ = 1;
villemejane 0:87e6628220a6 996
villemejane 0:87e6628220a6 997 ce_ = originalCe;
villemejane 0:87e6628220a6 998 wait_us( _NRF24L01P_TIMING_Tpece2csn_us );
villemejane 0:87e6628220a6 999
villemejane 0:87e6628220a6 1000 }
villemejane 0:87e6628220a6 1001
villemejane 0:87e6628220a6 1002
villemejane 0:87e6628220a6 1003 int nRF24L01P::getRegister(int regAddress) {
villemejane 0:87e6628220a6 1004
villemejane 0:87e6628220a6 1005 int cn = (_NRF24L01P_SPI_CMD_RD_REG | (regAddress & _NRF24L01P_REG_ADDRESS_MASK));
villemejane 0:87e6628220a6 1006
villemejane 0:87e6628220a6 1007 nCS_ = 0;
villemejane 0:87e6628220a6 1008
villemejane 0:87e6628220a6 1009 int status = spi_.write(cn);
villemejane 0:87e6628220a6 1010
villemejane 0:87e6628220a6 1011 int dn = spi_.write(_NRF24L01P_SPI_CMD_NOP);
villemejane 0:87e6628220a6 1012
villemejane 0:87e6628220a6 1013 nCS_ = 1;
villemejane 0:87e6628220a6 1014
villemejane 0:87e6628220a6 1015 return dn;
villemejane 0:87e6628220a6 1016
villemejane 0:87e6628220a6 1017 }
villemejane 0:87e6628220a6 1018
villemejane 0:87e6628220a6 1019 int nRF24L01P::getStatusRegister(void) {
villemejane 0:87e6628220a6 1020
villemejane 0:87e6628220a6 1021 nCS_ = 0;
villemejane 0:87e6628220a6 1022
villemejane 0:87e6628220a6 1023 int status = spi_.write(_NRF24L01P_SPI_CMD_NOP);
villemejane 0:87e6628220a6 1024
villemejane 0:87e6628220a6 1025 nCS_ = 1;
villemejane 0:87e6628220a6 1026
villemejane 0:87e6628220a6 1027 return status;
villemejane 0:87e6628220a6 1028
villemejane 0:87e6628220a6 1029 }