This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

nRF24L01+ on a Teensy 4.0, transmit says the max number of retransmits is reached but I can't tell if it's actually transmitting

Hello!

I am trying to get basic communication between two nRF24L01+ modules to work on Teensy 4.0's, but I am having trouble transmitting and receiving.

Here is the wiring:

Teensy | NRF24L01+
           8 | CE 1
           9 | IRQ 6
 CSN 10 | CSN 2
MOSI 11 | MOSI 4
MISO 12 | MISO 5
SCK 13 | SCK 3

Here is my configuration on each device:

Receiver:

STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xbadbadbadb
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xe7e7e7e7e7
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x4c
RF_SETUP = 0x07
CONFIG = 0x0f
DYNPD/FEATURE = 0x3f 0x06
OBSERVE_TX = 0x00
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_HIGH

Transmitter:

STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xc2c2c2c2c2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x00 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x01
RF_CH = 0x4c
RF_SETUP = 0x07
CONFIG = 0x0e
DYNPD/FEATURE = 0x3f 0x06
OBSERVE_TX = 0x00
Data Rate        = 1MBPS
Model            = nRF24L01+
CRC Length       = 16 bits
PA Power         = PA_HIGH

On the Transmitter I run:

  char rttmsg = 0xAA;
  // Fill the TX FIFO
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  SPI.transfer(0b10100000);
  SPI.transfer(rttmsg);
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
  
  // Begin Transmitting
  digitalWriteFast(NRF24_CE, HIGH);

And on the Receiver, I run: (I start the receiving before the transmitting)

  digitalWriteFast(NRF24_CE, HIGH);

and then I check the status in a loop to see if anything appears in the RX FIFO, and so far nothing ever does.

On the transmitter, the status says that there is data in TX FIFO, then after another loop, it says the maximum number of retransmits is reached. 

I don't know why I can't see any data on the Receiver, and why the transmitter never says anything has been transmitted. Is the transmitter not saying any packets were transmitted because no ack comes back? Is it an issue on my RX or my TX?

if you want to read more in-depth, here is the entire code base:

#include <Arduino.h>

char tombStone[5] = {0x00, 0x00, 0x00, 0x00, 0x00}; //addr0 for empty node

bool compareAddresses(char addr1[5], char addr2[5])
{
    bool same = true;
    for (int i = 0; i < 5; i++)
    {
        if (addr1[i] != addr2[i])
        {
            same = false;
        }
    }
    return same;
}

void printAddress(char addr[5])
{

    Serial.print(addr[0], HEX);
    Serial.print(":");
    Serial.print(addr[1], HEX);
    Serial.print(":");
    Serial.print(addr[2], HEX);
    Serial.print(":");
    Serial.print(addr[3], HEX);
    Serial.print(":");
    Serial.println(addr[4], HEX);
}

void copyAddress(char *newAddr, char oldAddr[5])
{
    newAddr[0] = oldAddr[0];
    newAddr[1] = oldAddr[1];
    newAddr[2] = oldAddr[2];
    newAddr[3] = oldAddr[3];
    newAddr[4] = oldAddr[4];
}

void printPaddedHex(uint32_t data, unsigned int digits) {
    Serial.print("0x");
    for (unsigned long i = digits - 1; i > 0; i--) {
        if ((data >> (i*4)) == 0) {
            Serial.print("0");
        }
    }
    Serial.print(data, HEX);
}

#include <SPI.h>

//           Teensy pin | NRF24L01+ pin
#define NRF24_CE 8       //ce        1
#define NRF24_IRQ 9      //IRQ pin   6
#define NRF24_CSN 10     //csn pin   2
#define NRF24_MOSI 11    //MOSI      4
#define NRF24_MISO 12    //MISO      5
#define NRF24_SCK 13     //SCK pin   3

#define NRF24_SETTINGS_DELAY 0 //Delay after setting register
#define NRF24_SPI_SPEED 1000000

extern char selfaddr0[5]; //addr0 for incoming messages
extern char comaddr[5];   //0x0000000002

extern volatile uint32_t last_nrf_irq;


char selfaddr0[5] = {0x00, 0x01, 0x02, 0x03, 0x04}; //addr0 for incoming messages
char comaddr[5] = {0x02, 0x00, 0x00, 0x00, 0x00};   //0x0000000002

volatile uint32_t last_nrf_irq = 0;

void nrfRegWrite(char regNum, char regDataLen, char *regData)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  char spiCommand = 0b00100000 | (0b00011111 & regNum);
  SPI.transfer(spiCommand);
  for (int i = 0; i < regDataLen; i++)
  {
    SPI.transfer(regData[i]);
  }
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

void nrfRegRead(char regNum, char regDataLen, char *regData)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  char spiCommand = 0b00000000 | (0b00011111 & regNum);
  SPI.transfer(spiCommand);
  for (int i = 0; i < regDataLen; i++)
  {
    regData[i] = SPI.transfer(0x00);
  }
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

void nrfRegWriteByte(char regNum, char regByte)
{
  nrfRegWrite(regNum, 1, &regByte);
}

char nrfRegReadByte(char regNum)
{
  char result;
  nrfRegRead(regNum, 1, &result);
  return result;
}

void nrfFlushTx(void)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  SPI.transfer(0b11100001);
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

void nrfFlushRx(void)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  SPI.transfer(0b1100010);
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

void nrfWritePayload(char fifoDataLen, char *fifoData)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  SPI.transfer(0b10100000);
  for (int i = 0; i < fifoDataLen; i++)
  {
    SPI.transfer(fifoData[i]);
  }
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

void nrfWritePayloadNoAck(char fifoDataLen, char *fifoData)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  SPI.transfer(0b10110000);
  for (int i = 0; i < fifoDataLen; i++)
  {
    SPI.transfer(fifoData[i]);
  }
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

void nrfReadPayload(char fifoDataLen, char *fifoData)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  SPI.transfer(0b01100001);
  for (int i = 0; i < fifoDataLen; i++)
  {
    fifoData[i] = SPI.transfer(0x00);
  }
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
}

char nrfGetStatus(void)
{
  digitalWriteFast(NRF24_CSN, LOW);
  SPI.beginTransaction(SPISettings(NRF24_SPI_SPEED, MSBFIRST, SPI_MODE0));
  char result = SPI.transfer(0b11111111); //send NOP
  SPI.endTransaction();
  digitalWriteFast(NRF24_CSN, HIGH);
  return result;
}

void setupNRF(char pipe0addr[5])
{

  //set CONFIG register (0). Set PWR_UP to 1
  nrfRegWriteByte(0x00, 0b01111011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set FEATURE register to enable auto acknowledgement by this module (EN_ACK_P{x} = 1)
  nrfRegWriteByte(0x01, 0b00111111);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set EN_RXADDR to pipe0 and pipe1
  nrfRegWriteByte(0x02, 0b00000011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set AW register to 5 byte addresses
  nrfRegWriteByte(0x03, 0b0000011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //Set channel of nRF24L01+
  nrfRegWriteByte(0x05, 0b01111111); // Picked a high frequency to steer clear of Wifi
  delay(NRF24_SETTINGS_DELAY);       //Delay needed here?

  //set RF_SETUP
  nrfRegWriteByte(0x06, 0b00000110);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set the pipe0 address (unique to each device)
  nrfRegWrite(0x0A, 5, pipe0addr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set pipe1 to common address 0x0000000002 //needs two transitions to prevent error detection
  nrfRegWrite(0x0B, 5, comaddr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set TX_ADDR
  nrfRegWrite(0x10, 5, pipe0addr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set DYNPD
  nrfRegWriteByte(0x1C, 0b00111111);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set FEATURE
  nrfRegWriteByte(0x1D, 0b00000110);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //Enable radio
  //digitalWrite(NRF24_CE, HIGH);

  //set PRIM_RX in CONFIG to put the module in recieve mode
}

void nrfIRQReceived()
{
  // This is a super precise cycle count (used like a timer)
  // So this line is storing the last time the interrupt was triggered.
  last_nrf_irq = ARM_DWT_CYCCNT;
}

void printAddressCopy(char addr[5])
{
  Serial.print(addr[0], HEX);
  Serial.print(":");
  Serial.print(addr[1], HEX);
  Serial.print(":");
  Serial.print(addr[2], HEX);
  Serial.print(":");
  Serial.print(addr[3], HEX);
  Serial.print(":");
  Serial.println(addr[4], HEX);
}

void setupNRFWithRecall(char pipe0addr[5])
{
  char message[5];
  //setup spi port
  SPI.begin();

  //set CONFIG register (0). Set PWR_UP to 1
  nrfRegWriteByte(0x00, 0b01111011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x00, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //set FEATURE register to enable auto acknowledgement by this module (EN_ACK_P{x} = 1)
  nrfRegWriteByte(0x01, 0b00111111);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x01, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //set EN_RXADDR to pipe0 and pipe1
  nrfRegWriteByte(0x02, 0b00000011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x02, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //set AW register to 5 byte addresses
  nrfRegWriteByte(0x03, 0b0000011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x03, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //Set channel of nRF24L01+
  nrfRegWriteByte(0x05, 0b01111111); // Picked a high frequency to steer clear of Wifi
  delay(NRF24_SETTINGS_DELAY);       //Delay needed here?
  nrfRegRead(0x05, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //set RF_SETUP
  nrfRegWriteByte(0x06, 0b00000110);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x06, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //set the pipe0 address (unique to each device)
  nrfRegWrite(0x0A, 5, pipe0addr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x0A, 5, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  printAddressCopy(message);

  //set pipe1 to common address 0x0000000002 //needs two transitions to prevent error detection
  nrfRegWrite(0x0B, 5, comaddr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x0B, 5, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  printAddressCopy(message);

  //set TX_ADDR
  nrfRegWrite(0x10, 5, pipe0addr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x10, 5, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  printAddressCopy(message);

  //set DYNPD
  nrfRegWriteByte(0x1C, 0b00000110);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x1c, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //set FEATURE
  nrfRegWriteByte(0x1D, 0b00000110);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  nrfRegRead(0x1D, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  Serial.println(message[0], BIN);

  //Enable radio
  digitalWrite(NRF24_CE, HIGH);

  //set PRIM_RX in CONFIG to put the module in recieve mode
}

void printNRFRegisters(void) {
  Serial.println("NRF24 configuration");
  Serial.print("  Config:");
  printPaddedHex(nrfRegReadByte(0x00),2);
  Serial.print("\n  EN_AA:");
  printPaddedHex(nrfRegReadByte(0x01),2);
  Serial.print("\n  EN_RXADDR:");
  printPaddedHex(nrfRegReadByte(0x02),2);
  Serial.print("\n  SETUP_AW:");
  printPaddedHex(nrfRegReadByte(0x03),2);
  Serial.print("\n  SETUP_RETR:");
  printPaddedHex(nrfRegReadByte(0x04),2);
  Serial.print("\n  RF_CH:");
  printPaddedHex(nrfRegReadByte(0x05),2);
  Serial.print("\n  RF_SETUP:");
  printPaddedHex(nrfRegReadByte(0x06),2);
  Serial.print("\n  STATUS:");
  printPaddedHex(nrfRegReadByte(0x07),2);
  Serial.print("\n  OBSERVE_TX:");
  printPaddedHex(nrfRegReadByte(0x08),2);
  Serial.print("\n  RPD:");
  printPaddedHex(nrfRegReadByte(0x09),2);
  Serial.print("\n  RX_ADDR_PO (LSB):");
  printPaddedHex(nrfRegReadByte(0x0A),2);
  Serial.print("\n  RX_ADDR_P1 (LSB):");
  printPaddedHex(nrfRegReadByte(0x0B),2);
  Serial.print("\n  RX_ADDR_P2 (LSB):");
  printPaddedHex(nrfRegReadByte(0x0C),2);
  Serial.print("\n  RX_ADDR_P3 (LSB):");
  printPaddedHex(nrfRegReadByte(0x0D),2);
  Serial.print("\n  RX_ADDR_P4 (LSB):");
  printPaddedHex(nrfRegReadByte(0x0E),2);
  Serial.print("\n  RX_ADDR_P5 (LSB):");
  printPaddedHex(nrfRegReadByte(0x0F),2);
  Serial.print("\n  TX_ADDR (LSB):");
  printPaddedHex(nrfRegReadByte(0x10),2);
  Serial.print("\n  RX_PW_P0:");
  printPaddedHex(nrfRegReadByte(0x11),2);
  Serial.print("\n  RX_PW_P1:");
  printPaddedHex(nrfRegReadByte(0x12),2);
  Serial.print("\n  RX_PW_P2:");
  printPaddedHex(nrfRegReadByte(0x13),2);
  Serial.print("\n  RX_PW_P3:");
  printPaddedHex(nrfRegReadByte(0x14),2);
  Serial.print("\n  RX_PW_P4:");
  printPaddedHex(nrfRegReadByte(0x15),2);
  Serial.print("\n  RX_PW_P5:");
  printPaddedHex(nrfRegReadByte(0x16),2);
  Serial.print("\n  FIFO_STATUS:");
  printPaddedHex(nrfRegReadByte(0x17),2);
  Serial.print("\n  DYNPD:");
  printPaddedHex(nrfRegReadByte(0x1C),2);
  Serial.print("\n  FEATURE:");
  printPaddedHex(nrfRegReadByte(0x1C),2);
  Serial.print("\n");
}

void setupContWave()
{
  //setup spi port
  SPI.begin();

  //set CONFIG register (0). Set PWR_UP to 1
  nrfRegWriteByte(0x00, 0b00001011);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  delay(2);
  nrfRegWriteByte(0x06, 0b10011110);
  delay(NRF24_SETTINGS_DELAY);       //Delay needed here?
  nrfRegWriteByte(0x05, 0b01111111); // Picked a high frequency to steer clear of Wifi
  delay(NRF24_SETTINGS_DELAY);       //Delay needed here?
  //digitalWrite(NRF24_CE, HIGH);

  //set PRIM_RX in CONFIG to put the module in recieve mode
}

void printStatus(void);
void serialTrigger(void);
void TXtrigger(void);
void RXtrigger(void);

char testAddr[5] = {0x00, 0x01, 0x02, 0x03, 0x04};

void setup()
{
  Serial.begin(9600);
  pinMode(NRF24_SCK, OUTPUT);
  pinMode(NRF24_MOSI, OUTPUT);
  pinMode(NRF24_MISO, OUTPUT);
  pinMode(NRF24_CE, OUTPUT);
  pinMode(NRF24_CSN, OUTPUT);
  pinMode(NRF24_IRQ, INPUT);
  digitalWriteFast(NRF24_CE, LOW);
  while (!Serial)
    ;
  Serial.println("Ready");
  SPI.begin();
    //printStatus();

  TXtrigger();
}

void loop()
{
  // char rttmsg = 0xAA;
  // nrfWritePayload(1, &rttmsg);
  printStatus();
  delay(5000);
  //serialTrigger();
}

void serialTrigger(void)
{
  if (Serial.available())
  {
    String message = Serial.readString();
    if (message == "tx")
    {
      TXtrigger();
    }
    else if (message == "rx")
    {
      RXtrigger();
    }
  }
}

void TXtrigger(void)
{
  char message[5];
  printStatus();
  //set CONFIG register (0). Set PWR_UP to 1
  nrfRegWriteByte(0x00, 0x0e);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  // EN_AA
  nrfRegWriteByte(0x01, 0x3f);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set EN_RXADDR to pipe0 and pipe1
  nrfRegWriteByte(0x02, 0x01);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //Set channel of nRF24L01+
  nrfRegWriteByte(0x05, 0x4c); // Picked a high frequency to steer clear of Wifi
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set RF_SETUP
  nrfRegWriteByte(0x06, 0x07);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set OBSERVE_TX
  nrfRegWriteByte(0x08, 0x00);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  char addr0[5] = {0xf0, 0xf0, 0xf0, 0xf0, 0xe1};
  //set the pipe0 address (unique to each device)
  nrfRegWrite(0x0A, 5, addr0);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  char addr1[5] = {0xc2, 0xc2, 0xc2, 0xc2, 0xc2};
  //set the pipe1 address (unique to each device)
  nrfRegWrite(0x0B, 5, addr1);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set the pipe2 address
  nrfRegWriteByte(0x0C, 0xc3);

  //set the pipe3 address
  nrfRegWriteByte(0x0C, 0xc4);

  //set the pipe4 address
  nrfRegWriteByte(0x0C, 0xc5);

  //set the pipe5 address
  nrfRegWriteByte(0x0C, 0xc6);

  char txAddr[5] = {0xf0, 0xf0, 0xf0, 0xf0, 0xe1};
  //set TX_ADDR
  nrfRegWrite(0x10, 5, txAddr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set the pipe width
  nrfRegWriteByte(0x11, 0x01);

  //set the pipe width
  nrfRegWriteByte(0x12, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x13, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x14, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x15, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x16, 0x00);

  //set DYNPD
  nrfRegWriteByte(0x1C, 0x3f);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set FEATURE
  nrfRegWriteByte(0x1D, 0x06);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  char rttmsg = 0xAA;
  nrfWritePayload(1, &rttmsg);
  digitalWriteFast(NRF24_CE, HIGH);
}

void RXtrigger(void)
{
  char message[5];
  printStatus();
  //set CONFIG register (0). Set PWR_UP to 1
  nrfRegWriteByte(0x00, 0x0f);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set EN_AA
  nrfRegWriteByte(0x01, 0x3f);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set EN_RXADDR to pipe0 and pipe1
  nrfRegWriteByte(0x02, 0x03);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //Set channel of nRF24L01+
  nrfRegWriteByte(0x05, 0x4c); // Picked a high frequency to steer clear of Wifi
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set RF_SETUP
  nrfRegWriteByte(0x06, 0x07);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set OBSERVE_TX
  nrfRegWriteByte(0x08, 0x00);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  char addr0[5] = {0xf0, 0xf0, 0xf0, 0xf0, 0xe1};
  //set the pipe0 address (unique to each device)
  nrfRegWrite(0x0A, 5, addr0);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  char addr1[5] = {0xba, 0xdb, 0xad, 0xba, 0xdb};
  //set the pipe1 address (unique to each device)
  nrfRegWrite(0x0B, 5, addr1);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set the pipe2 address
  nrfRegWriteByte(0x0C, 0xc3);

  //set the pipe3 address
  nrfRegWriteByte(0x0C, 0xc4);

  //set the pipe4 address
  nrfRegWriteByte(0x0C, 0xc5);

  //set the pipe5 address
  nrfRegWriteByte(0x0C, 0xc6);

  char txAddr[5] = {0xe7, 0xe7, 0xe7, 0xe7, 0xe7};
  //set TX_ADDR
  nrfRegWrite(0x10, 5, txAddr);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set the pipe width
  nrfRegWriteByte(0x11, 0x01);

  //set the pipe width
  nrfRegWriteByte(0x12, 0x01);

  //set the pipe width
  nrfRegWriteByte(0x13, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x14, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x15, 0x00);

  //set the pipe width
  nrfRegWriteByte(0x16, 0x00);

  //set DYNPD
  nrfRegWriteByte(0x1C, 0x3f);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?

  //set FEATURE
  nrfRegWriteByte(0x1D, 0x06);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  
  digitalWriteFast(NRF24_CE, HIGH);
  while (1)
  {
    printStatus();
    delay(5000);
  }
}

void printStatus()
{
  char message[5];
  bool byte[8];
  // Collect status message from NRF
  nrfRegRead(0x07, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  int status = (int)message[0];
  // Convert it to its binary values
  for (int i = 0; i < 8; i++)
  {
    byte[i] = status & (1 << i);
    Serial.print(byte[i]);
  }
  Serial.println();
  Serial.println("            STATUS");
  Serial.println("----------------------------------");
  if (byte[6])
  {
    Serial.println("[X] New data arrived in RX FIFO");
  }
  else
  {
    Serial.println("[ ] No new data in RX FIFO");
  }
  if (byte[5])
  {
    Serial.println("[X] Packet Transmitted on TX");
  }
  else
  {
    Serial.println("[ ] No packet was transmitted");
  }
  if (byte[4])
  {
    Serial.println("[X] Maximum number of retransmits reached");
  }
  else
  {
    Serial.println("[ ] The max number of retransmits is not reached");
  }
  if (byte[3] && byte[2] && byte[1])
  {
    Serial.println("[ ] RX FIFO is Empty");
  }
  else if (byte[3] && byte[2])
  {
    Serial.println("[X] Not Used");
  }
  else
  {
    Serial.printf("[X] Payload avaliable for reading on pipe: %d%d%d\n", byte[3], byte[2], byte[1]);
  }
  if (byte[0])
  {
    Serial.println("[X] FIFO is full!");
  }
  else
  {
    Serial.println("[ ] Locations in FIFO are avalable");
  }
  Serial.println("----------------------------------");

  nrfRegRead(0x17, 1, message);
  delay(NRF24_SETTINGS_DELAY); //Delay needed here?
  status = (int)message[0];
  // Convert it to its binary values
  for (int i = 0; i < 8; i++)
  {
    byte[i] = status & (1 << i);
    Serial.print(byte[i]);
  }
  Serial.println();
  Serial.println("       FIFO STATUS");
  Serial.println("----------------------------------");
  if (byte[6])
  {
    Serial.println("[X] TX_REUSE is activated");
  }
  else
  {
    Serial.println("[ ] TX_REUSE is turned off");
  }
  if (byte[5])
  {
    Serial.println("[X] TX FIFO is full!");
  }
  else
  {
    Serial.println("[ ] TX FIFO has avalable locations");
  }
  if (byte[4])
  {
    Serial.println("[ ] TX FIFO is empty");
  }
  else
  {
    Serial.println("[X] There is data in TX FIFO");
  }
  if (byte[3] && byte[2] && byte[1])
  {
    Serial.println("[ ] RX FIFO is Empty");
  }
  if (byte[1])
  {
    Serial.println("[X] RX FIFO is full!");
  }
  else
  {
    Serial.println("[ ] There are locations avalable in RC FIFO");
  }
  if (byte[0])
  {
    Serial.println("[ ] RX FIFO is empty");
  }
  else
  {
    Serial.println("[X] There is data in RX FIFO");
  }
  Serial.printf("Last NRF IRQ: %d\n", last_nrf_irq);
  Serial.println("----------------------------------\n\n");
}

Parents Reply Children
No Data
Related