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
108
113
115{
116
117public:
124
132 nrf_to_nrf();
133
140 bool begin();
141
145 bool available();
146
150 bool available(uint8_t* pipe_num);
151
155 void read(void* buf, uint8_t len);
156
160 bool write(void* buf, uint8_t len, bool multicast = false, bool doEncryption = true);
161
166 void startListening(bool resetAddresses = true);
167
173 void stopListening(bool setWritingPipe = true, bool resetAddresses = true);
174
175 void stopListening(const uint8_t* txAddress, bool setWritingPipe = true, bool resetAddresses = true);
176
180 void openReadingPipe(uint8_t child, const uint8_t* address);
181
185 void openWritingPipe(const uint8_t* address);
186
190 bool isChipConnected();
191
199
207
211 bool writeFast(void* buf, uint8_t len, bool multicast = 0);
212
221 bool startWrite(void* buf, uint8_t len, bool multicast, bool doEncryption = true);
222
226 bool writeAckPayload(uint8_t pipe, void* buf, uint8_t len);
227
231 void enableAckPayload();
232
236 void disableAckPayload();
237
242
246 uint8_t getDynamicPayloadSize();
247
251 bool isValid();
252
256 void setChannel(uint8_t channel);
257
261 uint8_t getChannel();
262
266 bool setDataRate(uint8_t speed);
267
276 void setPALevel(uint8_t level, bool lnaEnable = true);
277
281 uint8_t getPALevel();
282
286 void setAutoAck(bool enable);
287
291 void setAutoAck(uint8_t pipe, bool enable);
292
299 void enableDynamicPayloads(uint8_t payloadSize = DEFAULT_MAX_PAYLOAD_SIZE);
300
305
309 void setPayloadSize(uint8_t size);
310
314 uint8_t getPayloadSize();
315
319 void setCRCLength(nrf_crclength_e length);
320
325
330
334 void setRetries(uint8_t retryVar, uint8_t attempts);
335
339 void openReadingPipe(uint8_t child, uint64_t address);
340
344 void openWritingPipe(uint64_t address);
345
349 void setAddressWidth(uint8_t a_width);
350
354 void printDetails();
355
363 void powerUp();
364
372 void powerDown();
373
378
384 bool txStandBy();
385
391 bool txStandBy(uint32_t timeout, bool startTx = 0);
392
397 bool testCarrier(uint8_t RSSI = 65);
398
403 bool testRPD(uint8_t RSSI = 65);
404
410 uint8_t getRSSI();
411
415 uint8_t getARC();
416
420 uint8_t flush_rx();
421
422#ifdef NRF_HAS_ENERGY_DETECT
423 uint8_t sample_ed(void);
424#endif
425
433
437 uint32_t addrConv32(uint32_t addr);
438#if defined CCM_ENCRYPTION_ENABLED || defined(DOXYGEN)
439
445 uint8_t encrypt(void* bufferIn, uint8_t size);
446
452 uint8_t decrypt(void* bufferIn, uint8_t size);
453
458
462 void setKey(uint8_t key[CCM_KEY_SIZE]);
463
467 void setCounter(uint64_t counter);
468
474 void setIV(uint8_t IV[CCM_IV_SIZE]);
475
492#endif
493
494private:
495 bool acksEnabled(uint8_t pipe);
496 bool acksPerPipe[8];
497 uint8_t retries;
498 uint8_t retryDuration;
499 uint8_t rxBuffer[ACTUAL_MAX_PAYLOAD_SIZE + 1];
500 uint8_t ackBuffer[ACTUAL_MAX_PAYLOAD_SIZE + 1];
501 uint8_t rxFifoAvailable;
502 bool DPL;
503 bool ackPayloadsEnabled;
504 bool inRxMode;
505 uint8_t staticPayloadSize;
506 uint8_t ackPID;
507 uint8_t ackPipe;
508 bool lastTxResult;
509 uint32_t rxBase;
510 uint32_t rxPrefix;
511 uint32_t txBase;
512 uint32_t txPrefix;
513 bool ackPayloadAvailable;
514 uint8_t ackAvailablePipeNo;
515 uint8_t lastPacketCounter;
516 uint16_t lastData;
517 bool dynamicAckEnabled;
518 uint8_t arcCounter;
519 uint16_t ackTimeout;
520 bool payloadAvailable;
521 bool restartReturnRx();
522 void openReadingPipe(uint8_t child, uint32_t base, uint32_t prefix);
523 void openWritingPipe(uint32_t base, uint32_t prefix);
524#if defined CCM_ENCRYPTION_ENABLED
525 uint8_t inBuffer[MAX_PACKET_SIZE + CCM_MIC_SIZE + CCM_START_SIZE];
526 uint8_t scratchPTR[MAX_PACKET_SIZE + CCM_MODE_LENGTH_EXTENDED];
527 typedef struct
528 {
529 uint8_t key[CCM_KEY_SIZE];
530 uint64_t counter;
531 uint8_t direction;
532 uint8_t iv[CCM_IV_SIZE_ACTUAL];
533 } ccmData_t;
534 ccmData_t ccmData;
535 uint32_t packetCounter;
536#endif
537};
538
549
553
557
561
565
569
573
577
581
585
589
593
597
601
602#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:206
void setChannel(uint8_t channel)
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)
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:490
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()
uint8_t outBuffer[MAX_PACKET_SIZE+CCM_MIC_SIZE+CCM_START_SIZE]
Definition nrf_to_nrf.h:457
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:377
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_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