#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" #include "Flash.h" static RadioEvents_t RadioEvents; #define USE_MODEM_LORA //#define USE_MODEM_FSK #define REGION_CN779 void LoraUp_Poll(); 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 uint16_t rec_wenjian_daxiao; uint16_t wangguan_up_id; extern bool IrqFired; extern uint8_t lora_yingda_flag; uint16_t lora_yingda_num; uint16_t crc_value; /** * @brief Update CRC16 for input byte * @param CRC input value * @param input byte * @retval Updated CRC value */ uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte) { uint32_t crc = crcIn; uint32_t in = byte|0x100; do { crc <<= 1; in <<= 1; if(in&0x100) { ++crc; } if(crc&0x10000) { crc ^= 0x1021; } } while(!(in&0x10000)); return (crc&0xffffu); } /** * @brief Cal CRC16 for YModem Packet * @param data * @param length * @retval CRC value */ uint16_t Cal_CRC16(const uint8_t* data, uint32_t size) { uint32_t crc = 0; const uint8_t* dataEnd = data+size; while(data> 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 huifushengjibao_flag; uint8_t LoraUp_flag; uint8_t lora_up_rec_flag; uint8_t flag_writepara_needreset = 0; uint32_t wg_lost_count = 10; 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(); if(LoraUp_flag) { huifushengjibao_flag=1; Radio.Rx( 500 ); } else { 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 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 = 0x50; uint16_t checksum = 0; lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; lora_sendbuffer[MSG_LENGTH] = data_length+11; 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[9], &g_com_map[1], data_length); checksum = Checksum_u16(lora_sendbuffer,11+data_length); memcpy(&lora_sendbuffer[11+data_length],&checksum,2); Radio.Send(lora_sendbuffer,data_length+13); // 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); } extern uint8_t lora_busy_flag; extern uint8_t imu_enable,motor_enable; extern u8 lora_jianting_flag,report_ancnum; static uint16_t delaytime = 771; static uint16_t source_id; uint8_t rec_index,rec_secdelay; uint16_t rec_value,rec_delaytime,rx_count,datalen_offset; int32_t target_count; extern uint16_t motor_keeptime; uint8_t shengji_flag; void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) { uint16_t checksum1; BufferSize = size; memcpy( RX_Buffer, payload, BufferSize ); RssiValue = rssi; SnrValue = snr; Radio.Standby(); no_rx_flag = 0; lora_up_rec_flag=1; // 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) { checksum1=Checksum_u16(RX_Buffer,BufferSize-2); if(!memcmp(&checksum1,&RX_Buffer[BufferSize-2],2)) 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; // HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); 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); if(report_ancnum<2) { datalen_offset = report_ancnum*85; }else{ datalen_offset = (report_ancnum-1)*46+85; } rec_secdelay = RX_Buffer[PWTAG_SECDELAY_IDX]; if(BufferSize!=13||rec_secdelay>20) { rec_secdelay = 0; } target_count = current_count + rec_delaytime*3.2768 - delaytime-datalen_offset; while(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]; switch(rec_index) { case 0xdd: //ÓïÒôÏ·¢ break; case 0x20: //·äÃù memcpy(&rec_value,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); motor_keeptime = rec_value; break; default : 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; case WGRSP_RWTAG_UPDATE: rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX]; switch(rec_index) { case 0xaa: //Éý¼¶Ï·¢ memcpy(&rec_wenjian_daxiao,&RX_Buffer[WRITEPARA_VALUE_IDX],2);//Îļþ´óС if(rec_wenjian_daxiao>0XAC00||rec_wenjian_daxiao==0) {}//Îļþ¹ý´ó£¬³¬³ö·¶Î§ else { memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//Íø¹ØID Õ¼ÓÃ2¸ö×Ö½Ú shengji_flag=1; LoraUp_flag=1; imu_enable=0; } // LoraUp_Poll(); break; } break; } } lora_busy_flag=0; } } // if(!no_rx_flag) // { // if(lora_jianting_flag&&LoraUp_flag==0) // { // SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); // Radio.Rx(0); // } // } } void OnTxTimeout( void ) { Radio.Standby(); // if(lora_jianting_flag) // SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); lora_busy_flag=0; } uint8_t tm; uint16_t Lora_rece_error; void OnRxTimeout( void ) { Radio.Standby(); if(wg_state==WG_Lost) { current_count = HAL_LPTIM_ReadCounter(&hlptim1); target_count-=current_count%3276; while(target_count<0) target_count+=32768; __HAL_LPTIM_COMPARE_SET(&hlptim1, target_count); } // HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); if(lora_jianting_flag) { // SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); // Radio.Rx(0); } lora_busy_flag=0; } void OnRxError( void ) { Radio.Standby(); lora_busy_flag=0; // if(lora_jianting_flag) // 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 ); } extern u8 active_flag; void LoraInit(void) { RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); SwitchLoraSettings(REPORT_MANGE_CHANNEL_FRQ,7,22); //Çл»lora½ÓÊÕÆµµã // if(active_flag) // { // Radio.Rx( 0 ); // }else{ // Radio.Sleep(); // } // Radio.SetRxDutyCycle(RxDutyCycle_RX_time,RxDutyCycle_SLEEP_time); } uint8_t send_lora_data[250]; //extern uint8_t lora_recbuffer[255]; uint8_t muqiandeshengjibao; static uint16_t current_count1,target_count1,end_count1,start_count1; uint8_t huifushengjibaoerror_num; uint8_t final_bag_num; uint16_t testflag; uint32_t Zhongjian_data[60]; uint16_t app1_or_app2; extern IWDG_HandleTypeDef hiwdg; void LoraUp_Poll() { uint16_t result ; uint16_t crc16; if(shengji_flag) { // memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//Íø¹ØID Õ¼ÓÃ2¸ö×Ö½Ú send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATE_CONFIRM; memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//Íø¹ØID Õ¼ÓÃ2¸ö×Ö½Ú memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//±êÇ©»òÕß»ùÕ¾µÄÉ豸ID 2¸ö×Ö½Ú // send_lora_data[MUQIAN_BAG]=0xFF; crc16=Checksum_u16(send_lora_data,6); memcpy(&send_lora_data[6],&crc16,2); huifushengjibao_flag=0; LoraUp_flag=1; Radio.Send(send_lora_data,8);//»ùÕ¾·¢ËÍÉý¼¶È·Èϻظ´ Delay_Ms(1000); SwitchLoraSettings(LORA_UPCHANNEL_FRQ,LORA_UPCHANNEL_SF,22); //Çл»loraÉý¼¶Æµµã delay_ms(200); __disable_irq(); // FLASH_Read(APP_1OR2_ADRESS,(uint8_t*)&app1_or_app2,2); final_bag_num=(rec_wenjian_daxiao/220)+1;//¼ÆËãÒ»¹²ÒªÇëÇó¶àÉÙ°ü while(1) { FLASH_Prepare(APP2_ADRESS, APP_SIZE); delay_ms(500); if(testflag==0) {break;} } // FLASH_Write(APP2_ADRESS, (const uint8_t*)&tmp111, 2); __enable_irq(); while(1) { if(huifushengjibao_flag==1) {lora_up_rec_flag=1; while(1) { send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATEFILE_REQUEST; memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//Íø¹ØID Õ¼ÓÃ2¸ö×Ö½Ú memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//±êÇ©»òÕß»ùÕ¾µÄÉ豸ID 2¸ö×Ö½Ú send_lora_data[MUQIAN_BAG]=muqiandeshengjibao; crc16=Checksum_u16(send_lora_data,7); memcpy(&send_lora_data[7],&crc16,2); lora_up_rec_flag=0; Radio.Send(send_lora_data,9);//»ùÕ¾·¢ËÍÇëÇóµÚx°ü start_count1=HAL_LPTIM_ReadCounter(&hlptim1); //µÈ´ý½ÓÊÕÍê³ÉÖ±µ½³¬Ê± end_count1=start_count1+32768/2;//500msµÈ´ý if(end_count1>=32768) {end_count1-=32768;} current_count1=HAL_LPTIM_ReadCounter(&hlptim1); while(!lora_up_rec_flag) { current_count1=HAL_LPTIM_ReadCounter(&hlptim1); if(current_count1>=end_count1&¤t_count1=20) { huifushengjibaoerror_num=0; muqiandeshengjibao=0; Delay_Ms(500); HAL_NVIC_SystemReset(); break; } } if(muqiandeshengjibao==final_bag_num) { uint16_t tmp11 ,result11; tmp11=0XBB; result11 = FLASH_Prepare(APP_1OR2_ADRESS, PAGE_SIZE); if(result11) result11 = FLASH_Write(APP_1OR2_ADRESS, (const uint8_t*)&tmp11, 2); Delay_Ms(1500); HAL_NVIC_SystemReset(); } } } else { Delay_Ms(500); // huifushengjibao_flag=0; Radio.Send(send_lora_data,8);//»ùÕ¾·¢ËÍÉý¼¶È·Èϻظ´ huifushengjibaoerror_num++; if(huifushengjibaoerror_num>=5) { huifushengjibaoerror_num=0; Delay_Ms(500); HAL_NVIC_SystemReset(); break; } } } } }