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

Revision:
2:766f2f117453
Parent:
1:5be2682710c6
Child:
3:37c053b30ca0
--- a/main.cpp	Wed Jan 19 23:53:19 2011 +0000
+++ b/main.cpp	Wed Dec 12 12:14:42 2018 +0000
@@ -3,21 +3,62 @@
 
 Serial pc(USBTX, USBRX); // tx, rx
 
-nRF24L01P my_nrf24l01p(p5, p6, p7, p8, p9, p10);    // mosi, miso, sck, csn, ce, irq
+SPI spi(D11, D12, D13);
+DigitalOut cs(D10, 1);
+nRF24L01P my_nrf24l01p(D11, D12, D13, D8, D9, D7);
+
+int led = 0;
+int newLed = 0;
 
-DigitalOut myled1(LED1);
-DigitalOut myled2(LED2);
+void setLed(int i) {
+    led = i;
+    cs = 0;
+    spi.write(0x46);
+    spi.write(0x09);
+    
+    int mask = 1;
+    int writeValue = 255;
+    writeValue ^= mask << i;
+    spi.write(writeValue);
+    cs = 1;
+}
+
+
+int readButton() {
+    cs = 0;
+    spi.write(0x47);
+    spi.write(0x09);
+    int misoOutput = spi.write(0x00);
+    cs = 1;
+    
+    misoOutput = misoOutput & 192;
+    if (misoOutput == 128) { // S1 pressed
+        return 1;    
+    } else if (misoOutput == 64) { // S2 pressed
+        return 5;
+    }
+    return 0;
+}
 
 int main() {
 
 // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
 //  "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
 //  only handles 4 byte transfers in the ATMega code.
-#define TRANSFER_SIZE   4
+#define TRANSFER_SIZE   2
+
+    cs = 0;
+ 
+    spi.write(0x46); // Select IODIR
+    spi.write(0x00); // 0000 = Set all to output
+    spi.write(0x00);
+  
+    // Deselect the device
+    cs = 1;
 
     char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
-    int txDataCnt = 0;
-    int rxDataCnt = 0;
+    
+    bool ackknowledged = false;
 
     my_nrf24l01p.powerUp();
 
@@ -35,41 +76,42 @@
     my_nrf24l01p.setReceiveMode();
     my_nrf24l01p.enable();
 
+    setLed(led);
     while (1) {
-
-        // If we've received anything over the host serial link...
-        if ( pc.readable() ) {
-
-            // ...add it to the transmit buffer
-            txData[txDataCnt++] = pc.getc();
-
-            // If the transmit buffer is full
-            if ( txDataCnt >= sizeof( txData ) ) {
-
-                // Send the transmitbuffer via the nRF24L01+
-                my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt );
-
-                txDataCnt = 0;
-            }
-
-            // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
-            myled1 = !myled1;
+        if (ackknowledged == false) {
+            my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, TRANSFER_SIZE );
         }
-
         // If we've received anything in the nRF24L01+...
         if ( my_nrf24l01p.readable() ) {
-
+            led = rxData[1];
             // ...read the data into the receive buffer
-            rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
+            my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
 
-            // Display the receive buffer contents via the host serial link
-            for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
-
-                pc.putc( rxData[i] );
+            if (rxData[0] == 0) { // Request
+                setLed(led);
+                pc.printf("Received request: %d \n\r",rxData[1]);
+                txData[0] = 1;
+                txData[1] = led;
+                my_nrf24l01p.write( NRF24L01P_PIPE_P0
+                , txData, TRANSFER_SIZE );
+                
+            } else if (rxData[0] == 1) { // Ack
+                ackknowledged = true;
+                pc.printf("Received Ack: %d \n\r",rxData[1]);
+                setLed(led);
+                
+                // Set light
+            } else {
+                pc.printf("rxData[0] not recognized \n\r");
             }
-
-            // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
-            myled2 = !myled2;
+        }
+        newLed = (led + readButton()) % 6;
+        while (newLed != led && !ackknowledged) {
+            printf("Should request %d \n\r", newLed);
+            txData[0] = 0;
+            txData[1] = newLed;
+            my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, TRANSFER_SIZE );
+            wait(0.2);
         }
     }
 }