#include #include #include "sx126x.h" #include "sx126x-board.h" #include "delay.h" #include "Lora.h" #include "user.h" #include "sx126x-board.h" #include "string.h" #include "stdio.h" #include "delay.h" static RadioEvents_t RadioEvents; #define USE_MODEM_LORA //#define USE_MODEM_FSK #define REGION_CN779 #if defined( REGION_AS923 ) #define RF_FREQUENCY 923000000 // Hz #elif defined( REGION_AU915 ) #define RF_FREQUENCY 915000000 // Hz #elif defined( REGION_CN779 ) #define RF_FREQUENCY 433000000 // Hz #define RF_FREQUENCY_R 500000000 // Hz #define RF_FREQUENCY_T 470200000 // Hz #elif defined( REGION_EU868 ) #define RF_FREQUENCY 868000000 // Hz #elif defined( REGION_KR920 ) #define RF_FREQUENCY 920000000 // Hz #elif defined( REGION_IN865 ) #define RF_FREQUENCY 865000000 // Hz #elif defined( REGION_US915 ) #define RF_FREQUENCY 915000000 // Hz #elif defined( REGION_US915_HYBRID ) #define RF_FREQUENCY 915000000 // Hz #else #error "Please define a frequency band in the compiler 'options." #endif #define TX_OUTPUT_POWER 22 // 22 dBm extern bool IrqFired; bool EnableMaster=true;//Ö÷Ñ¡Ôñ //bool EnableMaster=false;//´ÓÑ¡Ôñ uint16_t crc_value; /*! * Radio events function pointer */ static RadioEvents_t RadioEvents; #if defined( USE_MODEM_LORA ) #define LORA_BANDWIDTH 2 // [0: 125 kHz, // 1: 250 kHz, // 2: 500 kHz, // 3: Reserved] #define LORA_SPREADING_FACTOR 5 // [SF7..SF12] #define LORA_CODINGRATE 1 // [1: 4/5, // 2: 4/6, // 3: 4/7, // 4: 4/8] #define LORA_PREAMBLE_LENGTH_T 96 // Same for Tx #define LORA_PREAMBLE_LENGTH_R 64 // Same for Rx //#define LORA_PREAMBLE_LENGTH 990 // Same for Tx and Rx #define LORA_SYMBOL_TIMEOUT 0 // Symbols #define LORA_FIX_LENGTH_PAYLOAD_ON false #define LORA_IQ_INVERSION_ON_T false #define LORA_IQ_INVERSION_ON_R true #elif defined( USE_MODEM_FSK ) #define FSK_FDEV 5e3 // Hz #define FSK_DATARATE 2.4e3 // bps #define FSK_BANDWIDTH 20e3 // Hz >> DSB in sx126x #define FSK_AFC_BANDWIDTH 100e3 // Hz #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx #define FSK_FIX_LENGTH_PAYLOAD_ON false #else #error "Please define a modem in the compiler options." #endif typedef enum { LOWPOWER, RX, RX_TIMEOUT, RX_ERROR, TX, TX_TIMEOUT, }States_t; #define RX_TIMEOUT_VALUE 1000 #define BUFFER_SIZE 64 // Define the payload size here const uint8_t PingMsg[] = "PING"; const uint8_t PongMsg[] = "PONG"; uint16_t BufferSize = BUFFER_SIZE; uint8_t TX_Buffer[BUFFER_SIZE]; uint8_t RX_Buffer[BUFFER_SIZE]; States_t State = LOWPOWER; int8_t RssiValue = 0; int8_t SnrValue = 0; void OnTxDone( void ); void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ); void OnTxTimeout( void ); void OnRxTimeout( void ); void OnRxError( void ); void LedToggle(void) { // HAL_GPIO_TogglePin(GPIOB, LED1_Pin); } void OnTxDone( void ) { // T_R_Init(0); Radio.Standby(); // Radio.Rx( RX_TIMEOUT_VALUE ); //½øÈë½ÓÊÕ } extern uint16_t tx_num; void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) { BufferSize = size; memcpy( RX_Buffer, payload, BufferSize ); RssiValue = rssi; SnrValue = snr; Radio.Standby(); if(EnableMaster) { if(memcmp(RX_Buffer,PongMsg,4)==0) { LedToggle();//LEDÉÁ˸ printf("Master RXD PONG!\r\n"); } // HAL_Delay_nMS(1000); // // TX_Buffer[0] = 'P'; // TX_Buffer[1] = 'I'; // TX_Buffer[2] = 'N'; // TX_Buffer[3] = 'G'; // //// crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//¼ÆËãµÃ³öÒª·¢ËÍÊý¾Ý°üCRCÖµ //// TX_Buffer[4]=crc_value>>8; //// TX_Buffer[5]=crc_value; //// //Radio.Send( TX_Buffer, 6); // Radio.Send( TX_Buffer, 4); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_SET); // printf("Master TXD PING!\r\n"); // HAL_Delay_nMS( 1 ); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_RESET); //printf("Master TXD PING!\r\n"); } else { if(memcmp(RX_Buffer,PingMsg,4)==0) { // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_SET); printf("Slave RXD PING!\r\n"); // HAL_Delay_nMS( 1 ); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_RESET); LedToggle();//LEDÉÁ˸ //printf("Slave RXD PING!\r\n"); T_R_Init(1); TX_Buffer[0] = 'P'; TX_Buffer[1] = 'O'; TX_Buffer[2] = 'N'; TX_Buffer[3] = 'G'; // crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//¼ÆËãµÃ³öÒª·¢ËÍÊý¾Ý°üCRCÖµ // TX_Buffer[4]=crc_value>>8; // TX_Buffer[5]=crc_value; // //Radio.Send( TX_Buffer, 6); Radio.Send( TX_Buffer, 4); printf("Slave TXD PONG!\r\n"); } else { Radio.Rx( RX_TIMEOUT_VALUE ); printf("Slave TXD XXXX\r\n"); } } } void OnTxTimeout( void ) { } void OnRxTimeout( void ) { Radio.Standby(); if(EnableMaster) { TX_Buffer[0] = 'P'; TX_Buffer[1] = 'I'; TX_Buffer[2] = 'N'; TX_Buffer[3] = 'G'; // crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//¼ÆËãµÃ³öÒª·¢ËÍÊý¾Ý°üCRCÖµ // TX_Buffer[4]=crc_value>>8; // TX_Buffer[5]=crc_value; //Radio.Send( TX_Buffer, 6); Radio.Send( TX_Buffer, 4); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_SET); // HAL_Delay_nMS( 1 ); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_RESET); printf("Master TXD PING!\r\n"); } else { Radio.Rx( RX_TIMEOUT_VALUE ); } } void OnRxError( void ) { Radio.Standby(); if(EnableMaster) { TX_Buffer[0] = 'P'; TX_Buffer[1] = 'I'; TX_Buffer[2] = 'N'; TX_Buffer[3] = 'G'; // crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//¼ÆËãµÃ³öÒª·¢ËÍÊý¾Ý°üCRCÖµ // TX_Buffer[4]=crc_value>>8; // TX_Buffer[5]=crc_value; //Radio.Send( TX_Buffer, 6); Radio.Send( TX_Buffer, 4); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_SET); // HAL_Delay_nMS( 1 ); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_RESET); printf("Master TXD PING!\r\n"); } else { Radio.Rx( RX_TIMEOUT_VALUE ); } } void T_R_Init(uint8_t kind) { // Radio.Init( &RadioEvents ); // if(kind==1) //1:Txd config // { // Radio.SetChannel( RF_FREQUENCY ); // Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, // LORA_SPREADING_FACTOR, LORA_CODINGRATE, // LORA_PREAMBLE_LENGTH_T, LORA_FIX_LENGTH_PAYLOAD_ON, // false, 0, 0, LORA_IQ_INVERSION_ON_T, 1000 ); // } // else //0:Rxd config // { // Radio.SetChannel( RF_FREQUENCY ); // Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, // LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH_R, // LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, // 0, false, 0, 0, LORA_IQ_INVERSION_ON_R, false ); // } // //// Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, //// LORA_SPREADING_FACTOR, LORA_CODINGRATE, //// LORA_PREAMBLE_LENGTH_T, LORA_FIX_LENGTH_PAYLOAD_ON, //// false, 0, 0, LORA_IQ_INVERSION_ON_T, 1000 ); //// Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, //// LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH_R, //// LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, //// 0, false, 0, 0, LORA_IQ_INVERSION_ON_R, false ); } void Lora_Init(void) { RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); if(EnableMaster) { Radio.SetChannel( RF_FREQUENCY ); } else { Radio.SetChannel( RF_FREQUENCY ); } #if defined( USE_MODEM_LORA ) // Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, // LORA_SPREADING_FACTOR, LORA_CODINGRATE, // LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, // true, 0, 0, LORA_IQ_INVERSION_ON, 3000 ); Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, LORA_PREAMBLE_LENGTH_T, LORA_FIX_LENGTH_PAYLOAD_ON, false, 0, 0, LORA_IQ_INVERSION_ON_T, 3000 ); // Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, // LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, // LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, // 0, true, 0, 0, LORA_IQ_INVERSION_ON, false ); // Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, // LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH_R, // LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, // 0, false, 0, 0, LORA_IQ_INVERSION_ON_R, false ); // Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, // LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, // LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, // 0, false, 0, 0, LORA_IQ_INVERSION_ON, true ); #elif defined( USE_MODEM_FSK ) Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, FSK_DATARATE, 0, FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, true, 0, 0, 0, 3000 ); Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true, 0, 0,false, false ); #else #error "Please define a frequency band in the compiler options." #endif if(EnableMaster) { printf("I am Master!\r\n"); TX_Buffer[0] = 'P'; TX_Buffer[1] = 'I'; TX_Buffer[2] = 'N'; TX_Buffer[3] = tx_num; crc_value=RadioComputeCRC(TX_Buffer,4,CRC_TYPE_IBM);//¼ÆËãµÃ³öÒª·¢ËÍÊý¾Ý°üCRCÖµ TX_Buffer[4]=crc_value>>8; TX_Buffer[5]=crc_value; //Radio.Send( TX_Buffer, 6); Radio.Send( TX_Buffer, 4); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_SET); // HAL_Delay_nMS( 1 ); // HAL_GPIO_WritePin( OUT1_GPIO_Port, OUT1_Pin,GPIO_PIN_RESET); printf("Master TXD PING!\r\n"); } else { printf("I am Slave!\r\n"); Radio.Rx( RX_TIMEOUT_VALUE ); } }