*Solved* nRF24l01 strange symptom

I am using the Example sketch from the RF24 library GettingStarted.ino

I have 2 Unos wired up to the nRf24l01 boards using jumpers

I try communication but it does nothing until I touch the miso wire with my finger. I thought at frst it was a bad connection but it is not. I can touch it with anything and it will do nothing until I touch it with my finger. I can touch the antenna, board, any of the other 6 wires an nothing.

I switched the 2 boards and the same thing. The transmit unit will not work until I touch the MISO wire on the transmit unit.

I tried common grounds, and moving the boards further apart.

What can be causing this problem? What can I do to solve it?

/*
* Getting Started example sketch for nRF24L01+ radios
* This is a very basic example of how to send data from one node to another
* Updated: Dec 2014 by TMRh20
*/

#include <SPI.h>
#include "RF24.h"

/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 1;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);
/**********************************************************/

byte addresses[][6] = {"1Node","2Node"};

// Used to control whether this node is sending or receiving
bool role = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("RF24/examples/GettingStarted"));
  Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
  
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setPALevel(RF24_PA_LOW);
  
  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }
  
  // Start the radio listening for data
  radio.startListening();
}

void loop() {
  
  
/****************** Ping Out Role ***************************/  
if (role == 1)  {
    
    radio.stopListening();                                    // First, stop listening so we can talk.
    
    
    Serial.println(F("Now sending"));

    unsigned long start_time = micros();                             // Take the time, and send it.  This will block until complete
     if (!radio.write( &start_time, sizeof(unsigned long) )){
       Serial.println(F("failed"));
     }
        
    radio.startListening();                                    // Now, continue listening
    
    unsigned long started_waiting_at = micros();               // Set up a timeout period, get the current microseconds
    boolean timeout = false;                                   // Set up a variable to indicate if a response was received or not
    
    while ( ! radio.available() ){                             // While nothing is received
      if (micros() - started_waiting_at > 200000 ){            // If waited longer than 200ms, indicate timeout and exit while loop
          timeout = true;
          break;
      }      
    }
        
    if ( timeout ){                                             // Describe the results
        Serial.println(F("Failed, response timed out."));
    }else{
        unsigned long got_time;                                 // Grab the response, compare, and send to debugging spew
        radio.read( &got_time, sizeof(unsigned long) );
        unsigned long end_time = micros();
        
        // Spew it
        Serial.print(F("Sent "));
        Serial.print(start_time);
        Serial.print(F(", Got response "));
        Serial.print(got_time);
        Serial.print(F(", Round-trip delay "));
        Serial.print(end_time-start_time);
        Serial.println(F(" microseconds"));
    }

    // Try again 1s later
    delay(1000);
  }



/****************** Pong Back Role ***************************/

  if ( role == 0 )
  {
    unsigned long got_time;
    
    if( radio.available()){
                                                                    // Variable for the received timestamp
      while (radio.available()) {                                   // While there is data ready
        radio.read( &got_time, sizeof(unsigned long) );             // Get the payload
      }
     
      radio.stopListening();                                        // First, stop listening so we can talk   
      radio.write( &got_time, sizeof(unsigned long) );              // Send the final one back.      
      radio.startListening();                                       // Now, resume listening so we catch the next packets.     
      Serial.print(F("Sent response "));
      Serial.println(got_time);  
   }
 }




/****************** Change Roles via Serial Commands ***************************/

  if ( Serial.available() )
  {
    char c = toupper(Serial.read());
    if ( c == 'T' && role == 0 ){      
      Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
      role = 1;                  // Become the primary transmitter (ping out)
    
   }else
    if ( c == 'R' && role == 1 ){
      Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));      
       role = 0;                // Become the primary receiver (pong back)
       radio.startListening();
       
    }
  }


} // Loop

How long are the wires?

Have you checked the 3.3V supply is within tolerance?

The rRF24L01 inputs are 5V tolerant but the datasheet says the supply must be in the range
2.7 to 3.3V for 5V inputs to work. If you cannot guarantee this, I suggest use a level shifter
and talk 3.3V exclusively to the nRF24L01.

MarkT:
I suggest use a level shifter and talk 3.3V exclusively to the nRF24L01.

The wires are 6".

I have logic level converters. Do you mean to convert CE and CSN from 5v on the arduino to 3.3 v to the RF24?

I will try that. I used a separate 3.3v power supply and that did not help

Thank you

Ideally 3.0V is needed in this mode, I've never done anything but level convert myself as >5.5V
destroys the chip and that's not enough safety margin for me...

level-shifting isn't necessary, but a stable 3.3V is. Have you soldered a 10 uF cap between GND and VCC on the NRF? Most people find that to be necessary, but I don't know if that would be connected to your strange MOSI pin behavior...

As discussed briefly in this thread, some vendors release some pretty shoddy products. It may be worth taking a look at your boards under magnification to make sure there are no assembly errors like loose pins, stray solder, etc.

Note you may also get better feedback by putting this in the Networking, Protocol, and Devices sub-forum.

I got a new batch of nRF24l01 units in today

Switched them out and no issues at all.

I have no idea why touching the wire caused the program to run, but in looking at the screen, I was not receiving on the 2nd unit so I must have been acting to send the xtmtd signal back to the xmt unit and it thought it received from the other unit. An Echo if you will

Bad nRF24 unit was the culprit. At $1 a piece, no big deal, but a day wasted.