Versie 0.2 Het versturen via de NRF werkt nog niet helemaal omdat er per 4 bytes verstuurd moet worden. Wordt gefixt d.m.v. dynamic stuff!

Dependencies:   RTOS mbed

Fork of rtos_basic by mbed official

Committer:
Reynier
Date:
Fri Apr 29 15:27:26 2016 +0000
Revision:
7:88ba5138f810
Versie 0.2 Het versturen via de NRF werkt nog niet helemaal omdat er per 4 bytes verstuurd moet worden. Wordt gefixt d.m.v. dynamic stuff!

Who changed what in which revision?

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