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).
Diff: main.cpp
- Revision:
- 2:766f2f117453
- Parent:
- 1:5be2682710c6
- Child:
- 3:37c053b30ca0
diff -r 5be2682710c6 -r 766f2f117453 main.cpp --- 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); } } }