Source code for the SX126xDVK1xAS Dev Kit. This example code has only been tested on the Nucleo L476RG
Dependencies: mbed DmTftLibrary SX126xLib
Eeprom.cpp
00001 /* 00002 ______ _ 00003 / _____) _ | | 00004 ( (____ _____ ____ _| |_ _____ ____| |__ 00005 \____ \| ___ | (_ _) ___ |/ ___) _ \ 00006 _____) ) ____| | | || |_| ____( (___| | | | 00007 (______/|_____)_|_|_| \__)_____)\____)_| |_| 00008 (C)2016 Semtech 00009 00010 Description: EEPROM routines 00011 00012 Maintainer: Gregory Cristian & Gilbert Menth 00013 */ 00014 00015 #include "mbed.h" 00016 #include "string.h" 00017 #include "Eeprom.h" 00018 #include "Menu.h" 00019 #include "DemoApplication.h" 00020 #include "sx126x.h" 00021 #if defined( TARGET_NUCLEO_L476RG ) 00022 #include "stm32l4xx_hal_flash.h" 00023 #elif defined( TARGET_NUCLEO_L152RE ) 00024 #include "stm32l1xx_hal_flash.h" 00025 #else 00026 #error "Please define include file" 00027 #endif 00028 00029 00030 00031 #include "DisplayDriver.h" 00032 00033 00034 /*! 00035 * \brief Define address of Emulated EEPROM (in fact region of Flash) 00036 */ 00037 #if defined( TARGET_NUCLEO_L476RG ) 00038 #define DATA_EEPROM_BASE ( ( uint32_t )0x0807F800U ) 00039 #define DATA_EEPROM_END ( ( uint32_t )DATA_EEPROM_BASE + 2048 ) 00040 #elif defined( TARGET_NUCLEO_L152RE ) 00041 #define DATA_EEPROM_BASE ( ( uint32_t )0x08080000U ) 00042 #define DATA_EEPROM_END ( ( uint32_t )0x080807FFU ) 00043 #else 00044 #error "Please define EEPROM base address and size for your board " 00045 #endif 00046 00047 00048 /*! 00049 * \brief CRC of EEPROM buffer and its valid status 00050 */ 00051 typedef struct 00052 { 00053 uint16_t Value; 00054 bool Valid; 00055 }MemTestStruct_t; 00056 00057 /*! 00058 * \brief Local copy of Eeprom. 00059 */ 00060 Eeprom_t Eeprom; 00061 00062 00063 // Check CRC of local copy of Eeprom (Buffer). This update Valid & Value 00064 static MemTestStruct_t EepromDataCheckSum( void ); 00065 uint8_t EepromMcuWriteBuffer( uint16_t addr, uint8_t *buffer, uint16_t size ); 00066 00067 void EepromInit( uint8_t deviceConnected, uint8_t matchingFreq ) 00068 { 00069 MemTestStruct_t memTestStruct; 00070 00071 EepromMcuReadBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE ); 00072 EepromLoadGeneralSettings( ); 00073 00074 memTestStruct = EepromDataCheckSum( ); 00075 if( !( memTestStruct.Valid ) || ( Eeprom.EepromData.DemoSettings.LastDeviceConnected != deviceConnected ) ) 00076 { 00077 #ifdef ADV_DEBUG 00078 printf("EepromDataCheckSum failed\n\r"); 00079 #endif 00080 EepromSetDefaultSettings( deviceConnected, matchingFreq ); 00081 } 00082 EepromLoadSettings( ( RadioPacketTypes_t ) Eeprom.EepromData.DemoSettings.ModulationType ); 00083 } 00084 00085 void EepromSaveSettings( EepromDataSet_t dataSet) 00086 { 00087 MemTestStruct_t memTestStruct; 00088 00089 switch( dataSet ) 00090 { 00091 case RADIO_LORA_PARAMS: 00092 Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1; 00093 Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth = ( RadioLoRaBandwidths_t ) Eeprom.EepromData.DemoSettings.ModulationParam2; 00094 Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate = ( RadioLoRaCodingRates_t ) Eeprom.EepromData.DemoSettings.ModulationParam3; 00095 00096 Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength = Eeprom.EepromData.DemoSettings.PacketParam1; 00097 Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsMode_t )Eeprom.EepromData.DemoSettings.PacketParam2; 00098 Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam3; 00099 Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode = ( RadioLoRaCrcModes_t ) Eeprom.EepromData.DemoSettings.PacketParam4; 00100 Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t ) Eeprom.EepromData.DemoSettings.PacketParam5; 00101 00102 memcpy( Eeprom.Buffer + MOD_LORA_SPREADF_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ), 1 ); 00103 memcpy( Eeprom.Buffer + MOD_LORA_BW_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth ), 1 ); 00104 memcpy( Eeprom.Buffer + MOD_LORA_CODERATE_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate ), 1 ); 00105 memcpy( Eeprom.Buffer + PAK_LORA_PREAMBLE_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ), 1 ); 00106 memcpy( Eeprom.Buffer + PAK_LORA_HEADERTYPE_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ), 1 ); 00107 memcpy( Eeprom.Buffer + PAK_LORA_PL_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ), 1 ); 00108 memcpy( Eeprom.Buffer + PAK_LORA_CRC_MODE_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ), 1 ); 00109 memcpy( Eeprom.Buffer + PAK_LORA_IQ_INV_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ), 1 ); 00110 #ifdef ADV_DEBUG 00111 printf("Saved RADIO_LoRa_PARAMS\n\r"); 00112 #endif 00113 break; 00114 00115 case RADIO_GFSK_PARAMS: 00116 Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate = Eeprom.EepromData.DemoSettings.ModulationParam1; 00117 Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev = Eeprom.EepromData.DemoSettings.ModulationParam2; 00118 Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t ) Eeprom.EepromData.DemoSettings.ModulationParam3; 00119 Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth = ( RadioRxBandwidth_t ) Eeprom.EepromData.DemoSettings.ModulationParam4; 00120 Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength = Eeprom.EepromData.DemoSettings.PacketParam1; 00121 Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect = ( RadioPreambleDetection_t )Eeprom.EepromData.DemoSettings.PacketParam2; 00122 Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength = Eeprom.EepromData.DemoSettings.PacketParam3; 00123 Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp = ( RadioAddressComp_t ) Eeprom.EepromData.DemoSettings.PacketParam4; 00124 Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam5; 00125 Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam6; 00126 00127 Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength = ( RadioCrcTypes_t ) Eeprom.EepromData.DemoSettings.PacketParam7; 00128 Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree = ( RadioDcFree_t ) Eeprom.EepromData.DemoSettings.PacketParam8; 00129 00130 memcpy( Eeprom.Buffer + MOD_GFSK_BR_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ), 4 ); 00131 memcpy( Eeprom.Buffer + MOD_GFSK_FDEV_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev ), 4 ); 00132 memcpy( Eeprom.Buffer + MOD_GFSK_MOD_SHAPE_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping ), 1 ); 00133 memcpy( Eeprom.Buffer + MOD_GFSK_BW_EEPROM_ADDR, &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth ), 1 ); 00134 memcpy( Eeprom.Buffer + PAK_GFSK_PREAMBLE_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength ), 1 ); 00135 memcpy( Eeprom.Buffer + PAK_GFSK_PR_MIN_DET_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect ), 1 ); 00136 memcpy( Eeprom.Buffer + PAK_GFSK_SYNC_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength ), 1 ); 00137 memcpy( Eeprom.Buffer + PAK_GFSK_HEADERTYPE_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType ), 1 ); 00138 memcpy( Eeprom.Buffer + PAK_GFSK_PL_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength ), 1 ); 00139 memcpy( Eeprom.Buffer + PAK_GFSK_ADDR_COMP_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp ), 1 ); 00140 memcpy( Eeprom.Buffer + PAK_GFSK_CRC_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength ), 1 ); 00141 memcpy( Eeprom.Buffer + PAK_GFSK_DC_FREE_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree ), 1 ); 00142 00143 #ifdef ADV_DEBUG 00144 printf("Saved RADIO_GFSK_PARAMS\n\r"); 00145 #endif 00146 break; 00147 00148 case DEMO_SETTINGS: 00149 memcpy( Eeprom.Buffer + APP_ENTITY_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.Entity ), 1 ); 00150 memcpy( Eeprom.Buffer + APP_RADIO_BOOSTED_RX_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.BoostedRx ), 1 ); 00151 memcpy( Eeprom.Buffer + APP_FREQ_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.Frequency ), 4 ); 00152 memcpy( Eeprom.Buffer + APP_TXPWR_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.TxPower ), 1 ); 00153 memcpy( Eeprom.Buffer + APP_MOD_TYPE_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.ModulationType ), 1 ); 00154 memcpy( Eeprom.Buffer + APP_PER_NPAK_MAX_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.MaxNumPacket ), 4 ); 00155 memcpy( Eeprom.Buffer + APP_RADIO_POWER_MODE_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.RadioPowerMode ), 1 ); 00156 memcpy( Eeprom.Buffer + MOD_PKET_TYPE_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.ModulationType ), 1 ); 00157 memcpy( Eeprom.Buffer + PAK_PKET_TYPE_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.ModulationType ), 1 ); 00158 memcpy( Eeprom.Buffer + EEPROM_LAST_DEVICE_CONNECTED, &( Eeprom.EepromData.DemoSettings.LastDeviceConnected ), 1 ); 00159 00160 #ifdef ADV_DEBUG 00161 printf("Saved DEMO_SETTINGS\n\r"); 00162 #endif 00163 break; 00164 00165 case SCREEN_DATA: 00166 memcpy( Eeprom.Buffer + SCR_CAL_FLAG_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.ScreenCalibrated ), 1 ); 00167 memcpy( Eeprom.Buffer + SCR_CAL_POSA_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.a ), 4 ); 00168 memcpy( Eeprom.Buffer + SCR_CAL_POSB_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.b ), 4 ); 00169 memcpy( Eeprom.Buffer + SCR_CAL_POSC_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.c ), 4 ); 00170 memcpy( Eeprom.Buffer + SCR_CAL_POSD_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.d ), 4 ); 00171 memcpy( Eeprom.Buffer + SCR_CAL_POSE_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.e ), 4 ); 00172 memcpy( Eeprom.Buffer + SCR_CAL_POSF_EEPROM_ADDR, &( Eeprom.EepromData.MenuSettings.Calibration.f ), 4 ); 00173 break; 00174 00175 default: 00176 #ifdef ADV_DEBUG 00177 printf("data not saved\n\r"); 00178 #endif 00179 break; 00180 } 00181 00182 memTestStruct = EepromDataCheckSum( ); 00183 memcpy( Eeprom.Buffer + EEPROM_CRC_EEPROM_ADDR, &( memTestStruct.Value ), 2 ); 00184 00185 EepromMcuWriteBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE ); 00186 } 00187 00188 void EepromLoadGeneralSettings( void ) 00189 { 00190 printf("Load General Settings\n\r"); 00191 memcpy( &( Eeprom.EepromData.MenuSettings.ScreenCalibrated ), Eeprom.Buffer + SCR_CAL_FLAG_EEPROM_ADDR, 1 ); 00192 memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.a ), Eeprom.Buffer + SCR_CAL_POSA_EEPROM_ADDR, 4 ); 00193 memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.b ), Eeprom.Buffer + SCR_CAL_POSB_EEPROM_ADDR, 4 ); 00194 memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.c ), Eeprom.Buffer + SCR_CAL_POSC_EEPROM_ADDR, 4 ); 00195 memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.d ), Eeprom.Buffer + SCR_CAL_POSD_EEPROM_ADDR, 4 ); 00196 memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.e ), Eeprom.Buffer + SCR_CAL_POSE_EEPROM_ADDR, 4 ); 00197 memcpy( &( Eeprom.EepromData.MenuSettings.Calibration.f ), Eeprom.Buffer + SCR_CAL_POSF_EEPROM_ADDR, 4 ); 00198 00199 memcpy( &( Eeprom.EepromData.DemoSettings.Entity ), Eeprom.Buffer + APP_ENTITY_EEPROM_ADDR, 1 ); 00200 memcpy( &( Eeprom.EepromData.DemoSettings.BoostedRx ), Eeprom.Buffer + APP_RADIO_BOOSTED_RX_EEPROM_ADDR, 1 ); 00201 memcpy( &( Eeprom.EepromData.DemoSettings.Frequency ), Eeprom.Buffer + APP_FREQ_EEPROM_ADDR, 4 ); 00202 memcpy( &( Eeprom.EepromData.DemoSettings.RadioPowerMode ), Eeprom.Buffer + APP_RADIO_POWER_MODE_EEPROM_ADDR, 1 ); 00203 memcpy( &( Eeprom.EepromData.DemoSettings.TxPower ), Eeprom.Buffer + APP_TXPWR_EEPROM_ADDR, 1 ); 00204 memcpy( &( Eeprom.EepromData.DemoSettings.ModulationType ), Eeprom.Buffer + APP_MOD_TYPE_EEPROM_ADDR, 1 ); 00205 memcpy( &( Eeprom.EepromData.DemoSettings.MaxNumPacket ), Eeprom.Buffer + APP_PER_NPAK_MAX_EEPROM_ADDR, 4 ); 00206 memcpy( &( Eeprom.EepromData.DemoSettings.LastDeviceConnected ), Eeprom.Buffer + EEPROM_LAST_DEVICE_CONNECTED, 1 ); 00207 00208 memcpy( &( Eeprom.EepromData.ModulationParams.PacketType ), Eeprom.Buffer + MOD_PKET_TYPE_EEPROM_ADDR, 1 ); 00209 00210 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ), Eeprom.Buffer + MOD_GFSK_BR_EEPROM_ADDR, 4 ); 00211 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev ), Eeprom.Buffer + MOD_GFSK_FDEV_EEPROM_ADDR, 4 ); 00212 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping ), Eeprom.Buffer + MOD_GFSK_MOD_SHAPE_EEPROM_ADDR, 1 ); 00213 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth ), Eeprom.Buffer + MOD_GFSK_BW_EEPROM_ADDR, 1 ); 00214 00215 memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_LORA_SPREADF_EEPROM_ADDR, 1 ); 00216 memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_LORA_BW_EEPROM_ADDR, 1 ); 00217 memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_LORA_CODERATE_EEPROM_ADDR, 1 ); 00218 00219 memcpy( &( Eeprom.EepromData.PacketParams.PacketType ), Eeprom.Buffer + PAK_PKET_TYPE_EEPROM_ADDR, 1 ); 00220 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength ), Eeprom.Buffer + PAK_GFSK_PREAMBLE_LEN_EEPROM_ADDR, 1 ); 00221 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect ), Eeprom.Buffer + PAK_GFSK_PR_MIN_DET_EEPROM_ADDR, 1 ); 00222 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength ), Eeprom.Buffer + PAK_GFSK_SYNC_LEN_EEPROM_ADDR, 1 ); 00223 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType ), Eeprom.Buffer + PAK_GFSK_HEADERTYPE_EEPROM_ADDR, 1 ); 00224 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength ), Eeprom.Buffer + PAK_GFSK_PL_LEN_EEPROM_ADDR, 1 ); 00225 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp ), Eeprom.Buffer + PAK_GFSK_ADDR_COMP_EEPROM_ADDR, 1 ); 00226 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength ), Eeprom.Buffer + PAK_GFSK_CRC_LEN_EEPROM_ADDR, 1 ); 00227 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree ), Eeprom.Buffer + PAK_GFSK_DC_FREE_EEPROM_ADDR, 1 ); 00228 00229 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_LORA_PREAMBLE_LEN_EEPROM_ADDR, 1 ); 00230 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_LORA_HEADERTYPE_EEPROM_ADDR, 1 ); 00231 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ), Eeprom.Buffer + PAK_LORA_PL_LEN_EEPROM_ADDR, 1 ); 00232 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ), Eeprom.Buffer + PAK_LORA_CRC_MODE_EEPROM_ADDR, 1 ); 00233 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_LORA_IQ_INV_EEPROM_ADDR, 1 ); 00234 } 00235 00236 void EepromLoadSettings( RadioPacketTypes_t modulation ) 00237 { 00238 if( modulation == PACKET_TYPE_LORA ) 00239 { 00240 printf("Load Settings PACKET_TYPE_LORA\n\r"); 00241 memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_LORA_SPREADF_EEPROM_ADDR, 1 ); 00242 memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_LORA_BW_EEPROM_ADDR, 1 ); 00243 memcpy( &( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_LORA_CODERATE_EEPROM_ADDR, 1 ); 00244 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_LORA_PREAMBLE_LEN_EEPROM_ADDR, 1 ); 00245 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_LORA_HEADERTYPE_EEPROM_ADDR, 1 ); 00246 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ), Eeprom.Buffer + PAK_LORA_PL_LEN_EEPROM_ADDR, 1 ); 00247 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ), Eeprom.Buffer + PAK_LORA_CRC_MODE_EEPROM_ADDR, 1 ); 00248 memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_LORA_IQ_INV_EEPROM_ADDR, 1 ); 00249 00250 Eeprom.EepromData.ModulationParams.PacketType = PACKET_TYPE_LORA; 00251 Eeprom.EepromData.PacketParams.PacketType = PACKET_TYPE_LORA; 00252 Eeprom.EepromData.DemoSettings.ModulationParam1 = Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor; 00253 Eeprom.EepromData.DemoSettings.ModulationParam2 = Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth; 00254 Eeprom.EepromData.DemoSettings.ModulationParam3 = Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate; 00255 00256 Eeprom.EepromData.DemoSettings.PacketParam1 = Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength; 00257 Eeprom.EepromData.DemoSettings.PacketParam2 = Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType; 00258 Eeprom.EepromData.DemoSettings.PacketParam3 = Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength; 00259 Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode; 00260 Eeprom.EepromData.DemoSettings.PacketParam5 = Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ; 00261 Eeprom.EepromData.DemoSettings.PacketParam6 = 0x00; 00262 Eeprom.EepromData.DemoSettings.PacketParam7 = 0x00; 00263 } 00264 else// if( modulation == PACKET_TYPE_GFSK ) 00265 { 00266 printf("Load Settings PACKET_TYPE_GFSK\n\r"); 00267 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ), Eeprom.Buffer + MOD_GFSK_BR_EEPROM_ADDR, 4 ); 00268 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev ), Eeprom.Buffer + MOD_GFSK_FDEV_EEPROM_ADDR, 4 ); 00269 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping ), Eeprom.Buffer + MOD_GFSK_MOD_SHAPE_EEPROM_ADDR, 1 ); 00270 memcpy( &( Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth ), Eeprom.Buffer + MOD_GFSK_BW_EEPROM_ADDR, 1 ); 00271 00272 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength ), Eeprom.Buffer + PAK_GFSK_PREAMBLE_LEN_EEPROM_ADDR, 1 ); 00273 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect ), Eeprom.Buffer + PAK_GFSK_PR_MIN_DET_EEPROM_ADDR, 1 ); 00274 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength ), Eeprom.Buffer + PAK_GFSK_SYNC_LEN_EEPROM_ADDR, 1 ); 00275 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType ), Eeprom.Buffer + PAK_GFSK_HEADERTYPE_EEPROM_ADDR, 1 ); 00276 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength ), Eeprom.Buffer + PAK_GFSK_PL_LEN_EEPROM_ADDR, 1 ); 00277 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp ), Eeprom.Buffer + PAK_GFSK_ADDR_COMP_EEPROM_ADDR, 1 ); 00278 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength ), Eeprom.Buffer + PAK_GFSK_CRC_LEN_EEPROM_ADDR, 1 ); 00279 memcpy( &( Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree ), Eeprom.Buffer + PAK_GFSK_DC_FREE_EEPROM_ADDR, 1 ); 00280 00281 Eeprom.EepromData.ModulationParams.PacketType = PACKET_TYPE_GFSK; 00282 Eeprom.EepromData.PacketParams.PacketType = PACKET_TYPE_GFSK; 00283 Eeprom.EepromData.DemoSettings.ModulationParam1 = Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate; 00284 Eeprom.EepromData.DemoSettings.ModulationParam2 = Eeprom.EepromData.ModulationParams.Params.Gfsk.Fdev; 00285 Eeprom.EepromData.DemoSettings.ModulationParam3 = Eeprom.EepromData.ModulationParams.Params.Gfsk.ModulationShaping; 00286 Eeprom.EepromData.DemoSettings.ModulationParam4 = Eeprom.EepromData.ModulationParams.Params.Gfsk.Bandwidth; 00287 00288 Eeprom.EepromData.DemoSettings.PacketParam1 = Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength; 00289 Eeprom.EepromData.DemoSettings.PacketParam2 = Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleMinDetect; 00290 Eeprom.EepromData.DemoSettings.PacketParam3 = Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength; 00291 Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.Gfsk.AddrComp; 00292 Eeprom.EepromData.DemoSettings.PacketParam5 = Eeprom.EepromData.PacketParams.Params.Gfsk.HeaderType; 00293 Eeprom.EepromData.DemoSettings.PacketParam6 = Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength; 00294 00295 Eeprom.EepromData.DemoSettings.PacketParam7 = Eeprom.EepromData.PacketParams.Params.Gfsk.CrcLength; 00296 Eeprom.EepromData.DemoSettings.PacketParam8 = Eeprom.EepromData.PacketParams.Params.Gfsk.DcFree; 00297 } 00298 00299 Eeprom.EepromData.DemoSettings.ModulationType = modulation; 00300 } 00301 00302 void EepromSetDefaultSettings( uint8_t deviceConnected, uint8_t matchingFreq ) 00303 { 00304 Eeprom.EepromData.MenuSettings.ScreenCalibrated = false; 00305 00306 printf("Set Default Settings\n\r"); 00307 EepromSaveSettings( SCREEN_DATA ); 00308 00309 Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA; 00310 Eeprom.EepromData.ModulationParams.PacketType = PACKET_TYPE_LORA; 00311 Eeprom.EepromData.PacketParams.PacketType = PACKET_TYPE_LORA; 00312 00313 Eeprom.EepromData.DemoSettings.ModulationParam1 = LORA_SF7; 00314 00315 if( deviceConnected == SX1268 ) 00316 { 00317 if( matchingFreq == MATCHING_FREQ_780 ) 00318 { 00319 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_125; 00320 } 00321 else 00322 { 00323 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_500; 00324 } 00325 } 00326 else 00327 { 00328 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_500; 00329 } 00330 Eeprom.EepromData.DemoSettings.ModulationParam3 = LORA_CR_4_5; 00331 Eeprom.EepromData.DemoSettings.ModulationParam4 = 0x00; 00332 00333 Eeprom.EepromData.DemoSettings.PacketParam1 = 8; // PreambleLength 00334 Eeprom.EepromData.DemoSettings.PacketParam2 = LORA_PACKET_VARIABLE_LENGTH; 00335 Eeprom.EepromData.DemoSettings.PacketParam3 = 16; // PayloadLength 00336 Eeprom.EepromData.DemoSettings.PacketParam4 = LORA_CRC_ON; 00337 Eeprom.EepromData.DemoSettings.PacketParam5 = LORA_IQ_NORMAL; 00338 00339 EepromSaveSettings( RADIO_LORA_PARAMS ); 00340 00341 Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_GFSK; 00342 Eeprom.EepromData.ModulationParams.PacketType = PACKET_TYPE_GFSK; 00343 Eeprom.EepromData.PacketParams.PacketType = PACKET_TYPE_GFSK; 00344 00345 Eeprom.EepromData.DemoSettings.ModulationParam1 = 19200; 00346 Eeprom.EepromData.DemoSettings.ModulationParam2 = 5000; 00347 Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_1; 00348 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_39000; 00349 00350 Eeprom.EepromData.DemoSettings.PacketParam1 = 40; 00351 Eeprom.EepromData.DemoSettings.PacketParam2 = RADIO_PREAMBLE_DETECTOR_08_BITS; 00352 Eeprom.EepromData.DemoSettings.PacketParam3 = 4; 00353 Eeprom.EepromData.DemoSettings.PacketParam4 = RADIO_ADDRESSCOMP_FILT_OFF; 00354 Eeprom.EepromData.DemoSettings.PacketParam5 = RADIO_PACKET_VARIABLE_LENGTH; 00355 Eeprom.EepromData.DemoSettings.PacketParam6 = 16; // PayloadLength 00356 Eeprom.EepromData.DemoSettings.PacketParam7 = RADIO_CRC_2_BYTES_CCIT; 00357 Eeprom.EepromData.DemoSettings.PacketParam8 = RADIO_DC_FREE_OFF; 00358 00359 EepromSaveSettings( RADIO_GFSK_PARAMS ); 00360 00361 Eeprom.EepromData.DemoSettings.Entity = SLAVE; 00362 Eeprom.EepromData.DemoSettings.BoostedRx = true; 00363 if( deviceConnected == SX1261 ) 00364 { 00365 Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected; 00366 Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_DCDC; 00367 Eeprom.EepromData.DemoSettings.TxPower = SX1261_POWER_TX_MAX; 00368 } 00369 else if( deviceConnected == SX1268 ) 00370 { 00371 if( matchingFreq == MATCHING_FREQ_490 ) 00372 { 00373 Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected; 00374 Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_LDO; 00375 Eeprom.EepromData.DemoSettings.TxPower = SX1262_POWER_TX_MAX; 00376 } 00377 else 00378 { 00379 Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected; 00380 Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_DCDC; 00381 Eeprom.EepromData.DemoSettings.TxPower = 10; 00382 } 00383 } 00384 else if( deviceConnected == SX1262 ) 00385 { 00386 Eeprom.EepromData.DemoSettings.LastDeviceConnected = deviceConnected; 00387 Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_LDO; 00388 Eeprom.EepromData.DemoSettings.TxPower = SX1262_POWER_TX_MAX; 00389 } 00390 00391 if( matchingFreq == MATCHING_FREQ_169 ) 00392 { 00393 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET1; 00394 } 00395 else if( matchingFreq == MATCHING_FREQ_280 ) 00396 { 00397 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET2; 00398 } 00399 else if( matchingFreq == MATCHING_FREQ_434 ) 00400 { 00401 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET3; 00402 } 00403 else if( matchingFreq == MATCHING_FREQ_490 ) 00404 { 00405 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET4; 00406 } 00407 else if( matchingFreq == MATCHING_FREQ_780 ) 00408 { 00409 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET5; 00410 } 00411 else if( matchingFreq == MATCHING_FREQ_868 ) 00412 { 00413 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET6; 00414 } 00415 else if( matchingFreq == MATCHING_FREQ_915 ) 00416 { 00417 Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET7; 00418 } 00419 00420 Eeprom.EepromData.DemoSettings.MaxNumPacket = 0x00; 00421 Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA; 00422 00423 EepromSaveSettings( DEMO_SETTINGS ); 00424 } 00425 00426 /*! 00427 * \brief Erase a page of Flash. Here used to Erase EEPROM region. 00428 * 00429 * \param [in] page address of page to erase 00430 * \param [in] banks address of banks to erase 00431 */ 00432 void FlashPageErase( uint32_t page, uint32_t banks ) 00433 { 00434 // Check the parameters 00435 assert_param( IS_FLASH_PAGE( page ) ); 00436 assert_param( IS_FLASH_BANK_EXCLUSIVE( banks ) ); 00437 00438 if( ( banks & FLASH_BANK_1 ) != RESET ) 00439 { 00440 CLEAR_BIT( FLASH->CR, FLASH_CR_BKER ); 00441 } 00442 else 00443 { 00444 SET_BIT( FLASH->CR, FLASH_CR_BKER ); 00445 } 00446 00447 // Proceed to erase the page 00448 MODIFY_REG( FLASH->CR, FLASH_CR_PNB, ( page << 3 ) ); 00449 SET_BIT( FLASH->CR, FLASH_CR_PER ); 00450 SET_BIT( FLASH->CR, FLASH_CR_STRT ); 00451 } 00452 00453 /*! 00454 * \brief Write Eeprom to emulated EEPROM (in fact in Flash " higher address). 00455 * 00456 * \param [in] addr address of data (EEPROM offset not to be include) 00457 * \param [in] buffer buffer to use for copy 00458 * \param [in] size size of data to copy 00459 * 00460 * \retval status Status of operation (SUCCESS, ..) 00461 */ 00462 uint8_t EepromMcuWriteBuffer( uint16_t addr, uint8_t *buffer, uint16_t size ) 00463 { 00464 uint64_t *flash = ( uint64_t* )buffer; 00465 00466 // assert_param( addr >= DATA_EEPROM_BASE ); 00467 assert_param( buffer != NULL ); 00468 assert_param( size < ( DATA_EEPROM_END - DATA_EEPROM_BASE ) ); 00469 00470 HAL_FLASH_Unlock( ); 00471 00472 FlashPageErase( 255, 1 ); 00473 00474 WRITE_REG( FLASH->CR, 0x40000000 ); 00475 00476 for( uint32_t i = 0; i < size; i++ ) 00477 { 00478 HAL_FLASH_Program( FLASH_TYPEPROGRAM_DOUBLEWORD, DATA_EEPROM_BASE + \ 00479 ( 8 * i ), flash[i] ); 00480 } 00481 00482 HAL_FLASH_Lock( ); 00483 00484 return SUCCESS; 00485 } 00486 00487 uint8_t EepromMcuReadBuffer( uint16_t addr, uint8_t *buffer, uint16_t size ) 00488 { 00489 assert_param( buffer != NULL ); 00490 00491 // assert_param( addr >= DATA_EEPROM_BASE ); 00492 assert_param( buffer != NULL ); 00493 assert_param( size < ( DATA_EEPROM_END - DATA_EEPROM_BASE ) ); 00494 00495 memcpy( buffer, ( uint8_t* )DATA_EEPROM_BASE, size ); 00496 return SUCCESS; 00497 } 00498 00499 static MemTestStruct_t EepromDataCheckSum( void ) 00500 { 00501 MemTestStruct_t memTestStruct; 00502 uint8_t x; 00503 uint8_t i; 00504 uint16_t crcBuf; 00505 memTestStruct.Value = 0xFFFF; 00506 00507 for( i = 0; i < EEPROM_BUFFER_SIZE - sizeof( uint16_t ); i++ ) 00508 { 00509 x = memTestStruct.Value >> 8 ^ Eeprom.Buffer[i]; 00510 x ^= x >> 4; 00511 memTestStruct.Value = ( memTestStruct.Value << 8 ) ^ \ 00512 ( ( uint16_t )( x << 12 ) ) ^ \ 00513 ( ( uint16_t )( x << 5 ) ) ^ \ 00514 ( ( uint16_t )x ); 00515 } 00516 memcpy( &crcBuf, Eeprom.Buffer + EEPROM_CRC_EEPROM_ADDR, 2 ); 00517 memTestStruct.Valid = ( crcBuf == memTestStruct.Value ); 00518 00519 return memTestStruct; 00520 } 00521 00522 void EepromEraseCheckSum( void ) 00523 { 00524 memset( Eeprom.Buffer, 0, sizeof( Eeprom.Buffer ) ); 00525 EepromMcuWriteBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE ); 00526 }
Generated on Tue Jul 12 2022 15:49:22 by 1.7.2