#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 #include "dw_mbx_tag.h" 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); void SwitchLoraSettings(uint32_t freq,uint8_t sf,uint8_t power); 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 #define TX_OUTPUT_POWER 22 // 22 dBm extern bool IrqFired; extern uint8_t lora_yingda_flag; uint16_t lora_yingda_num; 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 0 #define BUFFER_SIZE 255 // Define the payload size here 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; uint8_t flag_writepara_needreset = 0; uint32_t wg_lost_count; uint32_t lora_zhuangtai; uint16_t current_count; extern wg_state_enum wg_state; void OnTxDone( void ) { if(flag_writepara_needreset) //ÅäÖÃдÈëÍê³ÉÉ豸ÐèÒªÖØÆô { printf("Íø¹ØÏ·¢ÅäÖÃдÈëÍê³É£¬ÖØÆô"); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } Radio.Standby(); Radio.Rx( 50 ); LED_TB_OFF; } extern LPTIM_HandleTypeDef hlptim1; uint16_t current_time,start_time,end_time; uint8_t power_and_key=0; extern u8 battary,button; u8 lora_seq_nb2; extern uint8_t stationary_flag; extern uint8_t anjian_flag; extern uint8_t lora_tx_flag; extern uint16_t wg_report_id,wg_report_freq; extern uint8_t no_yingdaflag; uint16_t Beepchixutime; uint8_t xiafayuyin_data[200]; uint8_t yuyin_sendflag; uint8_t yuyinzidongguan_time; uint8_t yuyin_no_sleep_flag,no_rx_flag; extern uint8_t usart5_state; extern uint8_t lora_sendbuffer[200]; void LoraSendComMap(uint8_t cmd) { uint8_t data_length = 0x28; uint16_t checksum = 0; lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; lora_sendbuffer[MSG_LENGTH] = data_length+9; memcpy(&lora_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); memcpy(&lora_sendbuffer[DEST_ID_IDX],&wg_report_id,2); lora_sendbuffer[RP_CMD_IDX] = cmd; lora_sendbuffer[RP_INDEX_IDX] = 2; lora_sendbuffer[RP_LEN_IDX] = data_length; memcpy(&lora_sendbuffer[7], &g_com_map[1], data_length); checksum = Checksum_u16(lora_sendbuffer,9+data_length); memcpy(&lora_sendbuffer[9+data_length],&checksum,2); Radio.Send(lora_sendbuffer,data_length+11); // Delay_Ms(100); } void LoraRspWriteCommap(uint8_t index) { uint8_t data_length = 2; uint16_t checksum = 0; lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; lora_sendbuffer[MSG_LENGTH] = data_length+9; memcpy(&lora_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); memcpy(&lora_sendbuffer[DEST_ID_IDX],&wg_report_id,2); lora_sendbuffer[RP_CMD_IDX] = WGRSP_RWTAG_WRITE; lora_sendbuffer[RP_INDEX_IDX] = index; lora_sendbuffer[RP_LEN_IDX] = data_length; memcpy(&lora_sendbuffer[7], &g_com_map[index/2], data_length); checksum = Checksum_u16(lora_sendbuffer,9+data_length); memcpy(&lora_sendbuffer[9+data_length],&checksum,2); Radio.Send(lora_sendbuffer,data_length+11); // Delay_Ms(100); } static uint16_t delaytime = 1050; static uint16_t source_id; uint8_t rec_index; uint16_t rec_value,rec_delaytime,rx_count; int16_t target_count; 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(); no_rx_flag = 0; if(RX_Buffer[MSG_TYPE_IDX]==LORA_MSGTYPE_RANGEPOLL) { UWB_Wkup(); MbxTagUwbRec(); HAL_GPIO_WritePin(RADIO_NSS_GPIO_Port, RADIO_NSS_Pin, GPIO_PIN_RESET); //ƬѡloraÓÐЧ } if(RX_Buffer[MSG_TYPE_IDX]==LORA_MSGTYPE_WGRESPTAG) { if(!memcmp(&dev_id,&RX_Buffer[DEST_ID_IDX],2)) { memcpy(&source_id,&RX_Buffer[SOURCE_ID_IDX],2); if(wg_state==WG_Lost) { wg_state = WG_Connected; wg_report_id = source_id; } if(!memcmp(&wg_report_id,&RX_Buffer[SOURCE_ID_IDX],2)) { wg_lost_count = 0; switch(RX_Buffer[PWTAG_RW_FLAG_IDX]) { case WGRSP_RWTAG_NONE: current_count = HAL_LPTIM_ReadCounter(&hlptim1); wg_report_freq = RX_Buffer[POLL_FREQ_IDX]+400; memcpy(&rec_delaytime,&RX_Buffer[NEXTPOLL_TIME_IDX],2); target_count = current_count + rec_delaytime*3.2768 - delaytime; if(target_count>=32768) target_count-=32768; __HAL_LPTIM_COMPARE_SET(&hlptim1, target_count); rx_count = HAL_LPTIM_ReadCounter(&hlptim1); // printf("tx %d,rx %d,delay %d",current_count>>5,rx_count>>5,rec_delaytime); break; case WGRSP_RWTAG_READ: no_rx_flag = 1; LoraSendComMap(WGRSP_RWTAG_READ); break; case WGRSP_RWTAG_WRITE: rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX]; if(rec_index==0xDD) { // if(usart5_state==1) // { // Usart5Init(); // usart5_state=0; // } // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET); // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // memcpy(&xiafayuyin_data,&RX_Buffer[9],RX_Buffer[8]); // yuyin_sendflag=1; // yuyinzidongguan_time=0; // yuyin_no_sleep_flag=1; }else{ memcpy(&rec_value,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); g_com_map[rec_index/2] = rec_value; save_com_map_to_flash(); LoraRspWriteCommap(SUBMSG_WRITE_ANCPARA); flag_writepara_needreset = 1; no_rx_flag = 1; } break; } } } } if(!no_rx_flag) { SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); Radio.Rx(0); } } void OnTxTimeout( void ) { Radio.Standby(); SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); } uint8_t tm; uint16_t Lora_rece_error; void OnRxTimeout( void ) { Radio.Standby(); current_count = HAL_LPTIM_ReadCounter(&hlptim1); target_count-=current_count%3276; if(target_count<0) target_count+=32768; __HAL_LPTIM_COMPARE_SET(&hlptim1, target_count); SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); Radio.Rx(0); } void OnRxError( void ) { Radio.Standby(); SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); } uint16_t freq_test; void SwitchLoraSettings(uint32_t freq,uint8_t sf,uint8_t power) { // RadioEvents.TxDone = OnTxDone; // RadioEvents.RxDone = OnRxDone; // RadioEvents.TxTimeout = OnTxTimeout; // RadioEvents.RxTimeout = OnRxTimeout; // RadioEvents.RxError = OnRxError; //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); // Radio.Init( &RadioEvents ); Radio.Standby(); // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); Radio.SetChannel( freq*1000000 ); freq_test = freq; Radio.SetTxConfig( MODEM_LORA, power, 0, 2, sf, 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, sf,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 LoraInit(void) { RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],5,0); //Çл»lora½ÓÊÕÆµµã Radio.Rx( 0 ); // Radio.SetRxDutyCycle(RxDutyCycle_RX_time,RxDutyCycle_SLEEP_time); }