Created
May 5, 2015 20:24
-
-
Save HakanL/ea8f68290c860ba0e727 to your computer and use it in GitHub Desktop.
Sample Arduino code to send a known NRF24 packet for sniffing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
// March 2014 - TMRh20 - Updated along with High Speed RF24 Library fork | |
// Parts derived from examples by J. Coliz <[email protected]> | |
*/ | |
/** | |
* Example for efficient call-response using ack-payloads | |
* | |
* This example continues to make use of all the normal functionality of the radios including | |
* the auto-ack and auto-retry features, but allows ack-payloads to be written optionlly as well. | |
* This allows very fast call-response communication, with the responding radio never having to | |
* switch out of Primary Receiver mode to send back a payload, but having the option to if wanting | |
* to initiate communication instead of respond to a commmunication. | |
*/ | |
#include <SPI.h> | |
#include "nRF24L01.h" | |
#include "RF24.h" | |
#include "printf.h" | |
// Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 | |
RF24 radio(8,10); | |
// Topology | |
const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL }; // Radio pipe addresses for the 2 nodes to communicate. | |
// Role management: Set up role. This sketch uses the same software for all the nodes | |
// in this system. Doing so greatly simplifies testing. | |
typedef enum { role_ping_out = 1, role_pong_back } role_e; // The various roles supported by this sketch | |
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"}; // The debug-friendly names of those roles | |
role_e role = role_pong_back; // The role of the current running sketch | |
// A single byte to keep track of the data being sent back and forth | |
byte counter = 1; | |
void setup(){ | |
Serial.begin(57600); | |
printf_begin(); | |
printf("\n\rRF24/examples/GettingStarted/\n\r"); | |
printf("ROLE: %s\n\r",role_friendly_name[role]); | |
printf("*** PRESS 'T' to begin transmitting to the other node\n\r"); | |
// Setup and configure rf radio | |
radio.begin(); | |
radio.setAutoAck(1); // Ensure autoACK is enabled | |
radio.enableAckPayload(); // Allow optional ack payloads | |
radio.setRetries(0,15); // Smallest time between retries, max no. of retries | |
radio.setPayloadSize(10); // Here we are sending 1-byte payloads to test the call-response speed | |
radio.setCRCLength(RF24_CRC_16); | |
radio.setAddressWidth(5); | |
//radio.enableDynamicPayloads(); | |
radio.openWritingPipe(pipes[1]); // Both radios listen on the same pipes by default, and switch when writing | |
radio.openReadingPipe(1,pipes[0]); | |
radio.setChannel(0x2F); | |
radio.setDataRate(RF24_2MBPS); | |
radio.startListening(); // Start listening | |
radio.printDetails(); // Dump the configuration of the rf unit for debugging | |
} | |
void loop(void) { | |
if (role == role_ping_out){ | |
radio.stopListening(); // First, stop listening so we can talk. | |
printf("Now sending %d as payload. ",counter); | |
byte gotByte; | |
unsigned long time = micros(); // Take the time, and send it. This will block until complete | |
// byte data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A }; | |
// byte data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A }; | |
// byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA }; | |
// byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 }; | |
byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA }; | |
//Called when STANDBY-I mode is engaged (User is finished sending) | |
if (!radio.write( &data, 10 )){ | |
printf("failed.\n\r"); | |
}else{ | |
if(!radio.available()){ | |
printf("Blank Payload Received\n\r"); | |
}else{ | |
while(radio.available() ){ | |
unsigned long tim = micros(); | |
radio.read( &gotByte, 1 ); | |
printf("Got response %d, round-trip delay: %lu microseconds\n\r",gotByte,tim-time); | |
counter++; | |
} | |
} | |
} | |
// Try again later | |
delay(1000); | |
} | |
// Pong back role. Receive each packet, dump it out, and send it back | |
if ( role == role_pong_back ) { | |
byte pipeNo; | |
byte gotByte[10]; // Dump the payloads until we've gotten everything | |
while( radio.available(&pipeNo)){ | |
radio.read( &gotByte, 10 ); | |
radio.writeAckPayload(pipeNo,&gotByte, 1 ); | |
} | |
} | |
// Change roles | |
if ( Serial.available() ) | |
{ | |
char c = toupper(Serial.read()); | |
if ( c == 'T' && role == role_pong_back ) | |
{ | |
printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r"); | |
role = role_ping_out; // Become the primary transmitter (ping out) | |
radio.openWritingPipe(pipes[0]); | |
radio.openReadingPipe(1,pipes[1]); | |
} | |
else if ( c == 'R' && role == role_ping_out ) | |
{ | |
printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r"); | |
role = role_pong_back; // Become the primary receiver (pong back) | |
radio.openWritingPipe(pipes[1]); | |
radio.openReadingPipe(1,pipes[0]); | |
radio.startListening(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment