This is a work in progress for an NRF2401P

Dependents:   NRF_receiver sender locker4 Weather_Station_Ofiicial ... more

About

This is a simple library to drive the nRF24l01+.

Hardware

This uses the commonly available breakout. The connections are shown below /media/uploads/epgmdm/nrf24l01pinout.png

Software

Use case: For a simple transmitter

tx code snipet

#include "NRF2401P.h"
int main() {
*
*  long long addr1=0xAB00CD; // setup address - any 5 byte number - same as RX
*  int channel =0x12;  // [0-126] setup channel, must be same as RX
*  bool txOK;
*  char msg[32];
*  char ackData[32];
*  char len;
*
*  // Setup 
*  NRF2401P nrf1(PTD6,PTD7, PTD5,PTD4, PTC12); //mosi, miso, sclk, csn, ce)
*  nrf1.quickTxSetup(channel, addr1); // sets nrf24l01+ as transmitter
*
*  // transmit
*  strcpy (msg, "Hello"); 
*  txOK= nrf1.transmitData(msg,strlen(msg));
*
*  // read ack data if available
*  if (nrf1.isAckData()) { 
*      len= nrf1.getRxData(ackData); // len is number of bytes in ackData
*   }
*}

Use case: For a simple receiver

rx code snipet

#include "NRF2401P.h"
*int main(){
*        
*  long long addr1=0xAB00CD; // setup address - any 5 byte number - same as TX
*  int channel =0x12;  // [0-126] setup channel, must be same as TX
*  bool txOK;
*  char msg[32];
*  char ackData[32];
*  char len;
*
*  // Setup 
*  NRF2401P nrf1(PTD6,PTD7, PTD5,PTD4, PTC12); //mosi, miso, sclk, csn, ce)
*  nrf1.quickRxSetup(channel, addr1); // sets nrf24l01+ as  receiver, using pipe 1
*
*  // set ack data
*  sprintf(ackData,"Ack data");
*  nrf1.acknowledgeData(ackData, strlen(ackData),1); // ack for pipe 1
*    
*  // receive
*  while (! nrf1.isRxData()); // note this blocks until RX data
*  len= nrf1.getRxData(msg); // gets the message, len is length of msg
*
*}
Committer:
epgmdm
Date:
Thu Jun 11 11:19:57 2015 +0000
Revision:
0:8fd0531ae0be
Child:
1:ff53b1ac3bad
First Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
epgmdm 0:8fd0531ae0be 1 #include "mbed.h"
epgmdm 0:8fd0531ae0be 2 #include "NRF2401P.h"
epgmdm 0:8fd0531ae0be 3
epgmdm 0:8fd0531ae0be 4 /**
epgmdm 0:8fd0531ae0be 5 *@section DESCRIPTION
epgmdm 0:8fd0531ae0be 6 * mbed NRF2401+ Library
epgmdm 0:8fd0531ae0be 7 *@section LICENSE
epgmdm 0:8fd0531ae0be 8 * Copyright (c) 2015, Malcolm McCulloch
epgmdm 0:8fd0531ae0be 9 *
epgmdm 0:8fd0531ae0be 10 * Permission is hereby granted, free of charge, to any person obtaining a copy
epgmdm 0:8fd0531ae0be 11 * of this software and associated documentation files (the "Software"), to deal
epgmdm 0:8fd0531ae0be 12 * in the Software without restriction, including without limitation the rights
epgmdm 0:8fd0531ae0be 13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
epgmdm 0:8fd0531ae0be 14 * copies of the Software, and to permit persons to whom the Software is
epgmdm 0:8fd0531ae0be 15 * furnished to do so, subject to the following conditions:
epgmdm 0:8fd0531ae0be 16 *
epgmdm 0:8fd0531ae0be 17 * The above copyright notice and this permission notice shall be included in
epgmdm 0:8fd0531ae0be 18 * all copies or substantial portions of the Software.
epgmdm 0:8fd0531ae0be 19 *
epgmdm 0:8fd0531ae0be 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
epgmdm 0:8fd0531ae0be 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
epgmdm 0:8fd0531ae0be 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
epgmdm 0:8fd0531ae0be 23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
epgmdm 0:8fd0531ae0be 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
epgmdm 0:8fd0531ae0be 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
epgmdm 0:8fd0531ae0be 26 * THE SOFTWARE.
epgmdm 0:8fd0531ae0be 27 * @file "NRF2401P.cpp"
epgmdm 0:8fd0531ae0be 28 */
epgmdm 0:8fd0531ae0be 29
epgmdm 0:8fd0531ae0be 30
epgmdm 0:8fd0531ae0be 31
epgmdm 0:8fd0531ae0be 32 NRF2401P::NRF2401P ( PinName mosi, PinName miso, PinName sclk, PinName _csn, PinName _ce ) :
epgmdm 0:8fd0531ae0be 33 csn( DigitalOut( _csn ) ), ce( DigitalOut( _ce ) )
epgmdm 0:8fd0531ae0be 34 {
epgmdm 0:8fd0531ae0be 35 addressWidth = 5;
epgmdm 0:8fd0531ae0be 36 pc = new Serial( USBTX, USBRX ); // tx, rx
epgmdm 0:8fd0531ae0be 37 sprintf(logMsg, "Initialise " );
epgmdm 0:8fd0531ae0be 38 log(logMsg);
epgmdm 0:8fd0531ae0be 39 spi = new SPI( mosi, miso, sclk, NC ); //SPI (PinName mosi, PinName miso, PinName sclk, PinName _unused=NC)
epgmdm 0:8fd0531ae0be 40 spi->frequency( 10000000 ); // 1MHZ max 10 MHz
epgmdm 0:8fd0531ae0be 41 spi->format( 8, 0 ); // 0: 0e 08; 1: 0e 00; 2:0e 00 ;3:1c 00
epgmdm 0:8fd0531ae0be 42 csn = 1;
epgmdm 0:8fd0531ae0be 43 ce = 0;
epgmdm 0:8fd0531ae0be 44 dynamic = false;
epgmdm 0:8fd0531ae0be 45 debug=false;
epgmdm 0:8fd0531ae0be 46
epgmdm 0:8fd0531ae0be 47 };
epgmdm 0:8fd0531ae0be 48
epgmdm 0:8fd0531ae0be 49 /**
epgmdm 0:8fd0531ae0be 50 * writes to pc and waits
epgmdm 0:8fd0531ae0be 51 */
epgmdm 0:8fd0531ae0be 52 void NRF2401P::log (char *msg)
epgmdm 0:8fd0531ae0be 53 {
epgmdm 0:8fd0531ae0be 54 if(debug) {
epgmdm 0:8fd0531ae0be 55 pc->printf("%s \t %s\n\r",statusString(), msg);
epgmdm 0:8fd0531ae0be 56 wait(0.1);
epgmdm 0:8fd0531ae0be 57 };
epgmdm 0:8fd0531ae0be 58 }
epgmdm 0:8fd0531ae0be 59
epgmdm 0:8fd0531ae0be 60 void NRF2401P::scratch()
epgmdm 0:8fd0531ae0be 61 {
epgmdm 0:8fd0531ae0be 62 int status = 0;
epgmdm 0:8fd0531ae0be 63 int register1 = 0;
epgmdm 0:8fd0531ae0be 64 ce = 0;
epgmdm 0:8fd0531ae0be 65 for ( char i = 0; i < 24; i++ ) {
epgmdm 0:8fd0531ae0be 66 csn = 0;
epgmdm 0:8fd0531ae0be 67 //wait_us(100);
epgmdm 0:8fd0531ae0be 68 status = spi->write( i );
epgmdm 0:8fd0531ae0be 69 register1 = spi->write( 0x00 );
epgmdm 0:8fd0531ae0be 70 csn = 1;
epgmdm 0:8fd0531ae0be 71 sprintf(logMsg, " register %02x (%02x) = %02x", i, status, register1 );
epgmdm 0:8fd0531ae0be 72 log(logMsg);
epgmdm 0:8fd0531ae0be 73 }
epgmdm 0:8fd0531ae0be 74
epgmdm 0:8fd0531ae0be 75 }
epgmdm 0:8fd0531ae0be 76 /**
epgmdm 0:8fd0531ae0be 77 * Sets up a reciever using shockburst and dynamic payload. Uses pipe 1
epgmdm 0:8fd0531ae0be 78 * defaults to 5 bytes
epgmdm 0:8fd0531ae0be 79 */
epgmdm 0:8fd0531ae0be 80 void NRF2401P::quickRxSetup(int channel,long long addr)
epgmdm 0:8fd0531ae0be 81 {
epgmdm 0:8fd0531ae0be 82 setRadio(0,3);
epgmdm 0:8fd0531ae0be 83 setChannel(channel);
epgmdm 0:8fd0531ae0be 84 setRxMode();
epgmdm 0:8fd0531ae0be 85 setPwrUp();
epgmdm 0:8fd0531ae0be 86 setAddressWidth(3);
epgmdm 0:8fd0531ae0be 87 setRxAddress(addr,1);
epgmdm 0:8fd0531ae0be 88 setDynamicPayload();
epgmdm 0:8fd0531ae0be 89 writeReg(0x02,0x03); // EN_RXADDR for P1 and P0
epgmdm 0:8fd0531ae0be 90 writeReg(0x01,0x3f); // EN_AA regi for P1 and P0
epgmdm 0:8fd0531ae0be 91
epgmdm 0:8fd0531ae0be 92 ce=1;
epgmdm 0:8fd0531ae0be 93 wait (0.1f);
epgmdm 0:8fd0531ae0be 94 }
epgmdm 0:8fd0531ae0be 95 /**
epgmdm 0:8fd0531ae0be 96 * Sets up for receive of a message to address 0XA0A0A0
epgmdm 0:8fd0531ae0be 97 */
epgmdm 0:8fd0531ae0be 98
epgmdm 0:8fd0531ae0be 99 char NRF2401P::testReceive()
epgmdm 0:8fd0531ae0be 100 {
epgmdm 0:8fd0531ae0be 101 char message[64];
epgmdm 0:8fd0531ae0be 102 char width;
epgmdm 0:8fd0531ae0be 103 int channel = 0x12;
epgmdm 0:8fd0531ae0be 104 long long addr=0xA0B0C0;
epgmdm 0:8fd0531ae0be 105 debug = true;
epgmdm 0:8fd0531ae0be 106 quickRxSetup(channel, addr);
epgmdm 0:8fd0531ae0be 107
epgmdm 0:8fd0531ae0be 108 while (1) {
epgmdm 0:8fd0531ae0be 109 while (!isRxData()) {
epgmdm 0:8fd0531ae0be 110 //wait(0.5);
epgmdm 0:8fd0531ae0be 111 };
epgmdm 0:8fd0531ae0be 112 width=getRxData(message);
epgmdm 0:8fd0531ae0be 113 message[width]='\0';
epgmdm 0:8fd0531ae0be 114 sprintf(logMsg,"Received= [%s]",message);
epgmdm 0:8fd0531ae0be 115 log(logMsg);
epgmdm 0:8fd0531ae0be 116 };
epgmdm 0:8fd0531ae0be 117 }
epgmdm 0:8fd0531ae0be 118
epgmdm 0:8fd0531ae0be 119 /**
epgmdm 0:8fd0531ae0be 120 * Sets up a transmitter using shockburst and dynamic payload. Uses pipe 1
epgmdm 0:8fd0531ae0be 121 * defaults to 5 bytes
epgmdm 0:8fd0531ae0be 122 */
epgmdm 0:8fd0531ae0be 123 void NRF2401P::quickTxSetup(int channel,long long addr)
epgmdm 0:8fd0531ae0be 124 {
epgmdm 0:8fd0531ae0be 125 setRadio(0,3);
epgmdm 0:8fd0531ae0be 126 setChannel(channel);
epgmdm 0:8fd0531ae0be 127
epgmdm 0:8fd0531ae0be 128 setTxMode();
epgmdm 0:8fd0531ae0be 129 setPwrUp();
epgmdm 0:8fd0531ae0be 130 setDynamicPayload();
epgmdm 0:8fd0531ae0be 131 setAddressWidth(3);
epgmdm 0:8fd0531ae0be 132 setTxAddress(addr);
epgmdm 0:8fd0531ae0be 133 ce=1;
epgmdm 0:8fd0531ae0be 134 wait (0.0016f); // wait for pll to settle
epgmdm 0:8fd0531ae0be 135 }
epgmdm 0:8fd0531ae0be 136
epgmdm 0:8fd0531ae0be 137 /**
epgmdm 0:8fd0531ae0be 138 * Sets up for transmit of a message to address 0XA0A0A0
epgmdm 0:8fd0531ae0be 139 */
epgmdm 0:8fd0531ae0be 140
epgmdm 0:8fd0531ae0be 141 char NRF2401P::testTransmit()
epgmdm 0:8fd0531ae0be 142 {
epgmdm 0:8fd0531ae0be 143 long long addr=0xA0B0C0;
epgmdm 0:8fd0531ae0be 144 int channel = 0x12;
epgmdm 0:8fd0531ae0be 145 char data[32] ;
epgmdm 0:8fd0531ae0be 146 int i=0;
epgmdm 0:8fd0531ae0be 147 quickRxSetup(channel, addr);
epgmdm 0:8fd0531ae0be 148 while (1) {
epgmdm 0:8fd0531ae0be 149 sprintf(data," packet %03d", i++ |100);
epgmdm 0:8fd0531ae0be 150 transmitData(data,18);
epgmdm 0:8fd0531ae0be 151 wait (1.0);
epgmdm 0:8fd0531ae0be 152 }
epgmdm 0:8fd0531ae0be 153
epgmdm 0:8fd0531ae0be 154 }
epgmdm 0:8fd0531ae0be 155 /**
epgmdm 0:8fd0531ae0be 156 *Speed :
epgmdm 0:8fd0531ae0be 157 ‘0x00’ – 1Mbps
epgmdm 0:8fd0531ae0be 158 ‘0x01’ – 2Mbps
epgmdm 0:8fd0531ae0be 159 ‘0x02’ – 250kbps
epgmdm 0:8fd0531ae0be 160 ‘0x03’ – Reserved
epgmdm 0:8fd0531ae0be 161 Power:
epgmdm 0:8fd0531ae0be 162 '0x00' – -18dBm
epgmdm 0:8fd0531ae0be 163 '0x01' – -12dBm
epgmdm 0:8fd0531ae0be 164 '0x02' – -6dBm
epgmdm 0:8fd0531ae0be 165 '0x03' – 0dBm
epgmdm 0:8fd0531ae0be 166 */
epgmdm 0:8fd0531ae0be 167 char NRF2401P::setRadio(char speed,char power)
epgmdm 0:8fd0531ae0be 168 {
epgmdm 0:8fd0531ae0be 169 char val=0;
epgmdm 0:8fd0531ae0be 170 sprintf(logMsg, "Set radio");
epgmdm 0:8fd0531ae0be 171 log(logMsg);
epgmdm 0:8fd0531ae0be 172 if (speed & 0x02) {
epgmdm 0:8fd0531ae0be 173 val |= (1<<5);
epgmdm 0:8fd0531ae0be 174 }
epgmdm 0:8fd0531ae0be 175 val |= (speed & 0x01)<<3;
epgmdm 0:8fd0531ae0be 176
epgmdm 0:8fd0531ae0be 177 val |= ((power &0x03)<<1);
epgmdm 0:8fd0531ae0be 178 writeReg (0x06,val);
epgmdm 0:8fd0531ae0be 179
epgmdm 0:8fd0531ae0be 180 }
epgmdm 0:8fd0531ae0be 181 /**
epgmdm 0:8fd0531ae0be 182 Set RF_CH = chan;
epgmdm 0:8fd0531ae0be 183
epgmdm 0:8fd0531ae0be 184 F0= 2400 + chan [MHz]
epgmdm 0:8fd0531ae0be 185 */
epgmdm 0:8fd0531ae0be 186 char NRF2401P::setChannel(char chan)
epgmdm 0:8fd0531ae0be 187 {
epgmdm 0:8fd0531ae0be 188 sprintf(logMsg, "Set channel");
epgmdm 0:8fd0531ae0be 189 log(logMsg);
epgmdm 0:8fd0531ae0be 190 writeReg (0x05,(chan&0x7f));
epgmdm 0:8fd0531ae0be 191 }
epgmdm 0:8fd0531ae0be 192 /**
epgmdm 0:8fd0531ae0be 193 * Transmits width bytes of data. width <32
epgmdm 0:8fd0531ae0be 194 */
epgmdm 0:8fd0531ae0be 195 char NRF2401P::transmitData( char *data, char width )
epgmdm 0:8fd0531ae0be 196 {
epgmdm 0:8fd0531ae0be 197 ce = 1;
epgmdm 0:8fd0531ae0be 198 csn = 0;
epgmdm 0:8fd0531ae0be 199 char address = 0XA0;
epgmdm 0:8fd0531ae0be 200 int i;
epgmdm 0:8fd0531ae0be 201 // set up for writing
epgmdm 0:8fd0531ae0be 202 status = spi->write( address );
epgmdm 0:8fd0531ae0be 203 for ( i = 0; i <width; i++ ) {
epgmdm 0:8fd0531ae0be 204 spi->write( data[ i ] );
epgmdm 0:8fd0531ae0be 205 }
epgmdm 0:8fd0531ae0be 206 csn = 1;
epgmdm 0:8fd0531ae0be 207 sprintf(logMsg, " Transmit data %d bytes to %02x (%02x) = %02x", width, address, status, data );
epgmdm 0:8fd0531ae0be 208 log(logMsg);
epgmdm 0:8fd0531ae0be 209 return status;
epgmdm 0:8fd0531ae0be 210
epgmdm 0:8fd0531ae0be 211 }
epgmdm 0:8fd0531ae0be 212
epgmdm 0:8fd0531ae0be 213 /**
epgmdm 0:8fd0531ae0be 214 * sets acknowledge data width bytes of data. width <32
epgmdm 0:8fd0531ae0be 215 */
epgmdm 0:8fd0531ae0be 216 char NRF2401P::acknowledgeData( char *data, char width, char pipe=1 )
epgmdm 0:8fd0531ae0be 217 {
epgmdm 0:8fd0531ae0be 218 ce = 1;
epgmdm 0:8fd0531ae0be 219 csn = 0;
epgmdm 0:8fd0531ae0be 220 writeReg(0x1d,0x06); // enable payload with ack
epgmdm 0:8fd0531ae0be 221 char address = 0XA8| (pipe&0x07);
epgmdm 0:8fd0531ae0be 222 int i;
epgmdm 0:8fd0531ae0be 223 // set up for writing
epgmdm 0:8fd0531ae0be 224 status = spi->write( address );
epgmdm 0:8fd0531ae0be 225 for ( i = 0; i <width; i++ ) {
epgmdm 0:8fd0531ae0be 226 spi->write( data[ i ] );
epgmdm 0:8fd0531ae0be 227 }
epgmdm 0:8fd0531ae0be 228 csn = 1;
epgmdm 0:8fd0531ae0be 229 sprintf(logMsg, " acknowledge data %d bytes to %02x (%02x) = %02x", width, address, status, *data );
epgmdm 0:8fd0531ae0be 230 log(logMsg);
epgmdm 0:8fd0531ae0be 231 return status;
epgmdm 0:8fd0531ae0be 232
epgmdm 0:8fd0531ae0be 233 }
epgmdm 0:8fd0531ae0be 234 /**
epgmdm 0:8fd0531ae0be 235 * Writes 1 byte data to a register
epgmdm 0:8fd0531ae0be 236 **/
epgmdm 0:8fd0531ae0be 237 char NRF2401P::writeReg( char address, char data )
epgmdm 0:8fd0531ae0be 238 {
epgmdm 0:8fd0531ae0be 239 char status = 0;
epgmdm 0:8fd0531ae0be 240 char reg;
epgmdm 0:8fd0531ae0be 241 csn = 0;
epgmdm 0:8fd0531ae0be 242 address &= 0x1F;
epgmdm 0:8fd0531ae0be 243 reg = address | 0x20;
epgmdm 0:8fd0531ae0be 244 status = spi->write( reg );
epgmdm 0:8fd0531ae0be 245 spi->write( data );
epgmdm 0:8fd0531ae0be 246 csn = 1;
epgmdm 0:8fd0531ae0be 247 sprintf(logMsg, " register write %02x (%02x) = %02x", address, status, data );
epgmdm 0:8fd0531ae0be 248 log(logMsg);
epgmdm 0:8fd0531ae0be 249 return status;
epgmdm 0:8fd0531ae0be 250 }
epgmdm 0:8fd0531ae0be 251 /**
epgmdm 0:8fd0531ae0be 252 * Writes width bytes data to a register, ls byte to ms byte /for adressess
epgmdm 0:8fd0531ae0be 253 **/
epgmdm 0:8fd0531ae0be 254 char NRF2401P::writeReg( char address, char *data, char width )
epgmdm 0:8fd0531ae0be 255 {
epgmdm 0:8fd0531ae0be 256 char reg;
epgmdm 0:8fd0531ae0be 257 csn = 0;
epgmdm 0:8fd0531ae0be 258 int i;
epgmdm 0:8fd0531ae0be 259 // set up for writing
epgmdm 0:8fd0531ae0be 260 address &= 0x1F;
epgmdm 0:8fd0531ae0be 261 reg = address| 0x20;
epgmdm 0:8fd0531ae0be 262 status = spi->write( reg );
epgmdm 0:8fd0531ae0be 263 for ( i = width - 1; i >= 0; i-- ) {
epgmdm 0:8fd0531ae0be 264 spi->write( data[ i ] );
epgmdm 0:8fd0531ae0be 265 }
epgmdm 0:8fd0531ae0be 266 csn = 1;
epgmdm 0:8fd0531ae0be 267 sprintf(logMsg, " register write %d bytes to %02x (%02x) = %02x %02x %02x", width, address, status, data[0], data[1], data[2] );
epgmdm 0:8fd0531ae0be 268 log(logMsg);
epgmdm 0:8fd0531ae0be 269 return status;
epgmdm 0:8fd0531ae0be 270 }
epgmdm 0:8fd0531ae0be 271 /**
epgmdm 0:8fd0531ae0be 272 * Reads 1 byte from a register
epgmdm 0:8fd0531ae0be 273 **/
epgmdm 0:8fd0531ae0be 274 char NRF2401P::readReg( char address, char *data )
epgmdm 0:8fd0531ae0be 275 {
epgmdm 0:8fd0531ae0be 276 csn = 0;
epgmdm 0:8fd0531ae0be 277 address &= 0x1F;
epgmdm 0:8fd0531ae0be 278 status = spi->write( address );
epgmdm 0:8fd0531ae0be 279 *data = spi->write( 0x00 );
epgmdm 0:8fd0531ae0be 280 csn = 1;
epgmdm 0:8fd0531ae0be 281 // sprintf(logMsg, " register read %02x (%02x) = %02x", address, status, *data );
epgmdm 0:8fd0531ae0be 282 // log(logMsg);
epgmdm 0:8fd0531ae0be 283 return status;
epgmdm 0:8fd0531ae0be 284 }
epgmdm 0:8fd0531ae0be 285 /**
epgmdm 0:8fd0531ae0be 286 * Clears the status flags RX_DR, TX_DS, MAX_RT
epgmdm 0:8fd0531ae0be 287 */
epgmdm 0:8fd0531ae0be 288 bool NRF2401P::clearStatus()
epgmdm 0:8fd0531ae0be 289 {
epgmdm 0:8fd0531ae0be 290 status = writeReg(0x07,0x70);
epgmdm 0:8fd0531ae0be 291 sprintf(logMsg, "Clear status (%02x)", status );
epgmdm 0:8fd0531ae0be 292 log(logMsg);
epgmdm 0:8fd0531ae0be 293 }
epgmdm 0:8fd0531ae0be 294 /**
epgmdm 0:8fd0531ae0be 295 * flushes TX FIFO and resets status flags
epgmdm 0:8fd0531ae0be 296 */
epgmdm 0:8fd0531ae0be 297 bool NRF2401P::flushTx()
epgmdm 0:8fd0531ae0be 298 {
epgmdm 0:8fd0531ae0be 299 csn = 0;
epgmdm 0:8fd0531ae0be 300 status = spi->write( 0xE1 );
epgmdm 0:8fd0531ae0be 301 csn = 1;
epgmdm 0:8fd0531ae0be 302 clearStatus();
epgmdm 0:8fd0531ae0be 303 sprintf(logMsg, "Flush TX FIFO (%02x)", status );
epgmdm 0:8fd0531ae0be 304 log(logMsg);
epgmdm 0:8fd0531ae0be 305 return;
epgmdm 0:8fd0531ae0be 306 }
epgmdm 0:8fd0531ae0be 307
epgmdm 0:8fd0531ae0be 308 /**
epgmdm 0:8fd0531ae0be 309 * flushes RX FIFO and resets status flags
epgmdm 0:8fd0531ae0be 310 */
epgmdm 0:8fd0531ae0be 311 bool NRF2401P::flushRx()
epgmdm 0:8fd0531ae0be 312 {
epgmdm 0:8fd0531ae0be 313 csn = 0;
epgmdm 0:8fd0531ae0be 314 status = spi->write( 0xE2 );
epgmdm 0:8fd0531ae0be 315 status = spi->write( 0xFF ); //Update status
epgmdm 0:8fd0531ae0be 316 csn = 1;
epgmdm 0:8fd0531ae0be 317 sprintf(logMsg, "Flush RX FIFO (%02x)", status );
epgmdm 0:8fd0531ae0be 318 log(logMsg);
epgmdm 0:8fd0531ae0be 319 }
epgmdm 0:8fd0531ae0be 320 /**
epgmdm 0:8fd0531ae0be 321 * Sets PRIM_RX = 0;
epgmdm 0:8fd0531ae0be 322 */
epgmdm 0:8fd0531ae0be 323 bool NRF2401P::setTxMode()
epgmdm 0:8fd0531ae0be 324 {
epgmdm 0:8fd0531ae0be 325 char data;
epgmdm 0:8fd0531ae0be 326 char bit;
epgmdm 0:8fd0531ae0be 327 sprintf(logMsg, "Set Tx Mode");
epgmdm 0:8fd0531ae0be 328 log(logMsg);
epgmdm 0:8fd0531ae0be 329 readReg( 0x00, &data );
epgmdm 0:8fd0531ae0be 330 data &= ~( 1 << 0 );
epgmdm 0:8fd0531ae0be 331 writeReg( 0x00, data );
epgmdm 0:8fd0531ae0be 332 // check
epgmdm 0:8fd0531ae0be 333 readReg( 0x00, &data );
epgmdm 0:8fd0531ae0be 334 bit = ( data >> 0 ) & 1;
epgmdm 0:8fd0531ae0be 335 ce=1;
epgmdm 0:8fd0531ae0be 336 clearStatus();
epgmdm 0:8fd0531ae0be 337 flushTx();
epgmdm 0:8fd0531ae0be 338 wait(0.003);
epgmdm 0:8fd0531ae0be 339 return ( bit == 0 );
epgmdm 0:8fd0531ae0be 340 }
epgmdm 0:8fd0531ae0be 341
epgmdm 0:8fd0531ae0be 342 /**
epgmdm 0:8fd0531ae0be 343 * Sets the number of bytes of the address width = 3,4,5
epgmdm 0:8fd0531ae0be 344 */
epgmdm 0:8fd0531ae0be 345 bool NRF2401P::setAddressWidth( char width )
epgmdm 0:8fd0531ae0be 346 {
epgmdm 0:8fd0531ae0be 347 addressWidth = width;
epgmdm 0:8fd0531ae0be 348 if ( ( width > 5 ) || ( width < 3 ) )
epgmdm 0:8fd0531ae0be 349 return false;
epgmdm 0:8fd0531ae0be 350 width -= 2;
epgmdm 0:8fd0531ae0be 351 return writeReg( 0x03, width );
epgmdm 0:8fd0531ae0be 352
epgmdm 0:8fd0531ae0be 353 }
epgmdm 0:8fd0531ae0be 354 /**
epgmdm 0:8fd0531ae0be 355 * Sets the address, uses addess width set (either 3,4 or 5)
epgmdm 0:8fd0531ae0be 356 */
epgmdm 0:8fd0531ae0be 357 char NRF2401P::setTxAddress( char *address )
epgmdm 0:8fd0531ae0be 358 {
epgmdm 0:8fd0531ae0be 359 writeReg( 0x0A, address, addressWidth ); //Write to RX_ADDR_P0
epgmdm 0:8fd0531ae0be 360 return writeReg( 0x10, address, addressWidth ); //Write to TX_ADDR
epgmdm 0:8fd0531ae0be 361
epgmdm 0:8fd0531ae0be 362 }
epgmdm 0:8fd0531ae0be 363
epgmdm 0:8fd0531ae0be 364 /**
epgmdm 0:8fd0531ae0be 365 * Sets the address, uses addess width set (either 3,4 or 5)
epgmdm 0:8fd0531ae0be 366 */
epgmdm 0:8fd0531ae0be 367 char NRF2401P::setTxAddress( long long address )
epgmdm 0:8fd0531ae0be 368 {
epgmdm 0:8fd0531ae0be 369
epgmdm 0:8fd0531ae0be 370 char buff[ 5 ];
epgmdm 0:8fd0531ae0be 371 buff[ 0 ] = address & 0xff;
epgmdm 0:8fd0531ae0be 372 buff[ 1 ] = ( address >> 8 ) & 0xFF;
epgmdm 0:8fd0531ae0be 373 buff[ 2 ] = ( address >> 16 ) & 0xFF;
epgmdm 0:8fd0531ae0be 374 buff[ 3 ] = ( address >> 24 ) & 0xFF;
epgmdm 0:8fd0531ae0be 375 buff[ 4 ] = ( address >> 32 ) & 0xFF;
epgmdm 0:8fd0531ae0be 376 return setTxAddress( buff );
epgmdm 0:8fd0531ae0be 377
epgmdm 0:8fd0531ae0be 378 }
epgmdm 0:8fd0531ae0be 379
epgmdm 0:8fd0531ae0be 380 /**
epgmdm 0:8fd0531ae0be 381 * Sets the address, uses addess width set (either 3,4 or 5)
epgmdm 0:8fd0531ae0be 382 */
epgmdm 0:8fd0531ae0be 383 char NRF2401P::setRxAddress( char *address, char pipe )
epgmdm 0:8fd0531ae0be 384 {
epgmdm 0:8fd0531ae0be 385 log ("Set Rx Address");
epgmdm 0:8fd0531ae0be 386 char reg = 0x0A + pipe;
epgmdm 0:8fd0531ae0be 387 switch ( pipe ) {
epgmdm 0:8fd0531ae0be 388 case ( 0 ) :
epgmdm 0:8fd0531ae0be 389 case ( 1 ) : {
epgmdm 0:8fd0531ae0be 390 status = writeReg( reg, address, addressWidth ); //Write to RX_ADDR_P0 or _P1
epgmdm 0:8fd0531ae0be 391 break;
epgmdm 0:8fd0531ae0be 392 }
epgmdm 0:8fd0531ae0be 393 case ( 2 ) :
epgmdm 0:8fd0531ae0be 394 case ( 3 ) :
epgmdm 0:8fd0531ae0be 395 case ( 4 ) :
epgmdm 0:8fd0531ae0be 396 case ( 5 ) : {
epgmdm 0:8fd0531ae0be 397 status = writeReg( reg, address, 1 ); //Write to RX_ADDR_P2 ... _P5
epgmdm 0:8fd0531ae0be 398 break;
epgmdm 0:8fd0531ae0be 399 }
epgmdm 0:8fd0531ae0be 400
epgmdm 0:8fd0531ae0be 401 }
epgmdm 0:8fd0531ae0be 402 // writeReg( 0x0A, address, addressWidth ); //Write to RX_ADDR_P0
epgmdm 0:8fd0531ae0be 403 return status;
epgmdm 0:8fd0531ae0be 404
epgmdm 0:8fd0531ae0be 405 }
epgmdm 0:8fd0531ae0be 406
epgmdm 0:8fd0531ae0be 407 /**
epgmdm 0:8fd0531ae0be 408 * Sets the address of pipe (<=5), uses addess width set (either 3,4 or 5)
epgmdm 0:8fd0531ae0be 409 */
epgmdm 0:8fd0531ae0be 410 char NRF2401P::setRxAddress( long long address, char pipe )
epgmdm 0:8fd0531ae0be 411 {
epgmdm 0:8fd0531ae0be 412 char buff[ 5 ];
epgmdm 0:8fd0531ae0be 413 buff[ 0 ] = address & 0xff;
epgmdm 0:8fd0531ae0be 414 buff[ 1 ] = ( address >> 8 ) & 0xFF;
epgmdm 0:8fd0531ae0be 415 buff[ 2 ] = ( address >> 16 ) & 0xFF;
epgmdm 0:8fd0531ae0be 416 buff[ 3 ] = ( address >> 24 ) & 0xFF;
epgmdm 0:8fd0531ae0be 417 buff[ 4 ] = ( address >> 32 ) & 0xFF;
epgmdm 0:8fd0531ae0be 418 return setRxAddress( buff, pipe );
epgmdm 0:8fd0531ae0be 419 }
epgmdm 0:8fd0531ae0be 420
epgmdm 0:8fd0531ae0be 421 bool NRF2401P::isRxData()
epgmdm 0:8fd0531ae0be 422 {
epgmdm 0:8fd0531ae0be 423 readReg(0x07,&status);
epgmdm 0:8fd0531ae0be 424 bool isData = (status>>6)&0x01;
epgmdm 0:8fd0531ae0be 425 return isData;
epgmdm 0:8fd0531ae0be 426 }
epgmdm 0:8fd0531ae0be 427 /**
epgmdm 0:8fd0531ae0be 428 * returns the width of the dynamic payload
epgmdm 0:8fd0531ae0be 429 */
epgmdm 0:8fd0531ae0be 430 char NRF2401P::getRxWidth()
epgmdm 0:8fd0531ae0be 431 {
epgmdm 0:8fd0531ae0be 432 char width;
epgmdm 0:8fd0531ae0be 433 if (dynamic) {
epgmdm 0:8fd0531ae0be 434 csn = 0;
epgmdm 0:8fd0531ae0be 435 status = spi->write( 0x60 );
epgmdm 0:8fd0531ae0be 436 width = spi->write(0x00);
epgmdm 0:8fd0531ae0be 437 csn = 1;
epgmdm 0:8fd0531ae0be 438
epgmdm 0:8fd0531ae0be 439 if (width>32) {
epgmdm 0:8fd0531ae0be 440 flushRx();
epgmdm 0:8fd0531ae0be 441 width=0;
epgmdm 0:8fd0531ae0be 442 }
epgmdm 0:8fd0531ae0be 443 } else {
epgmdm 0:8fd0531ae0be 444 status = readReg(0x12,&width); // width of p1
epgmdm 0:8fd0531ae0be 445
epgmdm 0:8fd0531ae0be 446 }
epgmdm 0:8fd0531ae0be 447 // width=18;
epgmdm 0:8fd0531ae0be 448 return width;
epgmdm 0:8fd0531ae0be 449 }
epgmdm 0:8fd0531ae0be 450 /**
epgmdm 0:8fd0531ae0be 451 * return message in buffer, mem for buffer must have been allocated.
epgmdm 0:8fd0531ae0be 452 * Return value is number of bytes of buffer
epgmdm 0:8fd0531ae0be 453 */
epgmdm 0:8fd0531ae0be 454 char NRF2401P::getRxData(char * buffer)
epgmdm 0:8fd0531ae0be 455 {
epgmdm 0:8fd0531ae0be 456 char address = 0x61;
epgmdm 0:8fd0531ae0be 457 char width;
epgmdm 0:8fd0531ae0be 458 width = getRxWidth();
epgmdm 0:8fd0531ae0be 459 bool isData = (status>>6)&0x01;
epgmdm 0:8fd0531ae0be 460 if (isData) {
epgmdm 0:8fd0531ae0be 461 csn = 0;
epgmdm 0:8fd0531ae0be 462 int i;
epgmdm 0:8fd0531ae0be 463 // set up for reading
epgmdm 0:8fd0531ae0be 464 status = spi->write( address );
epgmdm 0:8fd0531ae0be 465 for ( i = 0; i <= width; i++ ) {
epgmdm 0:8fd0531ae0be 466 buffer[i]=spi->write(0x00 );
epgmdm 0:8fd0531ae0be 467 }
epgmdm 0:8fd0531ae0be 468 csn = 1;
epgmdm 0:8fd0531ae0be 469 sprintf(logMsg, "Receive data %d bytes", width );
epgmdm 0:8fd0531ae0be 470 log(logMsg);
epgmdm 0:8fd0531ae0be 471 clearStatus();
epgmdm 0:8fd0531ae0be 472 return width;
epgmdm 0:8fd0531ae0be 473
epgmdm 0:8fd0531ae0be 474 } else {
epgmdm 0:8fd0531ae0be 475 sprintf(logMsg, "Receive NO data %d bytes", width );
epgmdm 0:8fd0531ae0be 476 log(logMsg);
epgmdm 0:8fd0531ae0be 477 clearStatus();
epgmdm 0:8fd0531ae0be 478 return 0;
epgmdm 0:8fd0531ae0be 479 }
epgmdm 0:8fd0531ae0be 480
epgmdm 0:8fd0531ae0be 481 }
epgmdm 0:8fd0531ae0be 482
epgmdm 0:8fd0531ae0be 483 /**
epgmdm 0:8fd0531ae0be 484 * Sets all the receive pipes to dynamic payload length
epgmdm 0:8fd0531ae0be 485 */
epgmdm 0:8fd0531ae0be 486 char NRF2401P::setDynamicPayload()
epgmdm 0:8fd0531ae0be 487 {
epgmdm 0:8fd0531ae0be 488 dynamic = true;
epgmdm 0:8fd0531ae0be 489 writeReg (0x1D,0x04);
epgmdm 0:8fd0531ae0be 490 return(writeReg(0x1C, 0x1F));
epgmdm 0:8fd0531ae0be 491 }
epgmdm 0:8fd0531ae0be 492 /**
epgmdm 0:8fd0531ae0be 493 * Sets PWR_UP = 1;
epgmdm 0:8fd0531ae0be 494 */
epgmdm 0:8fd0531ae0be 495 bool NRF2401P::setPwrUp()
epgmdm 0:8fd0531ae0be 496 {
epgmdm 0:8fd0531ae0be 497 char data;
epgmdm 0:8fd0531ae0be 498 char bit;
epgmdm 0:8fd0531ae0be 499 ce=1;
epgmdm 0:8fd0531ae0be 500 readReg( 0x00, &data );
epgmdm 0:8fd0531ae0be 501 data |= ( 0x02 );
epgmdm 0:8fd0531ae0be 502 writeReg( 0x00, data );
epgmdm 0:8fd0531ae0be 503 // check
epgmdm 0:8fd0531ae0be 504 readReg( 0x00, &data );
epgmdm 0:8fd0531ae0be 505 bit = ( data >> 1 ) & 1;
epgmdm 0:8fd0531ae0be 506 sprintf(logMsg, "Set PWR_UP to %x", bit);
epgmdm 0:8fd0531ae0be 507 log(logMsg);
epgmdm 0:8fd0531ae0be 508 wait(0.005); // wait 5ms
epgmdm 0:8fd0531ae0be 509 return ( bit == 1 );
epgmdm 0:8fd0531ae0be 510 }
epgmdm 0:8fd0531ae0be 511 /**
epgmdm 0:8fd0531ae0be 512 * Sets PRIM_RX = 0;
epgmdm 0:8fd0531ae0be 513 */
epgmdm 0:8fd0531ae0be 514 bool NRF2401P::setRxMode()
epgmdm 0:8fd0531ae0be 515 {
epgmdm 0:8fd0531ae0be 516 char data;
epgmdm 0:8fd0531ae0be 517 char bit;
epgmdm 0:8fd0531ae0be 518 ce=1;
epgmdm 0:8fd0531ae0be 519 readReg( 0x00, &data );
epgmdm 0:8fd0531ae0be 520 data |= ( 0x03 );
epgmdm 0:8fd0531ae0be 521 writeReg( 0x00, data );
epgmdm 0:8fd0531ae0be 522 // check
epgmdm 0:8fd0531ae0be 523 readReg( 0x00, &data );
epgmdm 0:8fd0531ae0be 524 bit = ( data >> 0 ) & 1;
epgmdm 0:8fd0531ae0be 525 sprintf(logMsg, " set PRIM_RX to %x", bit);
epgmdm 0:8fd0531ae0be 526 log(logMsg);
epgmdm 0:8fd0531ae0be 527 clearStatus();
epgmdm 0:8fd0531ae0be 528 flushRx();
epgmdm 0:8fd0531ae0be 529 return ( bit == 1 );
epgmdm 0:8fd0531ae0be 530 }
epgmdm 0:8fd0531ae0be 531 /**
epgmdm 0:8fd0531ae0be 532 * Prints status string
epgmdm 0:8fd0531ae0be 533 */
epgmdm 0:8fd0531ae0be 534 char * NRF2401P::statusString()
epgmdm 0:8fd0531ae0be 535 {
epgmdm 0:8fd0531ae0be 536 char *msg;
epgmdm 0:8fd0531ae0be 537 msg = statusS;
epgmdm 0:8fd0531ae0be 538 if (((status>>1) & 0x07)==0x07) {
epgmdm 0:8fd0531ae0be 539 sprintf(msg,"RX empty");
epgmdm 0:8fd0531ae0be 540 } else {
epgmdm 0:8fd0531ae0be 541 sprintf(msg,"pipe %02x",(status>>1) & 0x07);
epgmdm 0:8fd0531ae0be 542 }
epgmdm 0:8fd0531ae0be 543
epgmdm 0:8fd0531ae0be 544 if ((status>>6)&0x01) strcat(msg," RX_DR,");
epgmdm 0:8fd0531ae0be 545 if ((status>>5)&0x01) strcat(msg," TX_DS,");
epgmdm 0:8fd0531ae0be 546 if ((status>>4)&0x01) strcat(msg," MAX_RT,");
epgmdm 0:8fd0531ae0be 547 if ((status>>0)&0x01) strcat(msg," TX_FLL,");
epgmdm 0:8fd0531ae0be 548
epgmdm 0:8fd0531ae0be 549 return msg;
epgmdm 0:8fd0531ae0be 550 }