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);