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).
main.cpp@2:766f2f117453, 2018-12-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |