Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: nRF24L01P_Hello_World nRF24L01P
Revision 5:668dd9395ca5, committed 2021-04-16
- Comitter:
- voltxd
- Date:
- Fri Apr 16 16:01:03 2021 +0000
- Parent:
- 4:5caf9e1dc16c
- Commit message:
- ok;
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/circularBuffer.cpp Fri Apr 16 16:01:03 2021 +0000 @@ -0,0 +1,94 @@ +#include "circularBuffer.h" + +//-----------------------------TX-----------------------------// +int cbTxHead; +int cbTxTail; +char cbTxBuffer[BUFFER_SIZE]; + +void cbTxSendMessage(char* message, int length) +{ + int i; + if (cbTxRemainingSize() > length) + for (i = 0; i < length; i++) + cbTxAddOne(message[i]); +} + +void cbTxAddOne(char value) +{ + if (cbTxRemainingSize() > 0) + { + cbTxBuffer[cbTxHead++] = value; + if (cbTxHead >= BUFFER_SIZE) + cbTxHead = 0; + } +} + +char cbTxGetOne() +{ + char value = cbTxBuffer[cbTxTail++]; + if (cbTxTail >= BUFFER_SIZE) + cbTxTail = 0; + return value; +} + +int cbTxRemainingSize() +{ + int size; + if (cbTxTail > cbTxHead) + size = cbTxTail - cbTxHead; + else + size = BUFFER_SIZE - (cbTxHead - cbTxTail); + return size; +} + +int cbTxGetDataSize() +{ + return BUFFER_SIZE - cbTxRemainingSize(); +} + + +//-----------------------------RX-----------------------------// +int cbRxHead; +int cbRxTail; +char cbRxBuffer[BUFFER_SIZE]; + +void cbRxAddOne(char value) +{ + if (cbRxRemainingSize() > 0) + { + cbRxBuffer[cbRxHead++] = value; + if (cbRxHead >= BUFFER_SIZE) + cbRxHead = 0; + } +} + +char cbRxGetOne() +{ + char value = cbRxBuffer[cbRxTail++]; + if (cbRxTail >= BUFFER_SIZE) + cbRxTail = 0; + return value; +} + +unsigned char cbRxIsDataAvailable() +{ + if (cbRxTail != cbRxHead) + return 1; + else + return 0; +} + +int cbRxRemainingSize() +{ + int size; + if (cbRxTail > cbRxHead) + size = cbRxTail - cbRxHead; + else + size = BUFFER_SIZE - (cbRxHead - cbRxTail); + return size; +} + +int cbRxGetDataSize() +{ + return BUFFER_SIZE - cbRxRemainingSize(); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/circularBuffer.h Fri Apr 16 16:01:03 2021 +0000 @@ -0,0 +1,20 @@ +#ifndef CIRCULAR_BUFFER_H +#define CIRCULAR_BUFFER_H + +#define BUFFER_SIZE 128 + +//TX +void cbTxSendMessage(char* message, int length); +void cbTxAddOne(char value); +char cbTxGetOne(); +int cbTxRemainingSize(); +int cbTxGetDataSize(); + +//RX +void cbRxAddOne(char value); +char cbRxGetOne(); +unsigned char cbRxIsDataAvailable(); +int cbRxRemainingSize(); +int cbRxGetDataSize(); + +#endif \ No newline at end of file
--- a/main.cpp Fri Jan 08 08:51:10 2021 +0000 +++ b/main.cpp Fri Apr 16 16:01:03 2021 +0000 @@ -1,100 +1,73 @@ #include "main.h" #include "mbed.h" #include "nRF24L01P.h" -#include "protocol.h" +#include "circularBuffer.h" -//Protocole de communication possible : -//SOF, Function, Payload Length, Payload, Checksum -//1By, 2By, 2By, nBy, 1By - -Serial pc(USBTX, USBRX); // tx, rx +UnbufferedSerial pc(USBTX, USBRX, 115200); // tx, rx, baudrate nRF24L01P my_nrf24l01p(SPI3_MOSI, SPI3_MISO, SPI3_SCLK, CSN, CE, IRQ); // mosi, miso, sck, csn, ce, irq DigitalOut myled1(D4); DigitalOut myled2(D5); +char sendFlag = 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. - - char txData[TRANSFER_SIZE], rxData[TRANSFER_SIZE]; - int txDataCnt = 0; - int rxDataCnt = 0; +// 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. + char txData[TRANSFERT_SIZE]; + //Interruption sur réception Port Série + pc.attach(&usbRxInterrupt, SerialBase::RxIrq); + + my_nrf24l01p.powerUp(); - - // Display the (default) setup of the nRF24L01+ chip - pc.printf("Default setup : \r\n"); - pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() ); - pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() ); - pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() ); - pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() ); - pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() ); - pc.printf("\r\n\r\n"); + //Configuration nRF24101P my_nrf24l01p.setRfFrequency(NRF24L01P_MIN_RF_FREQUENCY); my_nrf24l01p.setAirDataRate(NRF24L01P_DATARATE_2_MBPS); - my_nrf24l01p.setTxAddress(0xFFE); - my_nrf24l01p.setRxAddress(0xFFA); - - // Display the (custom) setup of the nRF24L01+ chip - pc.printf("Custom setup : \r\n"); - pc.printf( "nRF24L01+ Frequency : %d MHz\r\n", my_nrf24l01p.getRfFrequency() ); - pc.printf( "nRF24L01+ Output power : %d dBm\r\n", my_nrf24l01p.getRfOutputPower() ); - pc.printf( "nRF24L01+ Data Rate : %d kbps\r\n", my_nrf24l01p.getAirDataRate() ); - pc.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", my_nrf24l01p.getTxAddress() ); - pc.printf( "nRF24L01+ RX Address : 0x%010llX\r\n", my_nrf24l01p.getRxAddress() ); - pc.printf("\r\n\r\n"); - - - my_nrf24l01p.setTransferSize( TRANSFER_SIZE ); - - my_nrf24l01p.setReceiveMode(); + my_nrf24l01p.setRfOutputPower(-6); + my_nrf24l01p.setTxAddress(0xFFA); + my_nrf24l01p.setRxAddress(0xFFE); + my_nrf24l01p.setTransferSize(TRANSFERT_SIZE); + my_nrf24l01p.setTransmitMode(); + my_nrf24l01p.enable(); - - pc.printf( "Type keys to test transfers:\r\n (transfers are grouped into %d characters)\r\n", TRANSFER_SIZE ); - - //Infinite loop + + + //Infinite Loop while (1) { - // If we've received anything over the host serial link... - if (pc.readable()) + // Si une trame est prête (4 octets) + if (sendFlag) { - // ...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; - } - + sendFlag = 0; + int i; + + //On récupère la trame du buffer + for (i = 0; i < TRANSFERT_SIZE; i++) + txData[i] = cbTxGetOne(); + + // Send the transmitbuffer via the nRF24L01+ + my_nrf24l01p.write(NRF24L01P_PIPE_P0, txData, TRANSFERT_SIZE); + // Toggle LED1 (to help debug Host -> nRF24L01+ communication) myled1 = !myled1; } - - // If we've received anything in the nRF24L01+... - if ( my_nrf24l01p.readable() ) - { - - // ...read the data into the receive buffer - int rxDataCnt = 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] ); - } - - // Toggle LED2 (to help debug nRF24L01+ -> Host communication) - myled2 = !myled2; - } + } +} + +void usbRxInterrupt() +{ + //On a reçu un octet, on le récupère et on le met dans le buffer + char c; + if(pc.read(&c, 1)) + { + cbTxAddOne(c); + //S'il y a 4 octets dans le buffer, on peut les envoyer (passage du flag à 1) + if (cbTxGetDataSize() >= 4) + sendFlag = 1; } } \ No newline at end of file
--- a/main.h Fri Jan 08 08:51:10 2021 +0000 +++ b/main.h Fri Apr 16 16:01:03 2021 +0000 @@ -9,8 +9,9 @@ #define CE D8 #define IRQ A0 -//Taille de la trame envoyé -#define TRANSFER_SIZE 4 +//Taille des trames envoyé en RF +#define TRANSFERT_SIZE 4 +void usbRxInterrupt(); #endif \ No newline at end of file
--- a/mbed-os.lib Fri Jan 08 08:51:10 2021 +0000 +++ b/mbed-os.lib Fri Apr 16 16:01:03 2021 +0000 @@ -1,1 +1,1 @@ -https://github.com/ARMmbed/mbed-os/#cf4f12a123c05fcae83fc56d76442015cb8a39e9 +https://github.com/ARMmbed/mbed-os/#bfde5aa1e74802771eaeacfa74789f71677325cb
--- a/protocol.cpp Fri Jan 08 08:51:10 2021 +0000 +++ b/protocol.cpp Fri Apr 16 16:01:03 2021 +0000 @@ -1,22 +1,23 @@ #include "protocol.h" -#include "bufferCirculaire.h" +#include "circularBuffer.h" //------------------------------------------------Encodage/Decodage des trames------------------------------------------------// //!!! La taille de "msg[]" doit être [msgPayloadLength + 6] -int encodeMessage(int msgFunction, int msgPayloadLength, char* msgPayload, char* msg) +void encodeAndSendMessage(int msgFunction, int msgPayloadLength, char* msgPayload) { - int msgLength = 0; - msg[msgLength++] = 0xFE; //Start of Frame - msg[msgLength++] = (char)(msgFunction >> 8); //Message Function MSB - msg[msgLength++] = (char)(msgFunction); //Message Function LSB - msg[msgLength++] = (char)(msgPayloadLength >> 8); //Message Payload Length MSB - msg[msgLength++] = (char)(msgPayloadLength); //Message Payload Length LSB + int msgIndex = 0; + char msg[msgPayloadLength + 6]; + msg[msgIndex++] = 0xFE; //Start of Frame + msg[msgIndex++] = (char)(msgFunction >> 8); //Message Function MSB + msg[msgIndex++] = (char)(msgFunction); //Message Function LSB + msg[msgIndex++] = (char)(msgPayloadLength >> 8); //Message Payload Length MSB + msg[msgIndex++] = (char)(msgPayloadLength); //Message Payload Length LSB int j; for (j = 0 ; j < msgPayloadLength; j++) - msg[msgLength++] = msgPayload[j]; //MessagePayload - msg[msgLength++] = calculateChecksum(msgFunction, msgPayloadLength, msgPayload); //Checksum + msg[msgIndex++] = msgPayload[j]; //MessagePayload + msg[msgIndex++] = calculateChecksum(msgFunction, msgPayloadLength, msgPayload); //Checksum - return msgLength; + cbTxSendMessage(msg, msgPayloadLength + 6); } char calculateChecksum(int msgFunction, int msgPayloadLength, char* msgPayload)
--- a/protocol.h Fri Jan 08 08:51:10 2021 +0000 +++ b/protocol.h Fri Apr 16 16:01:03 2021 +0000 @@ -17,7 +17,7 @@ //#define //Prototypes des fonctions -int encodeMessage(int msgFunction, int msgPayloadLength, char* msgPayload, char* msg); +void encodeAndSendMessage(int msgFunction, int msgPayloadLength, char* msgPayload); char calculateChecksum(int msgFunction, int msgPayloadLength, char* msgPayload); void decodeMessage(char receivedByte);