nrf_to_nrf - NRF52 Radio Driver v1.2.2
TMRh20 2023 - OSI Layer 2 radio driver using RF24 API
Loading...
Searching...
No Matches
nrf_to_nrf.h
Go to the documentation of this file.
1
7#ifndef __nrf52840_nrf24l01_H__
8#define __nrf52840_nrf24l01_H__
9#include <Arduino.h>
10#if defined(USE_TINYUSB)
11 // Needed for Serial.print on non-MBED enabled or adafruit-based nRF52 cores
12 #include "Adafruit_TinyUSB.h"
13#endif
14
15#if defined(NRF52811_XXAA) || defined(NRF52820_XXAA) || defined(NRF52833_XXAA) || defined(NRF52840_XXAA)
16 #define NRF_HAS_ENERGY_DETECT
17#endif
18
19#define NRF52_RADIO_LIBRARY
20#define DEFAULT_MAX_PAYLOAD_SIZE 32
21#define ACTUAL_MAX_PAYLOAD_SIZE 127
22#define ACK_TIMEOUT_1MBPS 600 // 300 with static payloads
23#define ACK_TIMEOUT_2MBPS 400 // 265 with static payloads
24#define ACK_TIMEOUT_250KBPS 800 // 500 with staticPayloads
25#define ACK_TIMEOUT_1MBPS_OFFSET 300
26#define ACK_TIMEOUT_2MBPS_OFFSET 135
27#define ACK_TIMEOUT_250KBPS_OFFSET 300
28#define ACK_PAYLOAD_TIMEOUT_OFFSET 750
29
30// AES CCM ENCRYPTION
31#if defined NRF_CCM || defined(DOXYGEN)
32 #define CCM_ENCRYPTION_ENABLED
33#endif
34#if defined CCM_ENCRYPTION_ENABLED || defined(DOXYGEN)
35 #define MAX_PACKET_SIZE ACTUAL_MAX_PAYLOAD_SIZE // Max Payload Size
36 #define CCM_KEY_SIZE 16
37 #define CCM_IV_SIZE 5
38 #define CCM_IV_SIZE_ACTUAL 8
39 #define CCM_COUNTER_SIZE 3
40 #define CCM_MIC_SIZE 4
41 #define CCM_START_SIZE 3
42 #define CCM_MODE_LENGTH_EXTENDED 16
43#endif
44
68
87
110
115
117{
118
119public:
126
134 nrf_to_nrf();
135
142 bool begin();
143
147 bool available();
148
152 bool available(uint8_t* pipe_num);
153
157 void read(void* buf, uint8_t len);
158
162 bool write(void* buf, uint8_t len, bool multicast = false, bool doEncryption = true);
163
168 void startListening(bool resetAddresses = true);
169
175 void stopListening(bool setWritingPipe = true, bool resetAddresses = true);
176
177 void stopListening(const uint8_t* txAddress, bool setWritingPipe = true, bool resetAddresses = true);
178
182 void openReadingPipe(uint8_t child, const uint8_t* address);
183
187 void openWritingPipe(const uint8_t* address);
188
192 bool isChipConnected();
193
201
209
213 bool writeFast(void* buf, uint8_t len, bool multicast = 0);
214
223 bool startWrite(void* buf, uint8_t len, bool multicast, bool doEncryption = true);
224
228 bool writeAckPayload(uint8_t pipe, void* buf, uint8_t len);
229
233 void enableAckPayload();
234
238 void disableAckPayload();
239
244
248 uint8_t getDynamicPayloadSize();
249
253 bool isValid();
254
260 void setChannel(uint8_t channel, bool map = 0);
261
265 uint8_t getChannel();
266
270 bool setDataRate(uint8_t speed);
271
280 void setPALevel(uint8_t level, bool lnaEnable = true);
281
285 uint8_t getPALevel();
286
290 void setAutoAck(bool enable);
291
295 void setAutoAck(uint8_t pipe, bool enable);
296
303 void enableDynamicPayloads(uint8_t payloadSize = DEFAULT_MAX_PAYLOAD_SIZE);
304
309
313 void setPayloadSize(uint8_t size);
314
318 uint8_t getPayloadSize();
319
332 void setCRCLength(nrf_crclength_e length);
333
338
343
347 void setRetries(uint8_t retryVar, uint8_t attempts);
348
352 void openReadingPipe(uint8_t child, uint64_t address);
353
357 void openWritingPipe(uint64_t address);
358
362 void setAddressWidth(uint8_t a_width);
363
367 void printDetails();
368
376 void powerUp();
377
385 void powerDown();
386
391
397 bool txStandBy();
398
404 bool txStandBy(uint32_t timeout, bool startTx = 0);
405
410 bool testCarrier(uint8_t RSSI = 65);
411
416 bool testRPD(uint8_t RSSI = 65);
417
423 uint8_t getRSSI();
424
428 uint8_t getARC();
429
433 uint8_t flush_rx();
434
446
447#ifdef NRF_HAS_ENERGY_DETECT
448 uint8_t sample_ed(void);
449#endif
450
458
462 uint32_t addrConv32(uint32_t addr);
463#if defined CCM_ENCRYPTION_ENABLED || defined(DOXYGEN)
464
470 uint8_t encrypt(void* bufferIn, uint8_t size);
471
477 uint8_t decrypt(void* bufferIn, uint8_t size);
478
483
487 void setKey(uint8_t key[CCM_KEY_SIZE]);
488
492 void setCounter(uint64_t counter);
493
499 void setIV(uint8_t IV[CCM_IV_SIZE]);
500
517#endif
518
519private:
520 bool acksEnabled(uint8_t pipe);
521 bool acksPerPipe[8];
522 uint8_t retries;
523 uint8_t retryDuration;
524 uint8_t rxBuffer[ACTUAL_MAX_PAYLOAD_SIZE + 1];
525 uint8_t ackBuffer[ACTUAL_MAX_PAYLOAD_SIZE + 1];
526 uint8_t rxFifoAvailable;
527 bool DPL;
528 bool ackPayloadsEnabled;
529 bool inRxMode;
530 uint8_t staticPayloadSize;
531 uint8_t ackPID;
532 uint8_t ackPipe;
533 bool lastTxResult;
534 uint32_t rxBase;
535 uint32_t rxPrefix;
536 uint32_t txBase;
537 uint32_t txPrefix;
538 bool ackPayloadAvailable;
539 uint8_t ackAvailablePipeNo;
540 uint8_t lastPacketCounter;
541 uint16_t lastData;
542 bool dynamicAckEnabled;
543 uint8_t arcCounter;
544 uint16_t ackTimeout;
545 bool payloadAvailable;
546 bool restartReturnRx();
547 void openReadingPipe(uint8_t child, uint32_t base, uint32_t prefix);
548 void openWritingPipe(uint32_t base, uint32_t prefix);
549#if defined CCM_ENCRYPTION_ENABLED
550 uint8_t inBuffer[MAX_PACKET_SIZE + CCM_MIC_SIZE + CCM_START_SIZE];
551 uint8_t scratchPTR[MAX_PACKET_SIZE + CCM_MODE_LENGTH_EXTENDED];
552 typedef struct
553 {
554 uint8_t key[CCM_KEY_SIZE];
555 uint64_t counter;
556 uint8_t direction;
557 uint8_t iv[CCM_IV_SIZE_ACTUAL];
558 } ccmData_t;
559 ccmData_t ccmData;
560 uint32_t packetCounter;
561#endif
562};
563
574
578
582
586
590
594
598
602
606
610
614
618
622
626
627#endif //__nrf52840_nrf24l01_H__
void startListening(bool resetAddresses=true)
void openReadingPipe(uint8_t child, const uint8_t *address)
bool available()
void setPALevel(uint8_t level, bool lnaEnable=true)
bool testCarrier(uint8_t RSSI=65)
bool txStandBy()
uint8_t decrypt(void *bufferIn, uint8_t size)
uint8_t radioData[ACTUAL_MAX_PAYLOAD_SIZE+2]
Definition nrf_to_nrf.h:208
uint32_t addrConv32(uint32_t addr)
void disableDynamicPayloads()
bool write(void *buf, uint8_t len, bool multicast=false, bool doEncryption=true)
bool testRPD(uint8_t RSSI=65)
void setCounter(uint64_t counter)
bool isChipConnected()
void setAddressWidth(uint8_t a_width)
void setChannel(uint8_t channel, bool map=0)
uint8_t getDynamicPayloadSize()
bool setDataRate(uint8_t speed)
bool isValid()
void enableDynamicAck()
void setKey(uint8_t key[CCM_KEY_SIZE])
bool begin()
bool writeAckPayload(uint8_t pipe, void *buf, uint8_t len)
bool enableEncryption
Definition nrf_to_nrf.h:515
void enableDynamicPayloads(uint8_t payloadSize=DEFAULT_MAX_PAYLOAD_SIZE)
void disableAckPayload()
void disableCRC()
void powerDown()
uint8_t getARC()
uint8_t flush_rx()
uint8_t encrypt(void *bufferIn, uint8_t size)
void printDetails()
uint8_t getChannel()
bool startWrite(void *buf, uint8_t len, bool multicast, bool doEncryption=true)
uint8_t getRSSI()
uint16_t interframeSpacing
Definition nrf_to_nrf.h:445
uint8_t outBuffer[MAX_PACKET_SIZE+CCM_MIC_SIZE+CCM_START_SIZE]
Definition nrf_to_nrf.h:482
void setRetries(uint8_t retryVar, uint8_t attempts)
void enableAckPayload()
void openWritingPipe(const uint8_t *address)
void setCRCLength(nrf_crclength_e length)
bool failureDetected
Definition nrf_to_nrf.h:390
bool writeFast(void *buf, uint8_t len, bool multicast=0)
uint8_t getPALevel()
void setAutoAck(bool enable)
void read(void *buf, uint8_t len)
void stopListening(bool setWritingPipe=true, bool resetAddresses=true)
void setIV(uint8_t IV[CCM_IV_SIZE])
void setPayloadSize(uint8_t size)
nrf_crclength_e getCRCLength()
uint8_t getPayloadSize()
#define CCM_MODE_LENGTH_EXTENDED
Definition nrf_to_nrf.h:42
#define DEFAULT_MAX_PAYLOAD_SIZE
Definition nrf_to_nrf.h:20
nrf_pa_dbm_e
Definition nrf_to_nrf.h:46
@ NRF_PA_MAX
Definition nrf_to_nrf.h:62
@ NRF_PA_HIGH
Definition nrf_to_nrf.h:58
@ NRF_PA_LOW
Definition nrf_to_nrf.h:54
@ NRF_PA_MIN
Definition nrf_to_nrf.h:50
@ NRF_PA_ERROR
Definition nrf_to_nrf.h:66
nrf_crclength_e
Definition nrf_to_nrf.h:100
@ NRF_CRC_8
Definition nrf_to_nrf.h:104
@ NRF_CRC_24
Definition nrf_to_nrf.h:108
@ NRF_CRC_DISABLED
Definition nrf_to_nrf.h:102
@ NRF_CRC_16
Definition nrf_to_nrf.h:106
#define CCM_IV_SIZE_ACTUAL
Definition nrf_to_nrf.h:38
nrf_datarate_e
Definition nrf_to_nrf.h:79
@ NRF_1MBPS
Definition nrf_to_nrf.h:81
@ NRF_2MBPS
Definition nrf_to_nrf.h:83
@ NRF_250KBPS
Definition nrf_to_nrf.h:85
#define CCM_START_SIZE
Definition nrf_to_nrf.h:41
#define ACTUAL_MAX_PAYLOAD_SIZE
Definition nrf_to_nrf.h:21
#define MAX_PACKET_SIZE
Definition nrf_to_nrf.h:35
#define CCM_MIC_SIZE
Definition nrf_to_nrf.h:40
#define CCM_KEY_SIZE
Definition nrf_to_nrf.h:36
#define CCM_IV_SIZE
Definition nrf_to_nrf.h:37