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@14:08424d055134, 2019-01-18 (annotated)
- Committer:
- ViriJay
- Date:
- Fri Jan 18 11:06:39 2019 +0000
- Revision:
- 14:08424d055134
- Parent:
- 13:818bf30bf366
ART fail fix
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 | nRF24L01P my_nrf24l01p(D11, D12, D13, D8, D9, D7); |
jeroenkoster | 8:fd4596275224 | 7 | |
jeroenkoster | 8:fd4596275224 | 8 | bool receiver = false; |
jeroenkoster | 2:766f2f117453 | 9 | |
jeroenkoster | 6:c55f867da01d | 10 | #define TRANSFER_SIZE 2 |
Owen | 0:a51a6e7da590 | 11 | |
ViriJay | 3:37c053b30ca0 | 12 | void setDefaults() { |
ViriJay | 3:37c053b30ca0 | 13 | my_nrf24l01p.setRfFrequency(DEFAULT_NRF24L01P_RF_FREQUENCY); |
ViriJay | 3:37c053b30ca0 | 14 | my_nrf24l01p.setRfOutputPower(DEFAULT_NRF24L01P_TX_PWR); |
ViriJay | 3:37c053b30ca0 | 15 | my_nrf24l01p.setAirDataRate(DEFAULT_NRF24L01P_DATARATE); |
ViriJay | 3:37c053b30ca0 | 16 | } |
ViriJay | 3:37c053b30ca0 | 17 | |
ViriJay | 3:37c053b30ca0 | 18 | void setFrequency(int frequency) { |
ViriJay | 3:37c053b30ca0 | 19 | my_nrf24l01p.setRfFrequency(frequency); |
jeroenkoster | 2:766f2f117453 | 20 | } |
jeroenkoster | 2:766f2f117453 | 21 | |
ViriJay | 3:37c053b30ca0 | 22 | void setPower(int power) { |
ViriJay | 3:37c053b30ca0 | 23 | my_nrf24l01p.setRfOutputPower(power); |
ViriJay | 3:37c053b30ca0 | 24 | } |
jeroenkoster | 2:766f2f117453 | 25 | |
ViriJay | 3:37c053b30ca0 | 26 | void setDataReet(int datareet) { |
ViriJay | 3:37c053b30ca0 | 27 | my_nrf24l01p.setAirDataRate(datareet); |
ViriJay | 3:37c053b30ca0 | 28 | } |
ViriJay | 3:37c053b30ca0 | 29 | |
ViriJay | 3:37c053b30ca0 | 30 | void printSettings() { |
ViriJay | 3:37c053b30ca0 | 31 | // Display the (default) setup of the nRF24L01+ chip |
ViriJay | 3:37c053b30ca0 | 32 | pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() ); |
ViriJay | 3:37c053b30ca0 | 33 | pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() ); |
ViriJay | 3:37c053b30ca0 | 34 | pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() ); |
ViriJay | 3:37c053b30ca0 | 35 | pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() ); |
ViriJay | 3:37c053b30ca0 | 36 | pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() ); |
jeroenkoster | 6:c55f867da01d | 37 | pc.printf( "(transfers are grouped into %d characters)\r\n", TRANSFER_SIZE ); |
jeroenkoster | 6:c55f867da01d | 38 | } |
jeroenkoster | 6:c55f867da01d | 39 | |
ViriJay | 11:004792c2729a | 40 | void quitTest() { |
ViriJay | 11:004792c2729a | 41 | |
ViriJay | 11:004792c2729a | 42 | char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE]; |
ViriJay | 11:004792c2729a | 43 | int rxDataCnt = 0; |
ViriJay | 11:004792c2729a | 44 | txData[0] = 'q'; |
ViriJay | 11:004792c2729a | 45 | txData[1] = 'q'; |
ViriJay | 11:004792c2729a | 46 | |
ViriJay | 11:004792c2729a | 47 | bool acked = false; |
ViriJay | 11:004792c2729a | 48 | |
ViriJay | 11:004792c2729a | 49 | while (!acked) { |
ViriJay | 11:004792c2729a | 50 | my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, 2 ); |
ViriJay | 11:004792c2729a | 51 | if ( my_nrf24l01p.readable() ) { |
ViriJay | 11:004792c2729a | 52 | rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) ); |
ViriJay | 11:004792c2729a | 53 | for (int i = 0; i < rxDataCnt; i++) { |
ViriJay | 11:004792c2729a | 54 | char c = rxData[i]; |
ViriJay | 11:004792c2729a | 55 | if (c == 'q') { |
ViriJay | 11:004792c2729a | 56 | acked = true; |
ViriJay | 11:004792c2729a | 57 | } |
ViriJay | 11:004792c2729a | 58 | } |
ViriJay | 11:004792c2729a | 59 | } |
ViriJay | 11:004792c2729a | 60 | wait(0.1); |
ViriJay | 11:004792c2729a | 61 | } |
ViriJay | 11:004792c2729a | 62 | } |
ViriJay | 11:004792c2729a | 63 | |
ViriJay | 12:a0b2288a6925 | 64 | void senderTest(int frequency, int outputPower, int dataRate, int delay, int count) { |
jeroenkoster | 6:c55f867da01d | 65 | my_nrf24l01p.setRfFrequency(frequency); |
jeroenkoster | 6:c55f867da01d | 66 | my_nrf24l01p.setRfOutputPower(outputPower); |
jeroenkoster | 7:8099b996329b | 67 | my_nrf24l01p.setAirDataRate(dataRate); |
ViriJay | 12:a0b2288a6925 | 68 | my_nrf24l01p.enableAutoRetransmit(delay, count); |
jeroenkoster | 6:c55f867da01d | 69 | |
jeroenkoster | 7:8099b996329b | 70 | char txData[TRANSFER_SIZE]; |
jeroenkoster | 6:c55f867da01d | 71 | int txDataCnt = 0; |
jeroenkoster | 6:c55f867da01d | 72 | |
jeroenkoster | 8:fd4596275224 | 73 | pc.printf("--- SETTINGS: ---\n\r"); |
jeroenkoster | 6:c55f867da01d | 74 | printSettings(); |
jeroenkoster | 8:fd4596275224 | 75 | pc.printf("-----------------\n\r"); |
jeroenkoster | 6:c55f867da01d | 76 | |
jeroenkoster | 6:c55f867da01d | 77 | for (int i = 0; i < 1000; i++) { |
jeroenkoster | 10:10b4e41b67a7 | 78 | char c = i % 100; |
ViriJay | 11:004792c2729a | 79 | txData[txDataCnt++] = c; |
jeroenkoster | 6:c55f867da01d | 80 | if (txDataCnt >= sizeof(txData)) { |
ViriJay | 13:818bf30bf366 | 81 | //pc.printf("Printing txData: %d %d\n\r", txData[0], txData[1]); |
jeroenkoster | 6:c55f867da01d | 82 | // Send the transmitbuffer via the nRF24L01+ |
jeroenkoster | 6:c55f867da01d | 83 | my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt ); |
jeroenkoster | 6:c55f867da01d | 84 | txDataCnt = 0; |
jeroenkoster | 6:c55f867da01d | 85 | } |
jeroenkoster | 6:c55f867da01d | 86 | } |
ViriJay | 11:004792c2729a | 87 | |
ViriJay | 11:004792c2729a | 88 | quitTest(); |
ViriJay | 11:004792c2729a | 89 | |
jeroenkoster | 8:fd4596275224 | 90 | pc.printf("Finished run!\n\r\n\r"); |
jeroenkoster | 6:c55f867da01d | 91 | } |
jeroenkoster | 6:c55f867da01d | 92 | |
Owen | 0:a51a6e7da590 | 93 | int main() { |
Owen | 0:a51a6e7da590 | 94 | |
Owen | 0:a51a6e7da590 | 95 | // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's |
Owen | 0:a51a6e7da590 | 96 | // "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019) |
Owen | 0:a51a6e7da590 | 97 | // only handles 4 byte transfers in the ATMega code. |
ViriJay | 4:7fa578849b23 | 98 | |
ViriJay | 11:004792c2729a | 99 | char rxData[TRANSFER_SIZE]; |
ViriJay | 11:004792c2729a | 100 | |
ViriJay | 11:004792c2729a | 101 | my_nrf24l01p.setRfFrequency(2400); |
ViriJay | 11:004792c2729a | 102 | |
ViriJay | 11:004792c2729a | 103 | printSettings(); |
ViriJay | 11:004792c2729a | 104 | |
Owen | 0:a51a6e7da590 | 105 | my_nrf24l01p.powerUp(); |
ViriJay | 3:37c053b30ca0 | 106 | |
ViriJay | 13:818bf30bf366 | 107 | my_nrf24l01p.enableAutoAcknowledge(NRF24L01P_PIPE_P0); |
jeroenkoster | 6:c55f867da01d | 108 | // my_nrf24l01p.enableAutoRetransmit(100000, 10); |
Owen | 0:a51a6e7da590 | 109 | my_nrf24l01p.setTransferSize( TRANSFER_SIZE ); |
Owen | 0:a51a6e7da590 | 110 | |
Owen | 0:a51a6e7da590 | 111 | my_nrf24l01p.setReceiveMode(); |
Owen | 0:a51a6e7da590 | 112 | my_nrf24l01p.enable(); |
jeroenkoster | 6:c55f867da01d | 113 | |
jeroenkoster | 6:c55f867da01d | 114 | int data[1000]; |
jeroenkoster | 6:c55f867da01d | 115 | if (receiver) { |
jeroenkoster | 6:c55f867da01d | 116 | int rxPacketCnt = 0; |
jeroenkoster | 6:c55f867da01d | 117 | int rxDataCnt = 0; |
jeroenkoster | 6:c55f867da01d | 118 | bool reading = true; |
jeroenkoster | 6:c55f867da01d | 119 | pc.printf(">> Receiving Modus << \n\r"); |
jeroenkoster | 6:c55f867da01d | 120 | while (reading) { |
jeroenkoster | 6:c55f867da01d | 121 | if ( my_nrf24l01p.readable() ) { |
jeroenkoster | 6:c55f867da01d | 122 | rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) ); |
jeroenkoster | 6:c55f867da01d | 123 | for (int i = 0; i < rxDataCnt; i++) { |
ViriJay | 11:004792c2729a | 124 | char c = rxData[i]; |
ViriJay | 11:004792c2729a | 125 | if (c == 'q') { |
ViriJay | 11:004792c2729a | 126 | if (rxPacketCnt != 0) { |
ViriJay | 11:004792c2729a | 127 | char txData[TRANSFER_SIZE]; |
ViriJay | 11:004792c2729a | 128 | txData[0] = 'q'; |
ViriJay | 11:004792c2729a | 129 | txData[1] = 'q'; |
jeroenkoster | 6:c55f867da01d | 130 | pc.printf("\n\r-----------\n\r"); |
jeroenkoster | 6:c55f867da01d | 131 | pc.printf("DONE!: length = %d \r\n", rxPacketCnt); |
jeroenkoster | 6:c55f867da01d | 132 | pc.printf("-----------\n\r"); |
ViriJay | 11:004792c2729a | 133 | rxPacketCnt = 0; |
ViriJay | 11:004792c2729a | 134 | |
ViriJay | 11:004792c2729a | 135 | my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, 2); |
jeroenkoster | 6:c55f867da01d | 136 | } |
jeroenkoster | 6:c55f867da01d | 137 | } else { |
ViriJay | 11:004792c2729a | 138 | data[rxPacketCnt++] = c; |
jeroenkoster | 6:c55f867da01d | 139 | } |
jeroenkoster | 6:c55f867da01d | 140 | } |
jeroenkoster | 6:c55f867da01d | 141 | rxDataCnt = 0; |
ViriJay | 3:37c053b30ca0 | 142 | } |
jeroenkoster | 6:c55f867da01d | 143 | } |
jeroenkoster | 6:c55f867da01d | 144 | } |
jeroenkoster | 6:c55f867da01d | 145 | else { // Transmit mode |
jeroenkoster | 6:c55f867da01d | 146 | pc.printf(">> Sending Modus << \n\r"); |
jeroenkoster | 6:c55f867da01d | 147 | // Frequency test |
ViriJay | 12:a0b2288a6925 | 148 | //pc.printf("FREQUENCY TEST \n\r"); |
ViriJay | 12:a0b2288a6925 | 149 | //senderTest(2400, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_1_MBPS, false); |
ViriJay | 12:a0b2288a6925 | 150 | //senderTest(2463, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_1_MBPS, false); |
ViriJay | 12:a0b2288a6925 | 151 | //senderTest(2525, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_1_MBPS, false); |
jeroenkoster | 7:8099b996329b | 152 | // // Power (dBm) test |
ViriJay | 12:a0b2288a6925 | 153 | pc.printf("OUTPUT POWER TEST"); |
ViriJay | 13:818bf30bf366 | 154 | // senderTest(2402, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_1_MBPS, 0, 0); |
ViriJay | 12:a0b2288a6925 | 155 | // senderTest(2402, NRF24L01P_TX_PWR_MINUS_6_DB, NRF24L01P_DATARATE_1_MBPS, 0, 0); |
ViriJay | 12:a0b2288a6925 | 156 | // senderTest(2402, NRF24L01P_TX_PWR_MINUS_12_DB, NRF24L01P_DATARATE_1_MBPS, 0 ,0); |
ViriJay | 12:a0b2288a6925 | 157 | // senderTest(2402, NRF24L01P_TX_PWR_MINUS_18_DB, NRF24L01P_DATARATE_1_MBPS, 0, 0); |
jeroenkoster | 7:8099b996329b | 158 | // // Data rate test |
jeroenkoster | 7:8099b996329b | 159 | // pc.printf("DATARATE TEST"); |
ViriJay | 12:a0b2288a6925 | 160 | // senderTest(2402, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_250_KBPS, false); |
ViriJay | 12:a0b2288a6925 | 161 | // senderTest(2402, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_1_MBPS, false); |
ViriJay | 12:a0b2288a6925 | 162 | // senderTest(2402, NRF24L01P_TX_PWR_ZERO_DB, NRF24L01P_DATARATE_2_MBPS, false); |
ViriJay | 13:818bf30bf366 | 163 | pc.printf("ART DELAY TEST"); |
ViriJay | 13:818bf30bf366 | 164 | senderTest(2402, NRF24L01P_TX_PWR_MINUS_12_DB, NRF24L01P_DATARATE_1_MBPS, 0, 8); |
ViriJay | 13:818bf30bf366 | 165 | // senderTest(2402, NRF24L01P_TX_PWR_MINUS_18_DB, NRF24L01P_DATARATE_1_MBPS, 8, 8); |
ViriJay | 13:818bf30bf366 | 166 | // senderTest(2402, NRF24L01P_TX_PWR_MINUS_18_DB, NRF24L01P_DATARATE_1_MBPS, 15, 8); |
Owen | 0:a51a6e7da590 | 167 | } |
ViriJay | 3:37c053b30ca0 | 168 | } |