Fork from nRF24L01P Hello World. This is working with the Nucleo STM32F401RE. Working on adding functionality to change parameters on the fly, such as changing the RF channel.

Dependencies:   mbed nRF24L01P

Fork of nRF24L01P_Hello_World by Owen Edwards

This is using the nRF24L01P radio with the Nucleo STM32F401RE board. The connections to the radio board from the STM32 are the following Radio - STM32F401RE CSN - PA4 CE - PC1 MOSI - PB5 SCK - PB3 IRQ - PC0 MISO - PB4

I am trying add functionality so that parameters can be changed on the fly instead of having to recompile the code to change the operation of the nRF24L01P (for example, changing the RF channel (frequency) through a terminal interface. )

Committer:
jblackann
Date:
Fri Jun 15 12:33:52 2018 +0000
Revision:
2:945fa201ce19
Parent:
1:5be2682710c6
Modified to work with the Nucleo STM32F401RE board.  Also adding functionality to change the channel through the terminal.

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
jblackann 2:945fa201ce19 6 /* this is being used with the nucleo F401RE */
jblackann 2:945fa201ce19 7
jblackann 2:945fa201ce19 8 nRF24L01P my_nrf24l01p(PB_5, PB_4, PB_3, PA_4, PC_1 , PC_0); // mosi, miso, sck, csn, ce, irq
jblackann 2:945fa201ce19 9 /*
jblackann 2:945fa201ce19 10 * SPI_MOSI = PB5, //previously PE_15,
jblackann 2:945fa201ce19 11 * SPI_MISO = PB4, // previously PE_14,
jblackann 2:945fa201ce19 12 * SPI_SCK = PB3, // previously PE_13,
jblackann 2:945fa201ce19 13 * SPI_CS = PA4, // previously PE_12,
jblackann 2:945fa201ce19 14 * CE = PC1, // previously PE_10
jblackann 2:945fa201ce19 15 * IRQ = PC0 , // previously PE_11
jblackann 2:945fa201ce19 16 */
jblackann 2:945fa201ce19 17
Owen 0:a51a6e7da590 18
Owen 0:a51a6e7da590 19 DigitalOut myled1(LED1);
Owen 0:a51a6e7da590 20 DigitalOut myled2(LED2);
Owen 0:a51a6e7da590 21
jblackann 2:945fa201ce19 22 void channelChangeMode (void)
jblackann 2:945fa201ce19 23 {
jblackann 2:945fa201ce19 24 // NEEDS fixed to accept two digit number
jblackann 2:945fa201ce19 25 #define RF_CHANNEL_SIZE 2
jblackann 2:945fa201ce19 26
jblackann 2:945fa201ce19 27 char stayInWhile = 1;
jblackann 2:945fa201ce19 28 char receivedChannelCharacter;
jblackann 2:945fa201ce19 29 int rf_channel = 2400;
jblackann 2:945fa201ce19 30 int rf_channel_temp = 0;
jblackann 2:945fa201ce19 31 char rf_channel_char[RF_CHANNEL_SIZE];
jblackann 2:945fa201ce19 32 int rf_channelCnt = 0;
jblackann 2:945fa201ce19 33
jblackann 2:945fa201ce19 34 pc.printf("Channel menu\n\r");
jblackann 2:945fa201ce19 35 pc.printf("select channel as XX between 01 and 82\n\r");
jblackann 2:945fa201ce19 36 while(stayInWhile)
jblackann 2:945fa201ce19 37 {
jblackann 2:945fa201ce19 38 pc.printf("waiting for Channel\n\r");
jblackann 2:945fa201ce19 39 if ( pc.readable() )
jblackann 2:945fa201ce19 40 {
jblackann 2:945fa201ce19 41 receivedChannelCharacter = pc.getc();
jblackann 2:945fa201ce19 42
jblackann 2:945fa201ce19 43 if (receivedChannelCharacter >= '1' && receivedChannelCharacter <= '9') // if received 0 through 9 load transmit buffer
jblackann 2:945fa201ce19 44 {
jblackann 2:945fa201ce19 45 rf_channel_char[rf_channelCnt++] = pc.getc();
jblackann 2:945fa201ce19 46
jblackann 2:945fa201ce19 47 pc.printf("received a, %d\n\r", (receivedChannelCharacter - '0'));
jblackann 2:945fa201ce19 48
jblackann 2:945fa201ce19 49 // If the transmit buffer is full
jblackann 2:945fa201ce19 50 if ( rf_channelCnt >= sizeof( RF_CHANNEL_SIZE ) )
jblackann 2:945fa201ce19 51 {
jblackann 2:945fa201ce19 52 //checkChannelValue();
jblackann 2:945fa201ce19 53 rf_channel_temp = (rf_channel_char[0]-0x30) * 10;
jblackann 2:945fa201ce19 54 rf_channel_temp += (rf_channel_char[1]-0x30);
jblackann 2:945fa201ce19 55
jblackann 2:945fa201ce19 56 if((rf_channel_temp >= 1) && (rf_channel_temp <= 82))
jblackann 2:945fa201ce19 57 {
jblackann 2:945fa201ce19 58 pc.printf("received valid number\n\r");
jblackann 2:945fa201ce19 59 pc.printf("new channel, %d\n\r", rf_channel_temp);
jblackann 2:945fa201ce19 60 rf_channel = rf_channel + rf_channel_temp;
jblackann 2:945fa201ce19 61 pc.printf("new channel, %d\n\r", rf_channel);
jblackann 2:945fa201ce19 62 my_nrf24l01p.setRfFrequency(rf_channel);
jblackann 2:945fa201ce19 63 wait(1);
jblackann 2:945fa201ce19 64 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
jblackann 2:945fa201ce19 65 stayInWhile = 0;
jblackann 2:945fa201ce19 66 }
jblackann 2:945fa201ce19 67 else
jblackann 2:945fa201ce19 68 {
jblackann 2:945fa201ce19 69 pc.printf(" invalid RF channel number\n\r");
jblackann 2:945fa201ce19 70 }
jblackann 2:945fa201ce19 71
jblackann 2:945fa201ce19 72 }
jblackann 2:945fa201ce19 73 }
jblackann 2:945fa201ce19 74 else if (receivedChannelCharacter == 'q' ) // if received q, exit channel change
jblackann 2:945fa201ce19 75 {
jblackann 2:945fa201ce19 76 pc.printf("exiting Channel change mode\n\r");
jblackann 2:945fa201ce19 77 stayInWhile = 0;
jblackann 2:945fa201ce19 78 }
jblackann 2:945fa201ce19 79 else
jblackann 2:945fa201ce19 80 {
jblackann 2:945fa201ce19 81 pc.printf(" invalid number\n\r");
jblackann 2:945fa201ce19 82 }
jblackann 2:945fa201ce19 83 }
jblackann 2:945fa201ce19 84 wait(1);
jblackann 2:945fa201ce19 85 }
jblackann 2:945fa201ce19 86 pc.printf("exiting Channel change mode\n\r");
jblackann 2:945fa201ce19 87
jblackann 2:945fa201ce19 88 }
jblackann 2:945fa201ce19 89
Owen 0:a51a6e7da590 90 int main() {
Owen 0:a51a6e7da590 91
Owen 0:a51a6e7da590 92 // The nRF24L01+ supports transfers from 1 to 32 bytes, but Sparkfun's
Owen 0:a51a6e7da590 93 // "Nordic Serial Interface Board" (http://www.sparkfun.com/products/9019)
Owen 0:a51a6e7da590 94 // only handles 4 byte transfers in the ATMega code.
Owen 0:a51a6e7da590 95 #define TRANSFER_SIZE 4
Owen 0:a51a6e7da590 96
Owen 0:a51a6e7da590 97 char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE];
Owen 0:a51a6e7da590 98 int txDataCnt = 0;
Owen 0:a51a6e7da590 99 int rxDataCnt = 0;
jblackann 2:945fa201ce19 100 char receivedTerminalCharacter;
Owen 0:a51a6e7da590 101
Owen 0:a51a6e7da590 102 my_nrf24l01p.powerUp();
Owen 0:a51a6e7da590 103
Owen 0:a51a6e7da590 104 // Display the (default) setup of the nRF24L01+ chip
Owen 0:a51a6e7da590 105 pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() );
Owen 0:a51a6e7da590 106 pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() );
Owen 0:a51a6e7da590 107 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
Owen 0:a51a6e7da590 108 pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() );
Owen 0:a51a6e7da590 109 pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() );
Owen 0:a51a6e7da590 110
Owen 0:a51a6e7da590 111 pc.printf( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE );
Owen 0:a51a6e7da590 112
Owen 0:a51a6e7da590 113 my_nrf24l01p.setTransferSize( TRANSFER_SIZE );
Owen 0:a51a6e7da590 114
jblackann 2:945fa201ce19 115 my_nrf24l01p.setAirDataRate(NRF24L01P_DATARATE_250_KBPS);
jblackann 2:945fa201ce19 116 pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() );
jblackann 2:945fa201ce19 117
Owen 0:a51a6e7da590 118 my_nrf24l01p.setReceiveMode();
Owen 0:a51a6e7da590 119 my_nrf24l01p.enable();
Owen 0:a51a6e7da590 120
Owen 0:a51a6e7da590 121 while (1) {
Owen 0:a51a6e7da590 122
Owen 0:a51a6e7da590 123 // If we've received anything over the host serial link...
jblackann 2:945fa201ce19 124 if ( pc.readable() )
jblackann 2:945fa201ce19 125 {
Owen 0:a51a6e7da590 126
jblackann 2:945fa201ce19 127 receivedTerminalCharacter = pc.getc();
jblackann 2:945fa201ce19 128
jblackann 2:945fa201ce19 129 if (receivedTerminalCharacter >= '0' && receivedTerminalCharacter <= '9') // if received 0 through 9 load transmit buffer
jblackann 2:945fa201ce19 130 { // ...add it to the transmit buffer
jblackann 2:945fa201ce19 131 txData[txDataCnt++] = pc.getc();
Owen 0:a51a6e7da590 132
jblackann 2:945fa201ce19 133 // If the transmit buffer is full
jblackann 2:945fa201ce19 134 if ( txDataCnt >= sizeof( txData ) )
jblackann 2:945fa201ce19 135 {
jblackann 2:945fa201ce19 136
jblackann 2:945fa201ce19 137 // Send the transmitbuffer via the nRF24L01+
jblackann 2:945fa201ce19 138 my_nrf24l01p.write( NRF24L01P_PIPE_P0, txData, txDataCnt );
jblackann 2:945fa201ce19 139
jblackann 2:945fa201ce19 140 txDataCnt = 0;
jblackann 2:945fa201ce19 141 }
Owen 0:a51a6e7da590 142
jblackann 2:945fa201ce19 143 // Toggle LED1 (to help debug Host -> nRF24L01+ communication)
jblackann 2:945fa201ce19 144 myled1 = !myled1;
jblackann 2:945fa201ce19 145 }
jblackann 2:945fa201ce19 146 else if ((receivedTerminalCharacter == 'h') || (receivedTerminalCharacter == 'H'))
jblackann 2:945fa201ce19 147 {
jblackann 2:945fa201ce19 148 pc.printf("Radio help menu\n\r");
jblackann 2:945fa201ce19 149 pc.printf("Press c for channel: \n\r");
jblackann 2:945fa201ce19 150 pc.printf("Press t for TX Power: \n\r");
jblackann 2:945fa201ce19 151 pc.printf("Press d for datarate: \n\r");
jblackann 2:945fa201ce19 152 }
jblackann 2:945fa201ce19 153 else if (receivedTerminalCharacter == 'c')
jblackann 2:945fa201ce19 154 {
jblackann 2:945fa201ce19 155
jblackann 2:945fa201ce19 156 channelChangeMode();
Owen 0:a51a6e7da590 157 }
Owen 0:a51a6e7da590 158 }
Owen 0:a51a6e7da590 159
Owen 0:a51a6e7da590 160 // If we've received anything in the nRF24L01+...
Owen 0:a51a6e7da590 161 if ( my_nrf24l01p.readable() ) {
Owen 0:a51a6e7da590 162
Owen 0:a51a6e7da590 163 // ...read the data into the receive buffer
Owen 0:a51a6e7da590 164 rxDataCnt = my_nrf24l01p.read( NRF24L01P_PIPE_P0, rxData, sizeof( rxData ) );
Owen 0:a51a6e7da590 165
Owen 0:a51a6e7da590 166 // Display the receive buffer contents via the host serial link
Owen 0:a51a6e7da590 167 for ( int i = 0; rxDataCnt > 0; rxDataCnt--, i++ ) {
Owen 0:a51a6e7da590 168
Owen 0:a51a6e7da590 169 pc.putc( rxData[i] );
Owen 0:a51a6e7da590 170 }
Owen 0:a51a6e7da590 171
Owen 0:a51a6e7da590 172 // Toggle LED2 (to help debug nRF24L01+ -> Host communication)
Owen 0:a51a6e7da590 173 myled2 = !myled2;
Owen 0:a51a6e7da590 174 }
Owen 0:a51a6e7da590 175 }
Owen 0:a51a6e7da590 176 }