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: BufferedSerial SX1276GenericLib mbed
Fork of DISCO-L072CZ-LRWAN1_LoRa_PingPong by
Revision 11:52f7b34f1d3a, committed 2018-01-02
- Comitter:
- akashvibhute
- Date:
- Tue Jan 02 06:34:03 2018 +0000
- Parent:
- 10:f84959c2e044
- Commit message:
- First attempt at LoRa USB Tx
Changed in this revision
--- a/SX1276GenericPingPong/GenericPingPong.cpp Tue Jun 06 12:21:21 2017 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,414 +0,0 @@
-/*
- * This file contains a copy of the master content sx1276PingPong
- * with adaption for the SX1276Generic environment
- * (c) 2017 Helmut Tschemernjak
- * 30826 Garbsen (Hannover) Germany
- */
-
-#include "mbed.h"
-#include "PinMap.h"
-#include "GenericPingPong.h"
-#include "sx1276-mbed-hal.h"
-#include "main.h"
-
-#ifdef FEATURE_LORA
-
-/* Set this flag to '1' to display debug messages on the console */
-#define DEBUG_MESSAGE 1
-
-/* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
-#define USE_MODEM_LORA 1
-#define USE_MODEM_FSK !USE_MODEM_LORA
-#define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz
-#define TX_OUTPUT_POWER 14 // 14 dBm
-
-#if USE_MODEM_LORA == 1
-
-#define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
-#define LORA_SPREADING_FACTOR LORA_SF7
-#define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
-
-#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
-#define LORA_SYMBOL_TIMEOUT 5 // Symbols
-#define LORA_FIX_LENGTH_PAYLOAD_ON false
-#define LORA_FHSS_ENABLED false
-#define LORA_NB_SYMB_HOP 4
-#define LORA_IQ_INVERSION_ON false
-#define LORA_CRC_ENABLED true
-
-#elif USE_MODEM_FSK == 1
-
-#define FSK_FDEV 25000 // Hz
-#define FSK_DATARATE 19200 // bps
-#define FSK_BANDWIDTH 50000 // Hz
-#define FSK_AFC_BANDWIDTH 83333 // Hz
-#define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
-#define FSK_FIX_LENGTH_PAYLOAD_ON false
-#define FSK_CRC_ENABLED true
-
-#else
- #error "Please define a modem in the compiler options."
-#endif
-
-
-#define RX_TIMEOUT_VALUE 3500 // in ms
-
-//#define BUFFER_SIZE 32 // Define the payload size here
-#define BUFFER_SIZE 64 // Define the payload size here
-
-/*
- * Global variables declarations
- */
-typedef enum
-{
- LOWPOWER = 0,
- IDLE,
-
- RX,
- RX_TIMEOUT,
- RX_ERROR,
-
- TX,
- TX_TIMEOUT,
-
- CAD,
- CAD_DONE
-} AppStates_t;
-
-volatile AppStates_t State = LOWPOWER;
-
-/*!
- * Radio events function pointer
- */
-static RadioEvents_t RadioEvents;
-
-/*
- * Global variables declarations
- */
-SX1276Generic *Radio;
-
-
-const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING";
-const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG";
-
-uint16_t BufferSize = BUFFER_SIZE;
-uint8_t *Buffer;
-
-DigitalOut *led3;
-
-
-int SX1276PingPong()
-{
-#if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
- DigitalOut *led = new DigitalOut(LED2);
-#elif defined(TARGET_NUCLEO_L073RZ)
- DigitalOut *led = new DigitalOut(LED4); // RX red
- led3 = new DigitalOut(LED3); // TX blue
-#else
- DigitalOut *led = new DigitalOut(LED1);
- led3 = led;
-#endif
-
- Buffer = new uint8_t[BUFFER_SIZE];
- *led3 = 1;
-
-#ifdef B_L072Z_LRWAN1_LORA
- Radio = new SX1276Generic(NULL, MURATA_SX1276,
- LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
- LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
- LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
-#else // RFM95
- Radio = new SX1276Generic(NULL, RFM95_SX1276,
- LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
- LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
-
-#endif
-
- uint8_t i;
- bool isMaster = true;
-
- dprintf("SX1276 Ping Pong Demo Application" );
- dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
- dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
-#if USE_MODEM_LORA == 1
- dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
- dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
-#elif USE_MODEM_FSK == 1
- dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
- dprintf("Baudrate: %d", FSK_DATARATE);
-#endif
- // Initialize Radio driver
- RadioEvents.TxDone = OnTxDone;
- RadioEvents.RxDone = OnRxDone;
- RadioEvents.RxError = OnRxError;
- RadioEvents.TxTimeout = OnTxTimeout;
- RadioEvents.RxTimeout = OnRxTimeout;
- if (Radio->Init( &RadioEvents ) == false) {
- while(1) {
- dprintf("Radio could not be detected!");
- wait( 1 );
- }
- }
-
-
- switch(Radio->DetectBoardType()) {
- case SX1276MB1LAS:
- if (DEBUG_MESSAGE)
- dprintf(" > Board Type: SX1276MB1LAS <");
- break;
- case SX1276MB1MAS:
- if (DEBUG_MESSAGE)
- dprintf(" > Board Type: SX1276MB1LAS <");
- case MURATA_SX1276:
- if (DEBUG_MESSAGE)
- dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
- break;
- case RFM95_SX1276:
- if (DEBUG_MESSAGE)
- dprintf(" > HopeRF RFM95xx <");
- break;
- default:
- dprintf(" > Board Type: unknown <");
- }
-
- Radio->SetChannel(RF_FREQUENCY );
-
-#if USE_MODEM_LORA == 1
-
- if (LORA_FHSS_ENABLED)
- dprintf(" > LORA FHSS Mode <");
- if (!LORA_FHSS_ENABLED)
- dprintf(" > LORA Mode <");
-
- Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
- LORA_SPREADING_FACTOR, LORA_CODINGRATE,
- LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
- LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
- LORA_IQ_INVERSION_ON, 2000 );
-
- Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
- LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
- LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
- LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
- LORA_IQ_INVERSION_ON, true );
-
-#elif USE_MODEM_FSK == 1
-
- dprintf(" > FSK Mode <");
- Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
- FSK_DATARATE, 0,
- FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
- FSK_CRC_ENABLED, 0, 0, 0, 2000 );
-
- Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
- 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
- 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
- 0, 0, false, true );
-
-#else
-
-#error "Please define a modem in the compiler options."
-
-#endif
-
- if (DEBUG_MESSAGE)
- dprintf("Starting Ping-Pong loop");
-
-
- Radio->Rx( RX_TIMEOUT_VALUE );
-
- while( 1 )
- {
-#ifdef TARGET_STM32L4
- WatchDogUpdate();
-#endif
-
- switch( State )
- {
- case RX:
- *led3 = 0;
- if( isMaster == true )
- {
- if( BufferSize > 0 )
- {
- if( memcmp(Buffer, PongMsg, sizeof(PongMsg)) == 0 )
- {
- *led = !*led;
- dprintf( "...Pong" );
- // Send the next PING frame
- memcpy(Buffer, PingMsg, sizeof(PingMsg));
- // We fill the buffer with numbers for the payload
- for( i = sizeof(PingMsg); i < BufferSize; i++ )
- {
- Buffer[i] = i - sizeof(PingMsg);
- }
- wait_ms( 10 );
- Radio->Send( Buffer, BufferSize );
- }
- else if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
- { // A master already exists then become a slave
- dprintf( "...Ping" );
- *led = !*led;
- isMaster = false;
- // Send the next PONG frame
- memcpy(Buffer, PongMsg, sizeof(PongMsg));
- // We fill the buffer with numbers for the payload
- for( i = sizeof(PongMsg); i < BufferSize; i++ )
- {
- Buffer[i] = i - sizeof(PongMsg);
- }
- wait_ms( 10 );
- Radio->Send( Buffer, BufferSize );
- }
- else // valid reception but neither a PING or a PONG message
- { // Set device as master ans start again
- isMaster = true;
- Radio->Rx( RX_TIMEOUT_VALUE );
- }
- }
- }
- else
- {
- if( BufferSize > 0 )
- {
- if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
- {
- *led = !*led;
- dprintf( "...Ping" );
- // Send the reply to the PING string
- memcpy(Buffer, PongMsg, sizeof(PongMsg));
- // We fill the buffer with numbers for the payload
- for( i = sizeof(PongMsg); i < BufferSize; i++ )
- {
- Buffer[i] = i - sizeof(PongMsg);
- }
- wait_ms( 10 );
- Radio->Send( Buffer, BufferSize );
- }
- else // valid reception but not a PING as expected
- { // Set device as master and start again
- isMaster = true;
- Radio->Rx( RX_TIMEOUT_VALUE );
- }
- }
- }
- State = LOWPOWER;
- break;
- case TX:
- *led3 = 1;
- if( isMaster == true )
- {
- dprintf("Ping..." );
- }
- else
- {
- dprintf("Pong..." );
- }
- Radio->Rx( RX_TIMEOUT_VALUE );
- State = LOWPOWER;
- break;
- case RX_TIMEOUT:
- if( isMaster == true )
- {
- // Send the next PING frame
- memcpy(Buffer, PingMsg, sizeof(PingMsg));
- for( i = sizeof(PingMsg); i < BufferSize; i++ )
- {
- Buffer[i] = i - sizeof(PingMsg);
- }
- wait_ms( 10 );
- Radio->Send( Buffer, BufferSize );
- }
- else
- {
- Radio->Rx( RX_TIMEOUT_VALUE );
- }
- State = LOWPOWER;
- break;
- case RX_ERROR:
- // We have received a Packet with a CRC error, send reply as if packet was correct
- if( isMaster == true )
- {
- // Send the next PING frame
- memcpy(Buffer, PingMsg, sizeof(PingMsg));
- for( i = 4; i < BufferSize; i++ )
- {
- Buffer[i] = i - 4;
- }
- wait_ms( 10 );
- Radio->Send( Buffer, BufferSize );
- }
- else
- {
- // Send the next PONG frame
- memcpy(Buffer, PongMsg, sizeof(PongMsg));
- for( i = sizeof(PongMsg); i < BufferSize; i++ )
- {
- Buffer[i] = i - sizeof(PongMsg);
- }
- wait_ms( 10 );
- Radio->Send( Buffer, BufferSize );
- }
- State = LOWPOWER;
- break;
- case TX_TIMEOUT:
- Radio->Rx( RX_TIMEOUT_VALUE );
- State = LOWPOWER;
- break;
- case LOWPOWER:
- sleep();
- break;
- default:
- State = LOWPOWER;
- break;
- }
- }
-}
-
-void OnTxDone(void *radio)
-{
- Radio->Sleep( );
- State = TX;
- if (DEBUG_MESSAGE)
- dprintf("> OnTxDone");
-}
-
-void OnRxDone(void *radio, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
-{
- Radio->Sleep( );
- BufferSize = size;
- memcpy( Buffer, payload, BufferSize );
- State = RX;
- if (DEBUG_MESSAGE)
- dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
- dump("Data:", payload, size);
-}
-
-void OnTxTimeout(void *radio)
-{
- *led3 = 0;
- Radio->Sleep( );
- State = TX_TIMEOUT;
- if(DEBUG_MESSAGE)
- dprintf("> OnTxTimeout");
-}
-
-void OnRxTimeout(void *radio)
-{
- *led3 = 0;
- Radio->Sleep( );
- Buffer[BufferSize-1] = 0;
- State = RX_TIMEOUT;
- if (DEBUG_MESSAGE)
- dprintf("> OnRxTimeout");
-}
-
-void OnRxError(void *radio)
-{
- Radio->Sleep( );
- State = RX_ERROR;
- if (DEBUG_MESSAGE)
- dprintf("> OnRxError");
-}
-
-#endif
--- a/SX1276GenericPingPong/GenericPingPong.h Tue Jun 06 12:21:21 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - / _____) _ | | -( (____ _____ ____ _| |_ _____ ____| |__ - \____ \| ___ | (_ _) ___ |/ ___) _ \ - _____) ) ____| | | || |_| ____( (___| | | | -(______/|_____)_|_|_| \__)_____)\____)_| |_| - ( C )2014 Semtech - -Description: Contains the callbacks for the IRQs and any application related details - -License: Revised BSD License, see LICENSE.TXT file include in the project - -Maintainer: Miguel Luis and Gregory Cristian -*/ - -/* - * This file contains a copy of the master content sx1276PingPong - * with adaption for the SX1276Generic environment - * (c) 2017 Helmut Tschemernjak - * 30826 Garbsen (Hannover) Germany - */ - -#ifndef __SX1276PINGPONG_H__ -#define __SX1276PINGPONG_H__ - -#ifdef FEATURE_LORA -int SX1276PingPong(void); -#else -#define SX1276PingPong(x) void() -#endif -/* - * Callback functions prototypes - */ -/*! - * @brief Function to be executed on Radio Tx Done event - */ -void OnTxDone(void *radio); - -/*! - * @brief Function to be executed on Radio Rx Done event - */ -void OnRxDone(void *radio, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); - -/*! - * @brief Function executed on Radio Tx Timeout event - */ -void OnTxTimeout(void *radio); - -/*! - * @brief Function executed on Radio Rx Timeout event - */ -void OnRxTimeout(void *radio); - -/*! - * @brief Function executed on Radio Rx Error event - */ -void OnRxError(void *radio); - -/*! - * @brief Function executed on Radio Fhss Change Channel event - */ -void OnFhssChangeChannel(void *radio, uint8_t channelIndex ); - -/*! - * @brief Function executed on CAD Done event - */ -void OnCadDone(void *radio); - -#endif // __MAIN_H__ \ No newline at end of file
--- a/main.cpp Tue Jun 06 12:21:21 2017 +0000
+++ b/main.cpp Tue Jan 02 06:34:03 2018 +0000
@@ -8,15 +8,258 @@
DigitalOut myled(LED1);
BufferedSerial *ser;
+
+#ifdef FEATURE_LORA
+
+/* Set this flag to '1' to display debug messages on the console */
+#define DEBUG_MESSAGE 0
+
+/* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
+#define USE_MODEM_LORA 1
+#define USE_MODEM_FSK !USE_MODEM_LORA
+#define RF_FREQUENCY 915000000//RF_FREQUENCY_868_1 // Hz
+#define TX_OUTPUT_POWER 20 // 14 dBm
+
+#if USE_MODEM_LORA == 1
+
+#define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
+#define LORA_SPREADING_FACTOR LORA_SF12
+#define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
+
+#define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
+#define LORA_SYMBOL_TIMEOUT 5 // Symbols
+#define LORA_FIX_LENGTH_PAYLOAD_ON false
+#define LORA_FHSS_ENABLED false
+#define LORA_NB_SYMB_HOP 4
+#define LORA_IQ_INVERSION_ON false
+#define LORA_CRC_ENABLED true
+
+#elif USE_MODEM_FSK == 1
+
+#define FSK_FDEV 25000 // Hz
+#define FSK_DATARATE 19200 // bps
+#define FSK_BANDWIDTH 50000 // Hz
+#define FSK_AFC_BANDWIDTH 83333 // Hz
+#define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
+#define FSK_FIX_LENGTH_PAYLOAD_ON false
+#define FSK_CRC_ENABLED true
+
+#else
+ #error "Please define a modem in the compiler options."
+#endif
+
+
+#define RX_TIMEOUT_VALUE 8000//3500 // in ms
+
+//#define BUFFER_SIZE 32 // Define the payload size here
+#define BUFFER_SIZE 4//64 // Define the payload size here
+
+/*
+ * Global variables declarations
+ */
+typedef enum
+{
+ LOWPOWER = 0,
+ IDLE,
+
+ RX,
+ RX_TIMEOUT,
+ RX_ERROR,
+
+ TX,
+ TX_TIMEOUT,
+
+ CAD,
+ CAD_DONE
+} AppStates_t;
+
+volatile AppStates_t State = LOWPOWER;
+
+/*!
+ * Radio events function pointer
+ */
+static RadioEvents_t RadioEvents;
+
+/*
+ * Global variables declarations
+ */
+SX1276Generic *Radio;
+
+
+//const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING";
+const uint8_t PingMsg[] = { 'P', 'I', 'N', 'G'};// "PING";
+//const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG";
+const uint8_t PongMsg[] = { 'P', 'O', 'N', 'G'};// "PONG";
+
+uint16_t BufferSize = BUFFER_SIZE;
+uint8_t *Buffer;
+
+DigitalOut *led3;
+DigitalOut *led = new DigitalOut(LED1);
+
+uint8_t i;
+bool isMaster = false;
+
+uint8_t SX1276DataTx[4];
+uint8_t SX1276DataRx[4];
+bool mode = false; // false is slave, true is master
+
+uint8_t serialRxBuffer[4];
int main() {
SystemClock_Config();
ser = new BufferedSerial(USBTX, USBRX);
- ser->baud(115200*2);
+ ser->baud(115200);
ser->format(8);
ser->printf("Hello World\n\r");
myled = 1;
- SX1276PingPong();
+ #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
+ DigitalOut *led = new DigitalOut(LED2);
+#elif defined(TARGET_NUCLEO_L073RZ)
+ DigitalOut *led = new DigitalOut(LED4); // RX red
+ led3 = new DigitalOut(LED3); // TX blue
+#else
+ DigitalOut *led = new DigitalOut(LED1);
+ led3 = led;
+#endif
+
+ Buffer = new uint8_t[BUFFER_SIZE];
+ *led3 = 1;
+
+#ifdef B_L072Z_LRWAN1_LORA
+ Radio = new SX1276Generic(NULL, MURATA_SX1276,
+ LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
+ LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
+ LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
+#else // RFM95
+ Radio = new SX1276Generic(NULL, RFM95_SX1276,
+ LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
+ LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
+
+#endif
+
+
+ isMaster = true;
+
+ dprintf("SX1276 Ping Pong Demo Application" );
+ dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
+ dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
+#if USE_MODEM_LORA == 1
+ dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
+ dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
+#elif USE_MODEM_FSK == 1
+ dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
+ dprintf("Baudrate: %d", FSK_DATARATE);
+#endif
+ // Initialize Radio driver
+ RadioEvents.TxDone = OnTxDone;
+ RadioEvents.RxDone = OnRxDone;
+ RadioEvents.RxError = OnRxError;
+ RadioEvents.TxTimeout = OnTxTimeout;
+ RadioEvents.RxTimeout = OnRxTimeout;
+ if (Radio->Init( &RadioEvents ) == false) {
+ while(1) {
+ dprintf("Radio could not be detected!");
+ wait( 1 );
+ }
+ }
+
+
+ switch(Radio->DetectBoardType()) {
+ case SX1276MB1LAS:
+ if (DEBUG_MESSAGE)
+ dprintf(" > Board Type: SX1276MB1LAS <");
+ break;
+ case SX1276MB1MAS:
+ if (DEBUG_MESSAGE)
+ dprintf(" > Board Type: SX1276MB1LAS <");
+ case MURATA_SX1276:
+ if (DEBUG_MESSAGE)
+ dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
+ break;
+ case RFM95_SX1276:
+ if (DEBUG_MESSAGE)
+ dprintf(" > HopeRF RFM95xx <");
+ break;
+ default:
+ dprintf(" > Board Type: unknown <");
+ }
+
+ Radio->SetChannel(RF_FREQUENCY );
+
+#if USE_MODEM_LORA == 1
+
+ if (LORA_FHSS_ENABLED)
+ dprintf(" > LORA FHSS Mode <");
+ if (!LORA_FHSS_ENABLED)
+ dprintf(" > LORA Mode <");
+
+ Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
+ LORA_SPREADING_FACTOR, LORA_CODINGRATE,
+ LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
+ LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+ LORA_IQ_INVERSION_ON, 2000 );
+
+ Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
+ LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
+ LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
+ LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
+ LORA_IQ_INVERSION_ON, true );
+
+#elif USE_MODEM_FSK == 1
+
+ dprintf(" > FSK Mode <");
+ Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
+ FSK_DATARATE, 0,
+ FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
+ FSK_CRC_ENABLED, 0, 0, 0, 2000 );
+
+ Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
+ 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
+ 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
+ 0, 0, false, true );
+
+#else
+
+#error "Please define a modem in the compiler options."
+
+#endif
+
+ if (DEBUG_MESSAGE)
+ dprintf("Starting Tx loop");
+
+
+ Radio->Rx( RX_TIMEOUT_VALUE );
+
+ SX1276DataTx[0] = 0x0A;
+ SX1276DataTx[1] = 0x0B;
+ SX1276DataTx[2] = 0x0C;
+ SX1276DataTx[3] = 0x0D;
+
+ while(1)
+
+ //SX1276PingPong();
+ if(ser->readable() >= 1) {
+ //if(0) {
+ if(ser->getc() == '~')
+ {
+ for(int r=0; r<=3; r++){
+ while(ser->readable() == 0);
+ serialRxBuffer[r] = ser->getc();
+ }
+ //memcpy(serialRxBuffer, SX1276DataTx, 4);
+ ser->printf("Transmitting data: %x%x%x%x\n",serialRxBuffer[0], serialRxBuffer[1], serialRxBuffer[2], serialRxBuffer[3]);
+ //ser->printf("Transmitting data: %x%x%x%x\n\r",SX1276DataTx[0], SX1276DataTx[1], SX1276DataTx[2], SX1276DataTx[3]);
+
+ SX1276Comm(serialRxBuffer, 1, 1);
+ }
+ else {
+ //mode = 1;
+ //SX1276Comm(SX1276DataTx, 1, 1);
+ }
+ }
+
+
}
@@ -118,3 +361,267 @@
}
ser->printf("--\r\n");
}
+
+
+
+
+int SX1276PingPong()
+{
+
+
+ while( 1 )
+ {
+#ifdef TARGET_STM32L4
+ WatchDogUpdate();
+#endif
+
+ switch( State )
+ {
+ case RX:
+ *led3 = 0;
+ if( isMaster == true )
+ {
+ if( BufferSize > 0 )
+ {
+ if( memcmp(Buffer, PongMsg, sizeof(PongMsg)) == 0 )
+ {
+ *led = !*led;
+ dprintf( "...Pong" );
+ // Send the next PING frame
+ memcpy(Buffer, PingMsg, sizeof(PingMsg));
+ // We fill the buffer with numbers for the payload
+ for( i = sizeof(PingMsg); i < BufferSize; i++ )
+ {
+ Buffer[i] = i - sizeof(PingMsg);
+ }
+ //wait_ms( 10 );
+ Radio->Send( Buffer, BufferSize );
+ }
+ else if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
+ { // A master already exists then become a slave
+ dprintf( "...Ping" );
+ *led = !*led;
+ isMaster = false;
+ // Send the next PONG frame
+ memcpy(Buffer, PongMsg, sizeof(PongMsg));
+ // We fill the buffer with numbers for the payload
+ for( i = sizeof(PongMsg); i < BufferSize; i++ )
+ {
+ Buffer[i] = i - sizeof(PongMsg);
+ }
+ //wait_ms( 10 );
+ Radio->Send( Buffer, BufferSize );
+ }
+ else // valid reception but neither a PING or a PONG message
+ { // Set device as master ans start again
+ isMaster = true;
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ }
+ }
+ }
+ else
+ {
+ if( BufferSize > 0 )
+ {
+ if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
+ {
+ *led = !*led;
+ dprintf( "...Ping" );
+ // Send the reply to the PING string
+ memcpy(Buffer, PongMsg, sizeof(PongMsg));
+ // We fill the buffer with numbers for the payload
+ for( i = sizeof(PongMsg); i < BufferSize; i++ )
+ {
+ Buffer[i] = i - sizeof(PongMsg);
+ }
+ //wait_ms( 10 );
+ Radio->Send( Buffer, BufferSize );
+ }
+ else // valid reception but not a PING as expected
+ { // Set device as master and start again
+ isMaster = true;
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ }
+ }
+ }
+ State = LOWPOWER;
+ break;
+ case TX:
+ *led3 = 1;
+ if( isMaster == true )
+ {
+ dprintf("Ping..." );
+ }
+ else
+ {
+ dprintf("Pong..." );
+ }
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ State = LOWPOWER;
+ break;
+ case RX_TIMEOUT:
+ if( isMaster == true )
+ {
+ // Send the next PING frame
+ memcpy(Buffer, PingMsg, sizeof(PingMsg));
+ for( i = sizeof(PingMsg); i < BufferSize; i++ )
+ {
+ Buffer[i] = i - sizeof(PingMsg);
+ }
+ //wait_ms( 10 );
+ Radio->Send( Buffer, BufferSize );
+ }
+ else
+ {
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ }
+ State = LOWPOWER;
+ break;
+ case RX_ERROR:
+ // We have received a Packet with a CRC error, send reply as if packet was correct
+ if( isMaster == true )
+ {
+ // Send the next PING frame
+ memcpy(Buffer, PingMsg, sizeof(PingMsg));
+ for( i = 4; i < BufferSize; i++ )
+ {
+ Buffer[i] = i - 4;
+ }
+ //wait_ms( 10 );
+ Radio->Send( Buffer, BufferSize );
+ }
+ else
+ {
+ // Send the next PONG frame
+ memcpy(Buffer, PongMsg, sizeof(PongMsg));
+ for( i = sizeof(PongMsg); i < BufferSize; i++ )
+ {
+ Buffer[i] = i - sizeof(PongMsg);
+ }
+ //wait_ms( 10 );
+ Radio->Send( Buffer, BufferSize );
+ }
+ State = LOWPOWER;
+ break;
+ case TX_TIMEOUT:
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ State = LOWPOWER;
+ break;
+ case LOWPOWER:
+ sleep();
+ break;
+ default:
+ State = LOWPOWER;
+ break;
+ }
+ }
+}
+
+void OnTxDone(void *radio)
+{
+ Radio->Sleep( );
+ State = TX;
+ if (DEBUG_MESSAGE)
+ dprintf("> OnTxDone");
+}
+
+void OnRxDone(void *radio, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
+{
+ Radio->Sleep( );
+ BufferSize = size;
+ memcpy( Buffer, payload, BufferSize );
+ State = RX;
+ if (DEBUG_MESSAGE)
+ dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
+ dump("Data:", payload, size);
+}
+
+void OnTxTimeout(void *radio)
+{
+ *led3 = 0;
+ Radio->Sleep( );
+ State = TX_TIMEOUT;
+ if(DEBUG_MESSAGE)
+ dprintf("> OnTxTimeout");
+}
+
+void OnRxTimeout(void *radio)
+{
+ *led3 = 0;
+ Radio->Sleep( );
+ Buffer[BufferSize-1] = 0;
+ State = RX_TIMEOUT;
+ if (DEBUG_MESSAGE)
+ dprintf("> OnRxTimeout");
+}
+
+void OnRxError(void *radio)
+{
+ Radio->Sleep( );
+ State = RX_ERROR;
+ if (DEBUG_MESSAGE)
+ dprintf("> OnRxError");
+}
+
+#endif
+
+
+int SX1276Comm(uint8_t *commData, bool mode, bool ack)
+{
+ memcpy(Buffer, commData, sizeof(commData));
+ Radio->Send( Buffer, BufferSize );
+ wait_ms(500);
+/*
+ switch( State ) {
+ case RX:
+ Radio->Rx( RX_TIMEOUT_VALUE );
+
+ //memcpy(Buffer, commData, sizeof(Buffer));
+ //ser->printf("Rx Data\n\r", Buffer[0], Buffer[1], Buffer[2], Buffer[3]);
+ memcpy(Buffer, commData, sizeof(commData));
+ Radio->Send( Buffer, BufferSize );
+ //State = LOWPOWER;
+ break;
+ case TX:
+
+ memcpy(Buffer, commData, sizeof(commData));
+ Radio->Send( Buffer, BufferSize );
+
+ //State = LOWPOWER;
+ break;
+ case RX_TIMEOUT:
+
+
+ memcpy(Buffer, commData, sizeof(commData));
+ Radio->Send( Buffer, BufferSize );
+
+
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ //State = LOWPOWER;
+ break;
+ case RX_ERROR:
+
+
+ memcpy(Buffer, commData, sizeof(commData));
+ Radio->Send( Buffer, BufferSize );
+
+ wait_ms(10);
+ Radio->Rx( RX_TIMEOUT_VALUE );
+ //State = LOWPOWER;
+ break;
+ case TX_TIMEOUT:
+
+ memcpy(Buffer, commData, sizeof(commData));
+ Radio->Send( Buffer, BufferSize );
+
+ //State = LOWPOWER;
+ break;
+ case LOWPOWER:
+ sleep();
+ break;
+ default:
+ //State = LOWPOWER;
+ break;
+ }
+ */
+}
--- a/main.h Tue Jun 06 12:21:21 2017 +0000
+++ b/main.h Tue Jan 02 06:34:03 2018 +0000
@@ -7,11 +7,51 @@
#include "mbed.h"
#include "PinMap.h"
#include "BufferedSerial.h"
-#include "GenericPingPong.h"
+#include "sx1276-mbed-hal.h"
void SystemClock_Config(void);
extern BufferedSerial *ser;
extern void dump(const char *title, const void *data, int len, bool dwords = false);
-#define dprintf(...) { ser->printf(__VA_ARGS__); ser->printf("\r\n"); }
\ No newline at end of file
+#define dprintf(...) { ser->printf(__VA_ARGS__); ser->printf("\r\n"); }
+
+int SX1276PingPong(void);
+int SX1276Comm(uint8_t *commDataTx, bool mode, bool ack);
+/*
+ * Callback functions prototypes
+ */
+/*!
+ * @brief Function to be executed on Radio Tx Done event
+ */
+void OnTxDone(void *radio);
+
+/*!
+ * @brief Function to be executed on Radio Rx Done event
+ */
+void OnRxDone(void *radio, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
+
+/*!
+ * @brief Function executed on Radio Tx Timeout event
+ */
+void OnTxTimeout(void *radio);
+
+/*!
+ * @brief Function executed on Radio Rx Timeout event
+ */
+void OnRxTimeout(void *radio);
+
+/*!
+ * @brief Function executed on Radio Rx Error event
+ */
+void OnRxError(void *radio);
+
+/*!
+ * @brief Function executed on Radio Fhss Change Channel event
+ */
+void OnFhssChangeChannel(void *radio, uint8_t channelIndex );
+
+/*!
+ * @brief Function executed on CAD Done event
+ */
+void OnCadDone(void *radio);
\ No newline at end of file
