txrx test code
Dependencies: BufferedSerial SX1276GenericLib mbed
GenericPingPong.cpp
00001 /* 00002 * This file contains a copy of the master content sx1276PingPong 00003 * with adaption for the SX1276Generic environment 00004 * (c) 2017 Helmut Tschemernjak 00005 * 30826 Garbsen (Hannover) Germany 00006 */ 00007 00008 #include "mbed.h" 00009 #include "PinMap.h" 00010 #include "GenericPingPong.h" 00011 #include "sx1276-mbed-hal.h" 00012 #include "main.h" 00013 00014 #ifdef FEATURE_LORA 00015 00016 /* Set this flag to '1' to display debug messages on the console */ 00017 #define DEBUG_MESSAGE 1 00018 00019 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ 00020 #define USE_MODEM_LORA 1 00021 #define USE_MODEM_FSK !USE_MODEM_LORA 00022 #define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz 00023 #define TX_OUTPUT_POWER 14 // 14 dBm 00024 00025 #if USE_MODEM_LORA == 1 00026 00027 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap 00028 #define LORA_SPREADING_FACTOR LORA_SF11 00029 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5 00030 00031 #define LORA_PREAMBLE_LENGTH 6 // Same for Tx and Rx 00032 #define LORA_SYMBOL_TIMEOUT 10 // Symbols 00033 #define LORA_FIX_LENGTH_PAYLOAD_ON false 00034 #define LORA_FHSS_ENABLED false 00035 #define LORA_NB_SYMB_HOP 4 00036 #define LORA_IQ_INVERSION_ON false 00037 #define LORA_CRC_ENABLED true 00038 00039 #elif USE_MODEM_FSK == 1 00040 00041 #define FSK_FDEV 25000 // Hz 00042 #define FSK_DATARATE 19200 // bps 00043 #define FSK_BANDWIDTH 50000 // Hz 00044 #define FSK_AFC_BANDWIDTH 83333 // Hz 00045 #define FSK_PREAMBLE_LENGTH 6 // Same for Tx and Rx 00046 #define FSK_FIX_LENGTH_PAYLOAD_ON true 00047 #define FSK_CRC_ENABLED true 00048 00049 #else 00050 #error "Please define a modem in the compiler options." 00051 #endif 00052 00053 00054 #define RX_TIMEOUT_VALUE 3500 // in ms 00055 00056 //#define BUFFER_SIZE 32 // Define the payload size here 00057 #define BUFFER_SIZE 2 // Define the payload size here 00058 00059 /* 00060 * Global variables declarations 00061 */ 00062 typedef enum { 00063 SLEEP = 0, 00064 RX_INIT, 00065 RX_INIT_WAIT, 00066 RX_ENUM, 00067 RX_ENUM_WAIT, 00068 TX_PING, 00069 RX_TIMEOUT, 00070 RX_ERROR, 00071 TX_INIT, 00072 TX_INIT_WAIT, 00073 TX_ENUM, 00074 TX_ENUM_WAIT, 00075 CAD, 00076 CAD_DONE 00077 } AppStates_t; 00078 00079 volatile AppStates_t State = TX_INIT; 00080 00081 /*! 00082 * Radio events function pointer 00083 */ 00084 static RadioEvents_t RadioEvents; 00085 00086 /* 00087 * Global variables declarations 00088 */ 00089 SX1276Generic *Radio; 00090 00091 00092 const uint8_t PingMsg[] = { 0xFF, 0xFF, 0xFF, 0xFF};// "PING"; 00093 const uint8_t PongMsg[] = { 0xFF, 0xFF, 0xFF, 0xFF};// "PONG"; 00094 uint16_t BufferSize = BUFFER_SIZE; 00095 uint8_t *Buffer; 00096 00097 DigitalOut *led3; 00098 00099 00100 int SX1276PingPong() 00101 { 00102 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) ) 00103 DigitalOut *led = new DigitalOut(LED2); 00104 #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1) 00105 DigitalOut *led = new DigitalOut(LED4); // RX red 00106 led3 = new DigitalOut(LED3); // TX blue 00107 #else 00108 DigitalOut *led = new DigitalOut(LED1); 00109 led3 = led; 00110 #endif 00111 00112 Buffer = new uint8_t[BUFFER_SIZE]; 00113 *led3 = 1; 00114 00115 #ifdef B_L072Z_LRWAN1_LORA 00116 Radio = new SX1276Generic(NULL, MURATA_SX1276, 00117 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, 00118 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, 00119 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); 00120 #else // RFM95 00121 Radio = new SX1276Generic(NULL, RFM95_SX1276, 00122 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, 00123 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5); 00124 00125 #endif 00126 00127 uint8_t i; 00128 00129 dprintf("SX1276 Ping Pong Demo Application" ); 00130 dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0); 00131 dprintf("TXPower: %d dBm", TX_OUTPUT_POWER); 00132 #if USE_MODEM_LORA == 1 00133 dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH); 00134 dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR); 00135 #elif USE_MODEM_FSK == 1 00136 dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH); 00137 dprintf("Baudrate: %d", FSK_DATARATE); 00138 #endif 00139 // Initialize Radio driver 00140 RadioEvents.TxDone = OnTxDone; 00141 RadioEvents.RxDone = OnRxDone; 00142 RadioEvents.RxError = OnRxError; 00143 RadioEvents.TxTimeout = OnTxTimeout; 00144 RadioEvents.RxTimeout = OnRxTimeout; 00145 if (Radio->Init( &RadioEvents ) == false) { 00146 while(1) { 00147 dprintf("Radio could not be detected!"); 00148 wait( 1 ); 00149 } 00150 } 00151 00152 00153 switch(Radio->DetectBoardType()) { 00154 case SX1276MB1LAS: 00155 if (DEBUG_MESSAGE) 00156 dprintf(" > Board Type: SX1276MB1LAS <"); 00157 break; 00158 case SX1276MB1MAS: 00159 if (DEBUG_MESSAGE) 00160 dprintf(" > Board Type: SX1276MB1LAS <"); 00161 case MURATA_SX1276: 00162 if (DEBUG_MESSAGE) 00163 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <"); 00164 break; 00165 case RFM95_SX1276: 00166 if (DEBUG_MESSAGE) 00167 dprintf(" > HopeRF RFM95xx <"); 00168 break; 00169 default: 00170 dprintf(" > Board Type: unknown <"); 00171 } 00172 00173 Radio->SetChannel(RF_FREQUENCY ); 00174 00175 #if USE_MODEM_LORA == 1 00176 00177 if (LORA_FHSS_ENABLED) 00178 dprintf(" > LORA FHSS Mode <"); 00179 if (!LORA_FHSS_ENABLED) 00180 dprintf(" > LORA Mode <"); 00181 00182 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, 00183 LORA_SPREADING_FACTOR, LORA_CODINGRATE, 00184 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, 00185 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 00186 LORA_IQ_INVERSION_ON, 2000 ); 00187 00188 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, 00189 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, 00190 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, 00191 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 00192 LORA_IQ_INVERSION_ON, true ); 00193 00194 #elif USE_MODEM_FSK == 1 00195 00196 dprintf(" > FSK Mode <"); 00197 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, 00198 FSK_DATARATE, 0, 00199 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, 00200 FSK_CRC_ENABLED, 0, 0, 0, 2000 ); 00201 00202 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, 00203 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, 00204 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, 00205 0, 0, false, true ); 00206 00207 #else 00208 00209 #error "Please define a modem in the compiler options." 00210 00211 #endif 00212 00213 00214 if (DEBUG_MESSAGE) 00215 dprintf("Starting INIT_LOOP"); 00216 00217 00218 00219 while( 1 ) { 00220 #ifdef TARGET_STM32L4 00221 WatchDogUpdate(); 00222 #endif 00223 00224 switch( State ) { 00225 case SLEEP: 00226 00227 dprintf("Sleep()"); 00228 wait_ms(10000); 00229 State = RX_INIT; 00230 break; 00231 case RX_INIT: 00232 dprintf("RX_INIT()"); 00233 Radio->Rx( 8000 ); 00234 while(State == RX_INIT) {} 00235 break; 00236 case RX_ENUM: 00237 dprintf("RX_ENUM()!!!!!!!!!!!!!!!!!!!!!!!!"); 00238 Radio->Rx( 23000 ); 00239 while(State == RX_ENUM) {} 00240 break; 00241 case RX_TIMEOUT: 00242 dprintf("RX_TIMEOUT()"); 00243 State = SLEEP; 00244 break; 00245 00246 case TX_PING: 00247 dprintf("RX_Ping()!!!!!!!!!!!!!!!!!!!!!!!!"); 00248 State = SLEEP; 00249 break; 00250 case TX_INIT: 00251 int txcount = 0; 00252 for(txcount=0;txcount<1000;txcount++) { 00253 dprintf("TX_INIT()"); 00254 // Send the next PING frame 00255 //memcpy(Buffer, PingMsg, 2); 00256 00257 wait_ms( 1000 ); 00258 dprintf("dump(0x%x, %d bytes)", PingMsg, 2); 00259 Radio->Send( (void*) PingMsg, BufferSize ); 00260 dprintf("TX_INIT_SENT()"); 00261 State = TX_INIT_WAIT; 00262 while(State == TX_INIT_WAIT) {}; 00263 00264 } 00265 State=TX_ENUM; 00266 break; 00267 case TX_INIT_WAIT: 00268 wait_ms(100); 00269 break; 00270 case TX_ENUM: 00271 dprintf("TX_ENUM()!!!!!!!!!!!!!!!!!!!!!!!!!!"); 00272 wait_ms(500); 00273 // Send the next PING frame 00274 memcpy(Buffer, PingMsg, sizeof(PingMsg)); 00275 for( i = 4; i < BufferSize; i++ ) { 00276 Buffer[i] = i - 4; 00277 } 00278 wait_ms( 10 ); 00279 Radio->Send( Buffer, BufferSize ); 00280 dprintf("TX_ENUM_SENT()"); 00281 State = TX_INIT_WAIT; 00282 while(State == TX_INIT_WAIT) {} 00283 break; 00284 default: 00285 State = SLEEP; 00286 break; 00287 } 00288 } 00289 } 00290 00291 void OnTxDone(void *radio, void *a, void *b) 00292 { 00293 Radio->Sleep( ); 00294 if(State == TX_INIT_WAIT) State = TX_INIT; 00295 dprintf("> OnTxDone"); 00296 } 00297 00298 void OnRxDone(void *radio, void *a, void *b, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) 00299 { 00300 dprintf("dump(0x%x, %d bytes)", payload, 2); 00301 dprintf("> OnRxDone"); 00302 Radio->Sleep( ); 00303 BufferSize = size; 00304 //memcpy( Buffer, payload, BufferSize ); 00305 dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d, size=%d", rssi, snr, size); 00306 if(size != 2) { 00307 State=SLEEP; 00308 dprintf("> Payload error"); 00309 return;} 00310 decodePayload(payload, size); 00311 } 00312 00313 void decodePayload(const void *data, int len) 00314 { 00315 dprintf("dump(0x%x, %d bytes)", data, len); 00316 00317 unsigned char *u; 00318 00319 u = (unsigned char *)data; 00320 if(*u == 1) State = RX_ENUM; 00321 if(*u == 2) State == TX_PING; 00322 else { 00323 dprintf("> Invalid RX Command"); 00324 State = SLEEP; 00325 } 00326 } 00327 00328 void OnTxTimeout(void *radio, void *a, void *b) 00329 { 00330 Radio->Sleep( ); 00331 State = SLEEP; 00332 dprintf("> OnTxTimeout"); 00333 } 00334 00335 void OnRxTimeout(void *radio, void *a, void *b) 00336 { 00337 dprintf("> OnRxTimeout"); 00338 Radio->Sleep( ); 00339 Buffer[BufferSize-1] = 0; 00340 dprintf("> OnRxTimeout"); 00341 State = SLEEP; 00342 } 00343 00344 void OnRxError(void *radio, void *a, void *b) 00345 { 00346 dprintf("> OnRxError"); 00347 Radio->Sleep( ); 00348 dprintf("> OnRxError"); 00349 } 00350 00351 #endif
Generated on Wed Jul 20 2022 09:44:40 by 1.7.2