Test program for the Nordic Semi nRF24L01 Transceiver Module (http://www.sparkfun.com/products/691), talking to another module connected to SparkFun\'s Nordic Serial Interface Board (http://www.sparkfun.com/products/9019).

Dependencies:   mbed nRF24L01P

Committer:
jeroenkoster
Date:
Wed Dec 12 12:14:42 2018 +0000
Revision:
2:766f2f117453
Parent:
1:5be2682710c6
Child:
3:37c053b30ca0
wireless_week_3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Owen 0:a51a6e7da590 1 #include "mbed.h"
Owen 0:a51a6e7da590 2 #include "nRF24L01P.h"
Owen 0:a51a6e7da590 3
Owen 0:a51a6e7da590 4 Serial pc(USBTX, USBRX); // tx, rx
Owen 0:a51a6e7da590 5
jeroenkoster 2:766f2f117453 6 SPI spi(D11, D12, D13);
jeroenkoster 2:766f2f117453 7 DigitalOut cs(D10, 1);
jeroenkoster 2:766f2f117453 8 nRF24L01P my_nrf24l01p(D11, D12, D13, D8, D9, D7);
jeroenkoster 2:766f2f117453 9
jeroenkoster 2:766f2f117453 10 int led = 0;
jeroenkoster 2:766f2f117453 11 int newLed = 0;
Owen 0:a51a6e7da590 12
jeroenkoster 2:766f2f117453 13 void setLed(int i) {
jeroenkoster 2:766f2f117453 14 led = i;
jeroenkoster 2:766f2f117453 15 cs = 0;
jeroenkoster 2:766f2f117453 16 spi.write(0x46);
jeroenkoster 2:766f2f117453 17 spi.write(0x09);
jeroenkoster 2:766f2f117453 18
jeroenkoster 2:766f2f117453 19 int mask = 1;
jeroenkoster 2:766f2f117453 20 int writeValue = 255;
jeroenkoster 2:766f2f117453 21 writeValue ^= mask << i;
jeroenkoster 2:766f2f117453 22 spi.write(writeValue);
jeroenkoster 2:766f2f117453 23 cs = 1;
jeroenkoster 2:766f2f117453 24 }
jeroenkoster 2:766f2f117453 25
jeroenkoster 2:766f2f117453 26
jeroenkoster 2:766f2f117453 27 int readButton() {
jeroenkoster 2:766f2f117453 28 cs = 0;
jeroenkoster 2:766f2f117453 29 spi.write(0x47);
jeroenkoster 2:766f2f117453 30 spi.write(0x09);
jeroenkoster 2:766f2f117453 31 int misoOutput = spi.write(0x00);
jeroenkoster 2:766f2f117453 32 cs = 1;
jeroenkoster 2:766f2f117453 33
jeroenkoster 2:766f2f117453 34 misoOutput = misoOutput & 192;
jeroenkoster 2:766f2f117453 35 if (misoOutput == 128) { // S1 pressed
jeroenkoster 2:766f2f117453 36 return 1;
jeroenkoster 2:766f2f117453 37 } else if (misoOutput == 64) { // S2 pressed
jeroenkoster 2:766f2f117453 38 return 5;
jeroenkoster 2:766f2f117453 39 }
jeroenkoster 2:766f2f117453 40 return 0;
jeroenkoster 2:766f2f117453 41 }
Owen 0:a51a6e7da590 42
Owen 0:a51a6e7da590 43 int main() {
Owen 0:a51a6e7da590 44
Owen 0:a51a6e7da590 45 // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
Owen 0:a51a6e7da590 46 // "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
Owen 0:a51a6e7da590 47 // only handles 4 byte transfers in the ATMega code.
jeroenkoster 2:766f2f117453 48 #define TRANSFER_SIZE 2
jeroenkoster 2:766f2f117453 49
jeroenkoster 2:766f2f117453 50 cs = 0;
jeroenkoster 2:766f2f117453 51
jeroenkoster 2:766f2f117453 52 spi.write(0x46); // Select IODIR
jeroenkoster 2:766f2f117453 53 spi.write(0x00); // 0000 = Set all to output
jeroenkoster 2:766f2f117453 54 spi.write(0x00);
jeroenkoster 2:766f2f117453 55
jeroenkoster 2:766f2f117453 56 // Deselect the device
jeroenkoster 2:766f2f117453 57 cs = 1;
Owen 0:a51a6e7da590 58
Owen 0:a51a6e7da590 59 char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
jeroenkoster 2:766f2f117453 60
jeroenkoster 2:766f2f117453 61 bool ackknowledged = false;
Owen 0:a51a6e7da590 62
Owen 0:a51a6e7da590 63 my_nrf24l01p.powerUp();
Owen 0:a51a6e7da590 64
Owen 0:a51a6e7da590 65 // Display the (default) setup of the nRF24L01+ chip
Owen 0:a51a6e7da590 66 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
Owen 0:a51a6e7da590 67 pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() );
Owen 0:a51a6e7da590 68 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
Owen 0:a51a6e7da590 69 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
Owen 0:a51a6e7da590 70 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
Owen 0:a51a6e7da590 71
Owen 0:a51a6e7da590 72 pc.printf( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
Owen 0:a51a6e7da590 73
Owen 0:a51a6e7da590 74 my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
Owen 0:a51a6e7da590 75
Owen 0:a51a6e7da590 76 my_nrf24l01p.setReceiveMode();
Owen 0:a51a6e7da590 77 my_nrf24l01p.enable();
Owen 0:a51a6e7da590 78
jeroenkoster 2:766f2f117453 79 setLed(led);
Owen 0:a51a6e7da590 80 while (1) {
jeroenkoster 2:766f2f117453 81 if (ackknowledged == false) {
jeroenkoster 2:766f2f117453 82 my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, TRANSFER_SIZE );
Owen 0:a51a6e7da590 83 }
Owen 0:a51a6e7da590 84 // If we've received anything in the nRF24L01+...
Owen 0:a51a6e7da590 85 if ( my_nrf24l01p.readable() ) {
jeroenkoster 2:766f2f117453 86 led = rxData[1];
Owen 0:a51a6e7da590 87 // ...read the data into the receive buffer
jeroenkoster 2:766f2f117453 88 my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
Owen 0:a51a6e7da590 89
jeroenkoster 2:766f2f117453 90 if (rxData[0] == 0) { // Request
jeroenkoster 2:766f2f117453 91 setLed(led);
jeroenkoster 2:766f2f117453 92 pc.printf("Received request: %d \n\r",rxData[1]);
jeroenkoster 2:766f2f117453 93 txData[0] = 1;
jeroenkoster 2:766f2f117453 94 txData[1] = led;
jeroenkoster 2:766f2f117453 95 my_nrf24l01p.write( NRF24L01P_PIPE_P0
jeroenkoster 2:766f2f117453 96 , txData, TRANSFER_SIZE );
jeroenkoster 2:766f2f117453 97
jeroenkoster 2:766f2f117453 98 } else if (rxData[0] == 1) { // Ack
jeroenkoster 2:766f2f117453 99 ackknowledged = true;
jeroenkoster 2:766f2f117453 100 pc.printf("Received Ack: %d \n\r",rxData[1]);
jeroenkoster 2:766f2f117453 101 setLed(led);
jeroenkoster 2:766f2f117453 102
jeroenkoster 2:766f2f117453 103 // Set light
jeroenkoster 2:766f2f117453 104 } else {
jeroenkoster 2:766f2f117453 105 pc.printf("rxData[0] not recognized \n\r");
Owen 0:a51a6e7da590 106 }
jeroenkoster 2:766f2f117453 107 }
jeroenkoster 2:766f2f117453 108 newLed = (led + readButton()) % 6;
jeroenkoster 2:766f2f117453 109 while (newLed != led && !ackknowledged) {
jeroenkoster 2:766f2f117453 110 printf("Should request %d \n\r", newLed);
jeroenkoster 2:766f2f117453 111 txData[0] = 0;
jeroenkoster 2:766f2f117453 112 txData[1] = newLed;
jeroenkoster 2:766f2f117453 113 my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, TRANSFER_SIZE );
jeroenkoster 2:766f2f117453 114 wait(0.2);
Owen 0:a51a6e7da590 115 }
Owen 0:a51a6e7da590 116 }
Owen 0:a51a6e7da590 117 }