-
Notifications
You must be signed in to change notification settings - Fork 20
/
nrf24l01_18F67J60.h
468 lines (422 loc) · 18.3 KB
/
nrf24l01_18F67J60.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
/******************************************************************************
*
* File: nrf24l01.h
*
* Copyright S. Brennen Ball, 2006-2007
*
* The author provides no guarantees, warantees, or promises, implied or
* otherwise. By using this software you agree to indemnify the author
* of any damages incurred by using it.
*
*****************************************************************************/
#ifndef NRF24L01_18F67J60_H_
#define NRF24L01_18F67J60_H_
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 25000000
#ifndef bool
#define bool unsigned char
#endif
#ifndef false
#define false 0
#endif
#ifndef true
#define true !false
#endif
/////////////////////////////////////////////////////////////////////////////////
// SPI function requirements
//
// The user must define a function to send one byte of data and also return the
// resulting byte of data data through the SPI port. The function used here
// has the function prototype
//
// unsigned char spi_send_read_byte(unsigned char byte);
//
// This function should take the argument unsigned char byte and send it through
// the SPI port to the 24L01. Then, it should wait until the 24L01 has returned
// its response over SPI. This received byte should be the return value of the
// function.
//
// You should also change the include file name below to whatever the name of your
// SPI include file is.
//////////////////////////////////////////////////////////////////////////////////
#include "SPI18F67J60.h"
#define spi_send_read_byte(byte) writeSPIByte(byte)
//////////////////////////////////////////////////////////////////////////////////
// IO pin definitions
//
// Below you will find several definitions and includes. The first is an #include
// for your microcontroller's include file to allow you to use register names
// rather than numbers. The next three are to allow you to control the pins on
// the 24L01 that aren't automatically handled by SPI. These are CE, CSN, and
// IRQ.
//
// The general format of these defines is a define for the IO register the pin is
// attached to. The second define is a mask for the pin. For example, say that
// your CE pin is tied to an IO port with the register name IOPORT1. Also, let's
// say that the IO port is 8-bits wide, and you have attached the pin to pin 0 of
// the port. Then your define would look like this:
//
// #define nrf24l01_CE_IOREGISTER IOPORT1
// #define nrf24l01_CE_PINMASK 0x01
//
// If you have defines in your include file for individual IO pins, you could use
// this define in this file, as well. Using the previous example, assume that in
// your microcontroller's include file, pin 0 of IOPORT1 has a define like this
//
// #define IOPORT1_PIN0 0x01
//
// Then, you could make your defines for the CE pin in this file look like this:
//
// #define nrf24l01_CE_IOREGISTER IOPORT1
// #define nrf24l01_CE_PINMASK IOPORT1_PIN0
//
// You should also change the include file name below to whatever the name of your
// processor's register definition include file is.
/////////////////////////////////////////////////////////////////////////////////////
//defines for uC pins CE pin is connected to
//This is used so that the routines can send TX payload data and
// properly initialize the nrf24l01 in TX and RX states.
//Change these definitions (and then recompile) to suit your particular application.
#define nrf24l01_CE_IOREGISTER PORTC
#define nrf24l01_CE_PINMASK LATBbits.LATB0
//defines for uC pins CSN pin is connected to
//This is used so that the routines can send properly operate the SPI interface
// on the nrf24l01.
//Change these definitions (and then recompile) to suit your particular application.
#define nrf24l01_CSN_IOREGISTER PORTC
#define nrf24l01_CSN_PINMASK LATBbits.LATB1
//defines for uC pins IRQ pin is connected to
//This is used so that the routines can poll for IRQ or create an ISR.
//Change these definitions (and then recompile) to suit your particular application.
#define nrf24l01_IRQ_IOREGISTER PORTC
#define nrf24l01_IRQ_PINMASK LATCbits.LATC2
////////////////////////////////////////////////////////////////////////////////////
// SPI commands
//
// The following are defines for all of the commands and data masks on the SPI
// interface.
////////////////////////////////////////////////////////////////////////////////////
//SPI command defines
#define nrf24l01_R_REGISTER 0x00
#define nrf24l01_W_REGISTER 0x20
#define nrf24l01_R_RX_PAYLOAD 0x61
#define nrf24l01_W_TX_PAYLOAD 0xA0
#define nrf24l01_FLUSH_TX 0xE1
#define nrf24l01_FLUSH_RX 0xE2
#define nrf24l01_REUSE_TX_PL 0xE3
#define nrf24l01_NOP 0xFF
//SPI command data mask defines
#define nrf24l01_R_REGISTER_DATA 0x1F
#define nrf24l01_W_REGISTER_DATA 0x1F
////////////////////////////////////////////////////////////////////////////////////
// Register definitions
//
// Below are the defines for each register's address in the 24L01.
////////////////////////////////////////////////////////////////////////////////////
#define nrf24l01_CONFIG 0x00
#define nrf24l01_EN_AA 0x01
#define nrf24l01_EN_RXADDR 0x02
#define nrf24l01_SETUP_AW 0x03
#define nrf24l01_SETUP_RETR 0x04
#define nrf24l01_RF_CH 0x05
#define nrf24l01_RF_SETUP 0x06
#define nrf24l01_STATUS 0x07
#define nrf24l01_OBSERVE_TX 0x08
#define nrf24l01_CD 0x09
#define nrf24l01_RX_ADDR_P0 0x0A
#define nrf24l01_RX_ADDR_P1 0x0B
#define nrf24l01_RX_ADDR_P2 0x0C
#define nrf24l01_RX_ADDR_P3 0x0D
#define nrf24l01_RX_ADDR_P4 0x0E
#define nrf24l01_RX_ADDR_P5 0x0F
#define nrf24l01_TX_ADDR 0x10
#define nrf24l01_RX_PW_P0 0x11
#define nrf24l01_RX_PW_P1 0x12
#define nrf24l01_RX_PW_P2 0x13
#define nrf24l01_RX_PW_P3 0x14
#define nrf24l01_RX_PW_P4 0x15
#define nrf24l01_RX_PW_P5 0x16
#define nrf24l01_FIFO_STATUS 0x17
////////////////////////////////////////////////////////////////////////////////////
// Default register values
//
// Below are the defines for each register's default value in the 24L01. Multi-byte
// registers use notation B<X>, where "B" represents "byte" and <X> is the byte
// number.
////////////////////////////////////////////////////////////////////////////////////
#define nrf24l01_CONFIG_DEFAULT_VAL 0x08
#define nrf24l01_EN_AA_DEFAULT_VAL 0x3F
#define nrf24l01_EN_RXADDR_DEFAULT_VAL 0x03
#define nrf24l01_SETUP_AW_DEFAULT_VAL 0x03
#define nrf24l01_SETUP_RETR_DEFAULT_VAL 0x03
#define nrf24l01_RF_CH_DEFAULT_VAL 0x02
#define nrf24l01_RF_SETUP_DEFAULT_VAL 0x0F
#define nrf24l01_STATUS_DEFAULT_VAL 0x0E
#define nrf24l01_OBSERVE_TX_DEFAULT_VAL 0x00
#define nrf24l01_CD_DEFAULT_VAL 0x00
#define nrf24l01_RX_ADDR_P0_B0_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B1_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B2_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B3_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P0_B4_DEFAULT_VAL 0xE7
#define nrf24l01_RX_ADDR_P1_B0_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B1_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B2_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B3_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P1_B4_DEFAULT_VAL 0xC2
#define nrf24l01_RX_ADDR_P2_DEFAULT_VAL 0xC3
#define nrf24l01_RX_ADDR_P3_DEFAULT_VAL 0xC4
#define nrf24l01_RX_ADDR_P4_DEFAULT_VAL 0xC5
#define nrf24l01_RX_ADDR_P5_DEFAULT_VAL 0xC6
#define nrf24l01_TX_ADDR_B0_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B1_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B2_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B3_DEFAULT_VAL 0xE7
#define nrf24l01_TX_ADDR_B4_DEFAULT_VAL 0xE7
#define nrf24l01_RX_PW_P0_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P1_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P2_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P3_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P4_DEFAULT_VAL 0x00
#define nrf24l01_RX_PW_P5_DEFAULT_VAL 0x00
#define nrf24l01_FIFO_STATUS_DEFAULT_VAL 0x11
////////////////////////////////////////////////////////////////////////////////////
// Register bitwise definitions
//
// Below are the defines for each register's bitwise fields in the 24L01.
////////////////////////////////////////////////////////////////////////////////////
//CONFIG register bitwise definitions
#define nrf24l01_CONFIG_RESERVED 0x80
#define nrf24l01_CONFIG_MASK_RX_DR 0x40
#define nrf24l01_CONFIG_MASK_TX_DS 0x20
#define nrf24l01_CONFIG_MASK_MAX_RT 0x10
#define nrf24l01_CONFIG_EN_CRC 0x08
#define nrf24l01_CONFIG_CRCO 0x04
#define nrf24l01_CONFIG_PWR_UP 0x02
#define nrf24l01_CONFIG_PRIM_RX 0x01
//EN_AA register bitwise definitions
#define nrf24l01_EN_AA_RESERVED 0xC0
#define nrf24l01_EN_AA_ENAA_ALL 0x3F
#define nrf24l01_EN_AA_ENAA_P5 0x20
#define nrf24l01_EN_AA_ENAA_P4 0x10
#define nrf24l01_EN_AA_ENAA_P3 0x08
#define nrf24l01_EN_AA_ENAA_P2 0x04
#define nrf24l01_EN_AA_ENAA_P1 0x02
#define nrf24l01_EN_AA_ENAA_P0 0x01
#define nrf24l01_EN_AA_ENAA_NONE 0x00
//EN_RXADDR register bitwise definitions
#define nrf24l01_EN_RXADDR_RESERVED 0xC0
#define nrf24l01_EN_RXADDR_ERX_ALL 0x3F
#define nrf24l01_EN_RXADDR_ERX_P5 0x20
#define nrf24l01_EN_RXADDR_ERX_P4 0x10
#define nrf24l01_EN_RXADDR_ERX_P3 0x08
#define nrf24l01_EN_RXADDR_ERX_P2 0x04
#define nrf24l01_EN_RXADDR_ERX_P1 0x02
#define nrf24l01_EN_RXADDR_ERX_P0 0x01
#define nrf24l01_EN_RXADDR_ERX_NONE 0x00
//SETUP_AW register bitwise definitions
#define nrf24l01_SETUP_AW_RESERVED 0xFC
#define nrf24l01_SETUP_AW 0x03
#define nrf24l01_SETUP_AW_5BYTES 0x03
#define nrf24l01_SETUP_AW_4BYTES 0x02
#define nrf24l01_SETUP_AW_3BYTES 0x01
#define nrf24l01_SETUP_AW_ILLEGAL 0x00
//SETUP_RETR register bitwise definitions
#define nrf24l01_SETUP_RETR_ARD 0xF0
#define nrf24l01_SETUP_RETR_ARD_4000 0xF0
#define nrf24l01_SETUP_RETR_ARD_3750 0xE0
#define nrf24l01_SETUP_RETR_ARD_3500 0xD0
#define nrf24l01_SETUP_RETR_ARD_3250 0xC0
#define nrf24l01_SETUP_RETR_ARD_3000 0xB0
#define nrf24l01_SETUP_RETR_ARD_2750 0xA0
#define nrf24l01_SETUP_RETR_ARD_2500 0x90
#define nrf24l01_SETUP_RETR_ARD_2250 0x80
#define nrf24l01_SETUP_RETR_ARD_2000 0x70
#define nrf24l01_SETUP_RETR_ARD_1750 0x60
#define nrf24l01_SETUP_RETR_ARD_1500 0x50
#define nrf24l01_SETUP_RETR_ARD_1250 0x40
#define nrf24l01_SETUP_RETR_ARD_1000 0x30
#define nrf24l01_SETUP_RETR_ARD_750 0x20
#define nrf24l01_SETUP_RETR_ARD_500 0x10
#define nrf24l01_SETUP_RETR_ARD_250 0x00
#define nrf24l01_SETUP_RETR_ARC 0x0F
#define nrf24l01_SETUP_RETR_ARC_15 0x0F
#define nrf24l01_SETUP_RETR_ARC_14 0x0E
#define nrf24l01_SETUP_RETR_ARC_13 0x0D
#define nrf24l01_SETUP_RETR_ARC_12 0x0C
#define nrf24l01_SETUP_RETR_ARC_11 0x0B
#define nrf24l01_SETUP_RETR_ARC_10 0x0A
#define nrf24l01_SETUP_RETR_ARC_9 0x09
#define nrf24l01_SETUP_RETR_ARC_8 0x08
#define nrf24l01_SETUP_RETR_ARC_7 0x07
#define nrf24l01_SETUP_RETR_ARC_6 0x06
#define nrf24l01_SETUP_RETR_ARC_5 0x05
#define nrf24l01_SETUP_RETR_ARC_4 0x04
#define nrf24l01_SETUP_RETR_ARC_3 0x03
#define nrf24l01_SETUP_RETR_ARC_2 0x02
#define nrf24l01_SETUP_RETR_ARC_1 0x01
#define nrf24l01_SETUP_RETR_ARC_0 0x00
//RF_CH register bitwise definitions
#define nrf24l01_RF_CH_RESERVED 0x80
//RF_SETUP register bitwise definitions
#define nrf24l01_RF_SETUP_RESERVED 0xE0
#define nrf24l01_RF_SETUP_PLL_LOCK 0x10
#define nrf24l01_RF_SETUP_RF_DR 0x08
#define nrf24l01_RF_SETUP_RF_PWR 0x06
#define nrf24l01_RF_SETUP_RF_PWR_0 0x06
#define nrf24l01_RF_SETUP_RF_PWR_6 0x04
#define nrf24l01_RF_SETUP_RF_PWR_12 0x02
#define nrf24l01_RF_SETUP_RF_PWR_18 0x00
#define nrf24l01_RF_SETUP_LNA_HCURR 0x01
//STATUS register bitwise definitions
#define nrf24l01_STATUS_RESERVED 0x80
#define nrf24l01_STATUS_RX_DR 0x40
#define nrf24l01_STATUS_TX_DS 0x20
#define nrf24l01_STATUS_MAX_RT 0x10
#define nrf24l01_STATUS_RX_P_NO 0x0E
#define nrf24l01_STATUS_RX_P_NO_RX_FIFO_NOT_EMPTY 0x0E
#define nrf24l01_STATUS_RX_P_NO_UNUSED 0x0C
#define nrf24l01_STATUS_RX_P_NO_5 0x0A
#define nrf24l01_STATUS_RX_P_NO_4 0x08
#define nrf24l01_STATUS_RX_P_NO_3 0x06
#define nrf24l01_STATUS_RX_P_NO_2 0x04
#define nrf24l01_STATUS_RX_P_NO_1 0x02
#define nrf24l01_STATUS_RX_P_NO_0 0x00
#define nrf24l01_STATUS_TX_FULL 0x01
//OBSERVE_TX register bitwise definitions
#define nrf24l01_OBSERVE_TX_PLOS_CNT 0xF0
#define nrf24l01_OBSERVE_TX_ARC_CNT 0x0F
//CD register bitwise definitions
#define nrf24l01_CD_RESERVED 0xFE
#define nrf24l01_CD_CD 0x01
//RX_PW_P0 register bitwise definitions
#define nrf24l01_RX_PW_P0_RESERVED 0xC0
//RX_PW_P0 register bitwise definitions
#define nrf24l01_RX_PW_P0_RESERVED 0xC0
//RX_PW_P1 register bitwise definitions
#define nrf24l01_RX_PW_P1_RESERVED 0xC0
//RX_PW_P2 register bitwise definitions
#define nrf24l01_RX_PW_P2_RESERVED 0xC0
//RX_PW_P3 register bitwise definitions
#define nrf24l01_RX_PW_P3_RESERVED 0xC0
//RX_PW_P4 register bitwise definitions
#define nrf24l01_RX_PW_P4_RESERVED 0xC0
//RX_PW_P5 register bitwise definitions
#define nrf24l01_RX_PW_P5_RESERVED 0xC0
//FIFO_STATUS register bitwise definitions
#define nrf24l01_FIFO_STATUS_RESERVED 0x8C
#define nrf24l01_FIFO_STATUS_TX_REUSE 0x40
#define nrf24l01_FIFO_STATUS_TX_FULL 0x20
#define nrf24l01_FIFO_STATUS_TX_EMPTY 0x10
#define nrf24l01_FIFO_STATUS_RX_FULL 0x02
#define nrf24l01_FIFO_STATUS_RX_EMPTY 0x01
////////////////////////////////////////////////////////////////////////////////////
// Function declarations
//
// Below are all function definitions contained in the library. Please see
// nrf24l01.c for comments regarding the usage of each function.
////////////////////////////////////////////////////////////////////////////////////
//initialization functions
void nrf24l01_initialize(unsigned char config,
unsigned char opt_rx_standby_mode,
unsigned char en_aa,
unsigned char en_rxaddr,
unsigned char setup_aw,
unsigned char setup_retr,
unsigned char rf_ch,
unsigned char rf_setup,
unsigned char * rx_addr_p0,
unsigned char * rx_addr_p1,
unsigned char rx_addr_p2,
unsigned char rx_addr_p3,
unsigned char rx_addr_p4,
unsigned char rx_addr_p5,
unsigned char * tx_addr,
unsigned char rx_pw_p0,
unsigned char rx_pw_p1,
unsigned char rx_pw_p2,
unsigned char rx_pw_p3,
unsigned char rx_pw_p4,
unsigned char rx_pw_p5);
void nrf24l01_initialize_debug(bool rx, unsigned char p0_payload_width, bool enable_auto_ack);
void nrf24l01_initialize_debug_lite(bool rx, unsigned char p0_payload_width);
//power-up, power-down functions
void nrf24l01_power_up(bool rx_active_mode);
void nrf24l01_power_up_param(bool rx_active_mode, unsigned char config);
void nrf24l01_power_down(void);
void nrf24l01_power_down_param(unsigned char config);
//SPI commands defined by the spec
//for regnumber values, see section above titled "register definitions"
//all functions return the STATUS register
unsigned char nrf24l01_write_register(unsigned char regnumber, unsigned char * data, unsigned int len);
unsigned char nrf24l01_read_register(unsigned char regnumber, unsigned char * data, unsigned int len);
unsigned char nrf24l01_write_tx_payload(unsigned char * data, unsigned int len, bool transmit);
unsigned char nrf24l01_read_rx_payload(unsigned char * data, unsigned int len);
unsigned char nrf24l01_flush_tx(void);
unsigned char nrf24l01_flush_rx(void);
unsigned char nrf24l01_reuse_tx_pl(void);
unsigned char nrf24l01_nop(void);
//RX/TX setting functions
void nrf24l01_set_as_rx(bool rx_active_mode);
void nrf24l01_set_as_rx_param(bool rx_active_mode, unsigned char config);
void nrf24l01_rx_standby_to_active(void);
void nrf24l01_rx_active_to_standby(void);
void nrf24l01_set_as_tx(void);
void nrf24l01_set_as_tx_param(unsigned char config);
//register-oriented get/set functions for commonly-used registers during operation
unsigned char nrf24l01_get_config(void);
void nrf24l01_set_config(unsigned char config);
unsigned char nrf24l01_get_rf_ch(void);
void nrf24l01_set_rf_ch(unsigned char channel);
unsigned char nrf24l01_get_status(void);
unsigned char nrf24l01_get_observe_tx(void);
void nrf24l01_set_rx_addr(unsigned char * address, unsigned int len, unsigned char rxpipenum);
void nrf24l01_set_tx_addr(unsigned char * address, unsigned int len);
void nrf24l01_set_rx_pw(unsigned char payloadwidth, unsigned char rxpipenum);
unsigned char nrf24l01_get_rx_pw(unsigned char rxpipenum);
unsigned char nrf24l01_get_fifo_status(void);
//auto-ack and pipe-related functions
bool nrf24l01_aa_enabled(unsigned char rxpipenum);
void nrf24l01_aa_enable(unsigned char rxpipenum);
void nrf24l01_aa_disable(unsigned char rxpipenum);
bool nrf24l01_rx_pipe_enabled(unsigned char rxpipenum);
void nrf24l01_rx_pipe_enable(unsigned char rxpipenum);
void nrf24l01_rx_pipe_disable(unsigned char rxpipenum);
unsigned char nrf24l01_get_plos_cnt(void);
void nrf24l01_clear_plos_cnt(void);
void nrf24l01_clear_plos_cnt_param(unsigned char rf_ch);
unsigned char nrf24l01_get_arc_cnt(void);
//utility functions
bool nrf24l01_cd_active(void);
void nrf24l01_clear_flush(void);
unsigned char nrf24l01_get_rx_pipe(void);
unsigned char nrf24l01_get_rx_pipe_from_status(unsigned char status);
void nrf24l01_get_all_registers(unsigned char * data);
//interrupt check/clear functions
bool nrf24l01_irq_pin_active(void);
bool nrf24l01_irq_rx_dr_active(void);
bool nrf24l01_irq_tx_ds_active(void);
bool nrf24l01_irq_max_rt_active(void);
void nrf24l01_irq_clear_all(void);
void nrf24l01_irq_clear_rx_dr(void);
void nrf24l01_irq_clear_tx_ds(void);
void nrf24l01_irq_clear_max_rt(void);
//FIFO_STATUS check functions
bool nrf24l01_fifo_tx_reuse(void);
bool nrf24l01_fifo_tx_full(void);
bool nrf24l01_fifo_tx_empty(void);
bool nrf24l01_fifo_rx_full(void);
bool nrf24l01_fifo_rx_empty(void);
//IO interface-related functions
void nrf24l01_transmit(void);
void nrf24l01_clear_ce(void);
void nrf24l01_set_ce(void);
void nrf24l01_clear_csn(void);
void nrf24l01_set_csn(void);
bool nrf24l01_ce_pin_active(void);
bool nrf24l01_csn_pin_active(void);
//low-level functions for library use only
unsigned char nrf24l01_execute_command(unsigned char instruction, unsigned char * data, unsigned int len, bool copydata);
void nrf24l01_spi_send_read(unsigned char * data, unsigned int len, bool copydata);
#endif /*NRF24L01_H_*/