#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" #include "main.h" #include static RadioEvents_t RadioEvents; #define USE_MODEM_LORA //#define USE_MODEM_FSK #define REGION_CN779 void Lora47xrx_Init(void); void Lora433_change(void); void Lora433rx_Init(void); uint32_t RxDutyCycle_RX_time =128; uint32_t RxDutyCycle_SLEEP_time=256; #define LORA_FREQUENCY0 470200000 #define LORA_FREQUENCY1 471200000 #define LORA_FREQUENCY2 472200000 #define LORA_FREQUENCY3 473200000 #define LORA_FREQUENCY4 474200000 uint16_t Lora_rece_error; #define LORA_RX_433 1 #define LORA_TX_47X 2 #define LORA_RX_47X 3 uint8_t Lora_status=0; #define RF_FREQUENCY 433000000 // Hz #define RF_FREQUENCY_R 500000000 // Hz #define RF_FREQUENCY_T 470200000 // Hz void LoraSendComMap(uint8_t data_length, uint8_t index); #define TX_OUTPUT_POWER 22 // 22 dBm extern bool IrqFired; extern uint8_t lora_yingda_flag; uint16_t lora_yingda_num; //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 8 // Same for Tx #define LORA_PREAMBLE_LENGTH_R 8 // 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 false #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 RX_TIMEOUT_VALUE 100 #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 ); uint8_t lora_chongfuyingda_flag; uint8_t Lora_rx_open_flag; extern u32 Loratx_frequency; void LedToggle(void) { // HAL_GPIO_TogglePin(GPIOB, LED1_Pin); } //void Lora_tx_mode( void ) //{ //Lora_status=LORA_TX_47X; // RadioEvents.TxDone = OnTxDone; // RadioEvents.RxDone = OnRxDone; // RadioEvents.TxTimeout = OnTxTimeout; // RadioEvents.RxTimeout = OnRxTimeout; // RadioEvents.RxError = OnRxError; // Radio.Init( &RadioEvents ); // Radio.SetChannel( Loratx_frequency ); // // Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, 2, // 7, LORA_CODINGRATE,LORA_PREAMBLE_LENGTH_T, LORA_FIX_LENGTH_PAYLOAD_ON, // false, 0, 0, LORA_IQ_INVERSION_ON_T, 3000 ); //} //void Lora_rx_open( void ) //{ // if(Lora_rx_open_flag==1) // { // Lora_Init(); // Lora_rx_open_flag=0; // } // if(lora_yingda_flag&&lora_chongfuyingda_flag==0) // { // printf("Lora:%d %d\r\n",lora_yingda_flag,lora_chongfuyingda_flag); // lora_chongfuyingda_flag=1; // RadioEvents.TxDone = OnTxDone; // RadioEvents.RxDone = OnRxDone; // RadioEvents.TxTimeout = OnTxTimeout; // RadioEvents.RxTimeout = OnRxTimeout; // RadioEvents.RxError = OnRxError; // Radio.Init( &RadioEvents ); // Radio.SetChannel( 500000000 ); // Radio.SetRxConfig( MODEM_LORA, 0, 7, // LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH_R, // LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, // 0, false, 0, 0, true, 1 ); // SX126xClearIrqStatus( IRQ_RADIO_ALL ); //// Radio.SetRxDutyCycle(RxDutyCycle_RX_time,RxDutyCycle_SLEEP_time); // Radio.Rx( RX_TIMEOUT_VALUE ); // // } //} uint32_t lora_zhuangtai; void OnTxDone( void ) { if(bat_percent>20) {LED_TR_OFF;} else {LED_TB_OFF;} Radio.Standby(); Radio.Rx( RX_TIMEOUT_VALUE ); } extern uint32_t lp_time; uint32_t lora_txtime_old; extern uint8_t frame_seq_nb2,rec_nearbase_num,ancidlist_num; uint16_t RX_TIMEOUTs; extern LPTIM_HandleTypeDef hlptim1; uint16_t current_time,start_time,end_time; uint16_t lora_recv_devid=0; u32 id; extern uint8_t Lora_tx_ancnum; extern uint16_t Lora_tx_ancid[50]; extern uint16_t Lora_tx_ancdist[50]; uint8_t power_and_key=0; extern u8 battary,button; u8 lora_seq_nb2; extern uint8_t stationary_flag; extern uint8_t anjian_flag; uint16_t Lora_wangguanid=0; void Lora_tx_zubao( void ) { uint16_t checksum; usart_send[2] = 0x22;//Õý³£Ä£Ê½ usart_send[3] = 11+Lora_tx_ancnum*4;//Êý¾Ý¶Î³¤¶È memcpy(&usart_send[4],&dev_id,2); usart_send[6] = lora_seq_nb2;//°üÐò power_and_key=stationary_flag<<1;//°Ñ°´¼ü¸ú¾²Ö¹2ºÏ1£¬·¢³öÈ¥ power_and_key=power_and_key+anjian_flag;; memcpy(usart_send+7,&bat_percent,1); memcpy(usart_send+8,&power_and_key,1); usart_send[9] = lora_yingda_flag;//loraµÈ´ýÓ¦´ðλ usart_send[10] = Lora_tx_ancnum; // usart_send[9] = lora_yingda_flag; memcpy(&usart_send[11],&Lora_tx_ancid,2*Lora_tx_ancnum); memcpy(&usart_send[11+Lora_tx_ancnum*2],&Lora_tx_ancdist,2*Lora_tx_ancnum); memcpy(&usart_send[11+Lora_tx_ancnum*4],&Lora_wangguanid,2); checksum = Checksum_u16(&usart_send[2],11+4*Lora_tx_ancnum); memcpy(&usart_send[13+4*Lora_tx_ancnum],&checksum,2); } extern uint8_t lora_tx_flag; uint16_t current_count; u16 Lora_recevcount; extern uint16_t no_data_chongqi_num; uint8_t du_flag; uint8_t xie_flag; extern uint8_t no_yingdaflag; uint16_t Beepchixutime; 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(); printf("ÊÕµ½lora\r\n"); // if(Lora_status==LORA_RX_433) if(RX_Buffer[0]==0x50&&RX_Buffer[1]==0x49) { Lora_recevcount=HAL_LPTIM_ReadCounter(&hlptim1); Lora_recevcount=Lora_recevcount+197;//197´ú±í6ms if(Lora_recevcount>=32768) { Lora_recevcount -=32768; } // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); // BufferSize = size; // memcpy( RX_Buffer, payload, BufferSize ); // RssiValue = rssi; // SnrValue = snr; // no_data_chongqi_num=0; // Radio.Standby(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); HAL_GPIO_WritePin(RADIO_NSS_GPIO_Port, RADIO_NSS_Pin, GPIO_PIN_SET); //ƬѡloraÎÞЧ id = dwt_readdevid() ; while (0xDECA0130!=id) { u8 iderror_count = 0; id = dwt_readdevid() ; if(iderror_count++>100) { //////// printf("UWBоƬID´íÎó"); break; } } //////// printf("Anchor_App\r\n"); current_count=HAL_LPTIM_ReadCounter(&hlptim1); while(current_countLora_recevcount+16384) { current_count=HAL_LPTIM_ReadCounter(&hlptim1); if(current_count>1); } } if(RX_Buffer[6]==1)//д²Ù×÷ { Lora_rece_error=0; // uint16_t rxbuff1; // xie_flag=1; // memcpy(&rxbuff1, &RX_Buffer[9], 2); // memcpy((uint8_t*)&g_com_map + RX_Buffer[7], &rxbuff1, RX_Buffer[8]); // no_yingda_time=5; if(no_yingdaflag==0) { if(RX_Buffer[7]==0x10) { Beep_On(); memcpy(&Beepchixutime, &RX_Buffer[9], 2); } else { memcpy((uint8_t*)&g_com_map + RX_Buffer[7], &RX_Buffer[9], RX_Buffer[8]); save_com_map_to_flash(); delay_ms(100); NVIC_SystemReset(); } } } } Lora433_change(); } } void OnTxTimeout( void ) { Radio.Standby(); Lora433_change(); } uint8_t tm; uint16_t Lora_rece_error; void OnRxTimeout( void ) { Radio.Standby(); if(Lora_status==LORA_RX_47X) //470rx³¬Ê±£¬Ïȵ÷ʱ¼ä·¢ËÍ£¬5´Îºó»¹²»ÐУ¬»»Æµ¶Î { Lora_rece_error++; if(Lora_rece_error>5) { Loratx_frequency=Loratx_frequency+1000000; if(Loratx_frequency>474000000) {Loratx_frequency=470000000;} Lora_rece_error=0; Lora_wangguanid=0; } else { tm= (rand()%100); SetNextPollTime(tm); HAL_LPTIM_TimeOut_Start_IT(&hlptim1, LPTIMER_1S_COUNT, tm); } } Lora433_change(); } void OnRxError( void ) { Radio.Standby(); Lora433_change(); } void Lora47X_Init(void) { Lora_status=LORA_RX_47X; RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); Radio.SetChannel( Loratx_frequency ); Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, 2, 7, 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, 7, LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH_R, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, false, 0, 0, LORA_IQ_INVERSION_ON_R, 0 ); } void Lora433_change(void) { Lora_status=LORA_RX_433; // Radio.SetChannel( RF_FREQUENCY ); // SX126x.ModulationParams.Params.LoRa.SpreadingFactor=5; // SX126x.ModulationParams.Params.LoRa.Bandwidth=2; // SX126x.ModulationParams.Params.LoRa.CodingRate=1; // SX126xSetModulationParams( &SX126x.ModulationParams ); // Radio.SetRxDutyCycle(RxDutyCycle_RX_time,RxDutyCycle_SLEEP_time); // // Lora_status=LORA_RX_47X; RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); Radio.SetChannel( RF_FREQUENCY ); Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, 2, 5, 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_R, LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, false, 0, 0, LORA_IQ_INVERSION_ON_R, 1 ); Radio.Rx( 9999 ); // Radio.SetRxDutyCycle(RxDutyCycle_RX_time,RxDutyCycle_SLEEP_time); }