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 258
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// The nRF54L15 CCM is a different peripheral with no NRF_CCM; with the nrf54l15clean core
32// (https://github.com/lolren/nrf54-arduino-core) encryption uses its Ccm and CracenRng classes
33#if defined(ARDUINO_NRF54L15) && defined(ARDUINO_ARCH_NRF54L15CLEAN)
34 #define NRF54_CCM_ENCRYPTION
35#endif
36#if defined NRF_CCM || defined NRF54_CCM_ENCRYPTION || defined(DOXYGEN)
37 #define CCM_ENCRYPTION_ENABLED
38#endif
39#if defined CCM_ENCRYPTION_ENABLED || defined(DOXYGEN)
40 #define MAX_PACKET_SIZE ACTUAL_MAX_PAYLOAD_SIZE // Max Payload Size
41 #define CCM_KEY_SIZE 16
42 #define CCM_IV_SIZE 5
43 #define CCM_IV_SIZE_ACTUAL 8
44 #define CCM_COUNTER_SIZE 3
45 #define CCM_MIC_SIZE 4
46 #define CCM_START_SIZE 3
47 #define CCM_MODE_LENGTH_EXTENDED 16
48#endif
49
73
83typedef enum
84{
91#ifdef ARDUINO_NRF54L15
93 ,
94 NRF_4MBPS_OBT4,
96 NRF_4MBPS_OBT6
97#endif
99
122
127
129{
130
131public:
138
146 nrf_to_nrf();
147
154 bool begin();
155
159 bool available();
160
164 bool available(uint8_t* pipe_num);
165
169 void read(void* buf, uint8_t len);
170
174 bool write(void* buf, uint8_t len, bool multicast = false, bool doEncryption = true);
175
180 void startListening(bool resetAddresses = true);
181
187 void stopListening(bool setWritingPipe = true, bool resetAddresses = true);
188
189 void stopListening(const uint8_t* txAddress, bool setWritingPipe = true, bool resetAddresses = true);
190
194 void openReadingPipe(uint8_t child, const uint8_t* address);
195
199 void openWritingPipe(const uint8_t* address);
200
204 bool isChipConnected();
205
213
221
225 bool writeFast(void* buf, uint8_t len, bool multicast = 0);
226
235 bool startWrite(void* buf, uint8_t len, bool multicast, bool doEncryption = true);
236
240 bool writeAckPayload(uint8_t pipe, void* buf, uint8_t len);
241
245 void enableAckPayload();
246
250 void disableAckPayload();
251
256
260 uint8_t getDynamicPayloadSize();
261
265 bool isValid();
266
272 void setChannel(uint8_t channel, bool map = 0);
273
277 uint8_t getChannel();
278
282 bool setDataRate(uint8_t speed);
283
292 void setPALevel(uint8_t level, bool lnaEnable = true);
293
297 uint8_t getPALevel();
298
302 void setAutoAck(bool enable);
303
307 void setAutoAck(uint8_t pipe, bool enable);
308
315 void enableDynamicPayloads(uint8_t payloadSize = DEFAULT_MAX_PAYLOAD_SIZE);
316
321
326 void setPayloadSize(uint8_t size);
327
331 uint8_t getPayloadSize();
332
345 void setCRCLength(nrf_crclength_e length);
346
351
356
360 void setRetries(uint8_t retryVar, uint8_t attempts);
361
365 void openReadingPipe(uint8_t child, uint64_t address);
366
370 void openWritingPipe(uint64_t address);
371
375 void setAddressWidth(uint8_t a_width);
376
380 void printDetails();
381
389 void powerUp();
390
398 void powerDown();
399
404
410 bool txStandBy();
411
417 bool txStandBy(uint32_t timeout, bool startTx = 0);
418
423 bool testCarrier(uint8_t RSSI = 65);
424
429 bool testRPD(uint8_t RSSI = 65);
430
436 uint8_t getRSSI();
437
441 uint8_t getARC();
442
446 uint8_t flush_rx();
447
459
460#ifdef NRF_HAS_ENERGY_DETECT
461 uint8_t sample_ed(void);
462#endif
463
471
475 uint32_t addrConv32(uint32_t addr);
476#if defined CCM_ENCRYPTION_ENABLED || defined(DOXYGEN)
477
483 uint8_t encrypt(void* bufferIn, uint8_t size);
484
490 uint8_t decrypt(void* bufferIn, uint8_t size);
491
496
500 void setKey(uint8_t key[CCM_KEY_SIZE]);
501
505 void setCounter(uint64_t counter);
506
512 void setIV(uint8_t IV[CCM_IV_SIZE]);
513
530#endif
531
532private:
533 bool acksEnabled(uint8_t pipe);
534 bool acksPerPipe[8];
535 uint8_t retries;
536 uint8_t retryDuration;
537 uint8_t rxBuffer[ACTUAL_MAX_PAYLOAD_SIZE + 1];
538 uint8_t ackBuffer[ACTUAL_MAX_PAYLOAD_SIZE + 1];
539 uint8_t rxFifoAvailable;
540 bool DPL;
541 bool ackPayloadsEnabled;
542 bool inRxMode;
543 uint8_t staticPayloadSize;
544 uint8_t ackPID;
545 uint8_t ackPipe;
546 bool lastTxResult;
547 uint32_t rxBase;
548 uint32_t rxPrefix;
549 uint32_t txBase;
550 uint32_t txPrefix;
551 bool ackPayloadAvailable;
552 uint8_t ackAvailablePipeNo;
553 uint8_t lastPacketCounter;
554 uint16_t lastData;
555 bool dynamicAckEnabled;
556 uint8_t arcCounter;
557 uint16_t ackTimeout;
558 bool payloadAvailable;
559 bool restartReturnRx();
560 void openReadingPipe(uint8_t child, uint32_t base, uint32_t prefix);
561 void openWritingPipe(uint32_t base, uint32_t prefix);
562#if defined CCM_ENCRYPTION_ENABLED
563 uint8_t inBuffer[MAX_PACKET_SIZE + CCM_MIC_SIZE + CCM_START_SIZE];
564 uint8_t scratchPTR[MAX_PACKET_SIZE + CCM_MODE_LENGTH_EXTENDED];
565 typedef struct
566 {
567 uint8_t key[CCM_KEY_SIZE];
568 uint64_t counter;
569 uint8_t direction;
570 uint8_t iv[CCM_IV_SIZE_ACTUAL];
571 } ccmData_t;
572 ccmData_t ccmData;
573 uint32_t packetCounter;
574 bool generateIV(uint8_t iv[CCM_IV_SIZE]);
575#endif
576};
577
588
592
596
600
604
608
612
616
620
624
628
632
636
640
641#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:220
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 writeAckPayload(uint8_t pipe, void *buf, uint8_t len)
bool enableEncryption
Definition nrf_to_nrf.h:528
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:458
uint8_t outBuffer[MAX_PACKET_SIZE+CCM_MIC_SIZE+CCM_START_SIZE]
Definition nrf_to_nrf.h:495
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:403
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:47
#define DEFAULT_MAX_PAYLOAD_SIZE
Definition nrf_to_nrf.h:20
nrf_pa_dbm_e
Definition nrf_to_nrf.h:51
@ NRF_PA_MAX
Definition nrf_to_nrf.h:67
@ NRF_PA_HIGH
Definition nrf_to_nrf.h:63
@ NRF_PA_LOW
Definition nrf_to_nrf.h:59
@ NRF_PA_MIN
Definition nrf_to_nrf.h:55
@ NRF_PA_ERROR
Definition nrf_to_nrf.h:71
nrf_crclength_e
Definition nrf_to_nrf.h:112
@ NRF_CRC_8
Definition nrf_to_nrf.h:116
@ NRF_CRC_24
Definition nrf_to_nrf.h:120
@ NRF_CRC_DISABLED
Definition nrf_to_nrf.h:114
@ NRF_CRC_16
Definition nrf_to_nrf.h:118
#define CCM_IV_SIZE_ACTUAL
Definition nrf_to_nrf.h:43
nrf_datarate_e
Definition nrf_to_nrf.h:84
@ NRF_1MBPS
Definition nrf_to_nrf.h:86
@ NRF_2MBPS
Definition nrf_to_nrf.h:88
@ NRF_250KBPS
Definition nrf_to_nrf.h:90
#define CCM_START_SIZE
Definition nrf_to_nrf.h:46
#define ACTUAL_MAX_PAYLOAD_SIZE
Definition nrf_to_nrf.h:21
#define MAX_PACKET_SIZE
Definition nrf_to_nrf.h:40
#define CCM_MIC_SIZE
Definition nrf_to_nrf.h:45
#define CCM_KEY_SIZE
Definition nrf_to_nrf.h:41
#define CCM_IV_SIZE
Definition nrf_to_nrf.h:42