This example uses Acknowledgement (ACK) payloads attached to ACK packets to demonstrate how the nRF24L01's IRQ (Interrupt Request) pin can be configured to detect when data is received, or when data has transmitted successfully, or when data has failed to transmit.
This example was written to be used on 2 devices acting as "nodes". Use the Serial Monitor to change each node's behavior.
22volatile bool wait_for_event =
false;
27RF24 radio(CE_PIN, CSN_PIN);
30uint8_t address[][6] = {
"1Node",
"2Node" };
44const uint8_t tx_pl_size = 5;
45const uint8_t ack_pl_size = 4;
46uint8_t pl_iterator = 0;
48char tx_payloads[][tx_pl_size + 1] = {
"Ping ",
"Pong ",
"Radio",
"1FAIL" };
49char ack_payloads[][ack_pl_size + 1] = {
"Yak ",
"Back",
" ACK" };
51void interruptHandler();
63 Serial.println(F(
"radio hardware is not responding!!"));
68 Serial.println(F(
"RF24/examples/InterruptConfigure"));
71 Serial.println(F(
"Which radio is this? Enter '0' or '1'. Defaults to '0'"));
72 while (!Serial.available()) {
75 char input = Serial.parseInt();
76 radioNumber = input == 1;
77 Serial.print(F(
"radioNumber = "));
78 Serial.println((
int)radioNumber);
81 Serial.println(F(
"*** PRESS 'T' to begin transmitting to the other node"));
85 attachInterrupt(digitalPinToInterrupt(IRQ_PIN), interruptHandler, FALLING);
99 radio.enableDynamicPayloads();
103 radio.enableAckPayload();
107 radio.openWritingPipe(address[radioNumber]);
110 radio.openReadingPipe(1, address[!radioNumber]);
115 radio.stopListening();
121 radio.maskIRQ(1, 1, 0);
125 radio.writeAckPayload(1, &ack_payloads[0], ack_pl_size);
126 radio.writeAckPayload(1, &ack_payloads[1], ack_pl_size);
127 radio.writeAckPayload(1, &ack_payloads[2], ack_pl_size);
129 radio.startListening();
139 if (role && !wait_for_event) {
146 if (pl_iterator == 0) {
149 Serial.println(F(
"\nConfiguring IRQ pin to ignore the 'data sent' event"));
150 radio.maskIRQ(
true,
false,
false);
151 Serial.println(F(
" Pinging RX node for 'data ready' event..."));
153 }
else if (pl_iterator == 1) {
156 Serial.println(F(
"\nConfiguring IRQ pin to ignore the 'data ready' event"));
157 radio.maskIRQ(
false,
false,
true);
158 Serial.println(F(
" Pinging RX node for 'data sent' event..."));
160 }
else if (pl_iterator == 2) {
164 radio.maskIRQ(1, 1, 1);
166 Serial.println(F(
"\nSending 1 payload to fill RX node's FIFO. IRQ pin is neglected."));
168 if (radio.write(&tx_payloads[pl_iterator], tx_pl_size)) {
169 if (radio.rxFifoFull()) {
170 Serial.println(F(
"RX node's FIFO is full; it is not listening any more"));
172 Serial.println(
"Transmission successful, but the RX node might still be listening.");
175 Serial.println(F(
"Transmission failed or timed out. Continuing anyway."));
179 }
else if (pl_iterator == 3) {
182 Serial.println(F(
"\nConfiguring IRQ pin to reflect all events"));
183 radio.maskIRQ(0, 0, 0);
184 Serial.println(F(
" Pinging inactive RX node for 'data fail' event..."));
187 if (pl_iterator < 4 && pl_iterator != 2) {
191 wait_for_event =
true;
195 radio.startFastWrite(tx_payloads[pl_iterator++], tx_pl_size,
false);
201 }
else if (pl_iterator == 4) {
205 radio.stopListening();
213 Serial.println(F(
"\n*** PRESS 'T' to restart the transmissions"));
214 Serial.println(F(
"*** PRESS 'R' to change to Receive role\n"));
217 }
else if (pl_iterator == 2) {
224 if (radio.rxFifoFull()) {
228 radio.stopListening();
233 radio.writeAckPayload(1, &ack_payloads[0], ack_pl_size);
234 radio.writeAckPayload(1, &ack_payloads[1], ack_pl_size);
235 radio.writeAckPayload(1, &ack_payloads[2], ack_pl_size);
238 radio.startListening();
243 if (Serial.available()) {
246 char c = toupper(Serial.read());
250 Serial.println(F(
"*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
252 Serial.println(F(
"*** RESTARTING IRQ PIN TEST ***"));
255 wait_for_event =
false;
261 radio.stopListening();
263 }
else if (c ==
'R' && role) {
265 Serial.println(F(
"*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
269 radio.maskIRQ(0, 0, 0);
274 radio.writeAckPayload(1, &ack_payloads[0], ack_pl_size);
275 radio.writeAckPayload(1, &ack_payloads[1], ack_pl_size);
276 radio.writeAckPayload(1, &ack_payloads[2], ack_pl_size);
277 radio.startListening();
286void interruptHandler() {
289 Serial.println(F(
"\tIRQ pin is actively LOW"));
291 bool tx_ds, tx_df, rx_dr;
292 radio.whatHappened(tx_ds, tx_df, rx_dr);
297 Serial.print(F(
"\tdata_sent: "));
299 Serial.print(F(
", data_fail: "));
301 Serial.print(F(
", data_ready: "));
302 Serial.println(rx_dr);
309 if (pl_iterator <= 1) {
310 Serial.print(F(
" 'Data Ready' event test "));
311 Serial.println(rx_dr ? F(
"passed") : F(
"failed"));
312 }
else if (pl_iterator == 2) {
313 Serial.print(F(
" 'Data Sent' event test "));
314 Serial.println(tx_ds ? F(
"passed") : F(
"failed"));
315 }
else if (pl_iterator == 4) {
316 Serial.print(F(
" 'Data Fail' event test "));
317 Serial.println(tx_df ? F(
"passed") : F(
"failed"));
319 wait_for_event =
false;
328 if (radio.available()) {
331 uint8_t pl_size = !role ? tx_pl_size : ack_pl_size;
332 char rx_fifo[pl_size * 3 + 1];
333 if (radio.rxFifoFull()) {
334 rx_fifo[pl_size * 3] = 0;
335 radio.read(&rx_fifo, pl_size * 3);
338 while (radio.available()) {
339 radio.read(&rx_fifo + (i * pl_size), pl_size);
342 rx_fifo[i * pl_size] = 0;
344 Serial.print(F(
"Complete RX FIFO: "));
345 Serial.println(rx_fifo);
Driver class for nRF24L01(+) 2.4GHz Wireless Transceiver.
#define pinMode(pin, direction)
#define delayMicroseconds(usec)