#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 "dw_mbx_anc.h" #include "Flash.h" #include "dw_mbx_anc.h" #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; /** * @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; static uint8_t flag_lora_wait_sync = 0; #define RX_TIMEOUT_VALUE 9999 #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); } uint8_t huifushengjibao_flag; uint8_t LoraUp_flag; extern uint8_t flag_writepara_needreset; void OnTxDone( void ) { // T_R_Init(0); Radio.Standby(); // Radio.Rx( RX_TIMEOUT_VALUE ); //½øÈë½ÓÊÕ if(flag_writepara_needreset) //ÅäÖÃдÈëÍê³ÉÉ豸ÐèÒªÖØÆô { printf("Íø¹ØÏ·¢ÅäÖÃдÈëÍê³É£¬ÖØÆô"); SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //Èí¸´Î»»Øµ½bootloader } if(LoraUp_flag) { huifushengjibao_flag=1; Radio.Rx( 500 ); } else { Radio.Sleep( );} //printf("TX SUCCESS2\r\n"); } static uint8_t rxbuffer[255],rxbuff_len; static uint16_t rec_lp_count; uint8_t GetLoraBufferAndLen(uint8_t* buffer,uint16_t* lp_count) { memcpy(buffer,rxbuffer,rxbuff_len); memcpy(lp_count,&rec_lp_count,2); return rxbuff_len; } uint16_t GetLoraSyncCount(void) { return rec_lp_count; } uint8_t lora_up_rec_flag; extern uint16_t tx_num; void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) { rec_lp_count = HAL_LPTIM_ReadCounter(&hlptim1); rxbuff_len = size; memcpy( rxbuffer, payload, size ); RssiValue = rssi; SnrValue = snr; Radio.Standby(); lora_up_rec_flag=1; flag_lora_wait_sync = 0; SetFlagSyncSuccess(1); Radio.Rx( RX_TIMEOUT_VALUE ); // if(LoraUp_flag) // { // // } } void OnTxTimeout( void ) { } void OnRxTimeout( void ) { Radio.Standby(); flag_lora_wait_sync = 0; } void OnRxError( void ) { flag_lora_wait_sync = 0; Radio.Standby(); } void Lora_Init(void) { RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); Radio.Standby(); Radio.Sleep(); // Radio.SetChannel( UWB_CHANNEL_FRQ ); // Radio.SetTxConfig( MODEM_LORA, 22, 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 ); } void Lora470_Init(void) { RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; RadioEvents.TxTimeout = OnTxTimeout; RadioEvents.RxTimeout = OnRxTimeout; RadioEvents.RxError = OnRxError; Radio.Init( &RadioEvents ); Radio.SetChannel( 470000000 ); Radio.SetTxConfig( MODEM_LORA, 22, 0, LORA_BANDWIDTH, 7, LORA_CODINGRATE, 10, LORA_FIX_LENGTH_PAYLOAD_ON, false, 0, 0, LORA_IQ_INVERSION_ON_T, 3000 ); // 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; } void SetFlagLoraWaitSync(uint8_t value) { flag_lora_wait_sync = value; } uint8_t GetFlagLoraWaitSync(void) { return flag_lora_wait_sync; } 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 ); 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 ); } uint16_t rec_wenjian_daxiao; uint16_t wangguan_up_id; 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; memcpy(&rec_wenjian_daxiao,&rxbuffer[WRITEPARA_VALUE_IDX],2);//Îļþ´óС // rec_wenjian_daxiao=rxbuffer[WRITEPATE_VALUE_IDX]; if(rec_wenjian_daxiao>0XAC00) {}//Îļþ¹ý´ó£¬³¬³ö·¶Î§ else { memcpy(&wangguan_up_id,&rxbuffer[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; break; } } } } }