nRF24L01 Module for Arduino

Post Reply
User avatar
Shehani
Lieutenant
Lieutenant
Posts: 61
Joined: Mon Aug 19, 2013 2:11 pm

nRF24L01 Module for Arduino

Post by Shehani » Wed Jan 29, 2014 11:20 am

1.jpg
1.jpg (5.39 KiB) Viewed 27091 times
If you use a standard Arduino board, you should use the Arduino board’s 3.3V pin?VDD3V3? to provide power. Beacuse the nRF24L01 module is worked at 1.9-3.6V voltage level. Please note, do not use 5V pin(VDD5V) to provide power, which may destroy it.

The Demo pins to Arduino as below:

GND – GND, VCC – 3.3V, CS – D8, CSN – D9, SCK – D10, MOSI – D11, MISO – D12, IRQ – D13

Download the code below into the TX Arduino (transmit) — This code will drive the nRF24L01 module to send out data form 0×00 to 0xFF .

Note, between the write TX_FIFO and clear RX_DR or TX_DS or MAX_RT interrupt flag, would better not serial print anything, which maybe case ACK failed.

Code: Select all

void setup()
{

  SPI_DIR = ( CE + SCK + CSN + MOSI);

  SPI_DIR &=~ ( IRQ + MISO);

  //  attachInterrupt(1, _ISR, LOW);// interrupt enable

  Serial.begin(9600);

  init_io();                        // Initialize IO port

  unsigned char status=SPI_Read(STATUS);

  Serial.print("status = ");

  Serial.println(status,HEX);      // read the mode’s status register, the default value should be ‘E’
  Serial.println("*******************TX_Mode Start****************************");

  TX_Mode();                       // set TX mode
}
void loop()
{

  int k = 0;

  for(;;)

  {

    for(int i=0; i<32; i++)

        tx_buf[i] = k++;

    unsigned char status = SPI_Read(STATUS);                // read register STATUS's value

    if(status&TX_DS)                                        // if receive data ready (TX_DS) interrupt

    {

      SPI_RW_Reg(FLUSH_TX,0);

      SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);     // write playload to TX_FIFO

    }

    if(status&MAX_RT)                                       // this is retransmit than  SETUP_RETR

    {

      SPI_RW_Reg(FLUSH_TX,0);

      SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);     // disable standy-mode

    }

    SPI_RW_Reg(WRITE_REG+STATUS,status);                    // clear RX_DR or TX_DS or MAX_RT interrupt flag

    delay(1000);

  }
}

Download the code below into the RX Arduino (receive) – This code will drive the nFR24L01 module to receive the data that transmit form the TX module and print it to serial port.

Note, clear RX_FIFO must bellow Read_FIFO

Code: Select all


void setup()
{

  SPI_DIR = ( CE + SCK + CSN + MOSI);

  SPI_DIR &=~ ( IRQ + MISO);

  //  attachInterrupt(1, _ISR, LOW); // interrupt enable

  Serial.begin(9600);

  init_io();                        // Initialize IO port

  unsigned char status=SPI_Read(STATUS);

  Serial.print("status = ");

  Serial.println(status,HEX);      // read the mode’s status register, the default value should be ‘E’
  Serial.println("*****************RX_Mode start******************************R");

  RX_Mode();                        // set RX mode
}
void loop()
{

  for(;;)

  {

    unsigned char status = SPI_Read(STATUS);                // read register STATUS's value

    if(status&RX_DR)                                        // if receive data ready (TX_DS) interrupt

    {

      SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);    // read playload to rx_buf

      SPI_RW_Reg(FLUSH_RX,0);                               // clear RX_FIFO

      for(int i=0; i<32; i++)

      {

          Serial.print(" ");

          Serial.print(rx_buf[i],HEX);                      // print rx_buf

      }

      Serial.println(" ");

    }

    SPI_RW_Reg(WRITE_REG+STATUS,status);                    // clear RX_DR/TX_DS/MAX_RT interrupt flag

    delay(1000);

  }
}




Now power on both Arduino , and connect the RX one to PC via USB. Open the IDE serial port monitor , change the baud rate to 9600 bps , and you can see the data that received.

If you want to change Arduino pin connecting to module , just modify the define on the NRF24L01.h .

All the project here(include API.h and NRF24L01.h)
2.jpg
2.jpg (125.63 KiB) Viewed 27091 times
nRF24L01_Demo_For_Arduino.zip
(7.61 KiB) Downloaded 494 times
Download nRF24L01_Demo_For_Arduino.
nRF24L01_Demo_For_Arduino_v1.1.zip
(7.37 KiB) Downloaded 539 times
Download nRF24L01_Demo_For_Arduino_v1.1.

nRF24L01 with Arduinio’s SPI Library


Article courtesy of elecfreaks.com
Post Reply

Return to “Arduino”