source: trunk/fw_g473rct/SES/src/eeprom.c@ 27

Last change on this file since 27 was 27, checked in by f.jahn, 3 months ago

Fixing project before CubeMX regeneration.

File size: 43.7 KB
Line 
1//https://controllerstech.com/eeprom-and-stm32/
2
3#include "eeprom.h"
4#include "stdio.h"
5#include "modbus.h"
6
7#define CONCAT(a, b) CONCAT_INNER(a, b) // These three macros
8#define CONCAT_INNER(a, b) a ## b // generate unique variables
9#define UNIQUE_NAME(base) CONCAT(base, __COUNTER__) // according to template "baseX", like "base1", "base2" and etc
10
11// Define the I2C
12extern I2C_HandleTypeDef hi2c3;
13#define EEPROM_I2C &hi2c3
14
15// EEPROM ADDRESS (8bits)
16#define EEPROM_ADDR 0xA0
17
18// Define the Page Size and number of pages
19#define PAGE_SIZE 64 // in Bytes
20#define PAGE_NUM 4096 // number of pages
21
22
23#define PADDRPOSITION 6 //MUST BE calculated for every eeprom type --//int paddrposition = log(PAGE_SIZE)/log(2);
24
25/********************************************************/
26
27// Eeprom state related defines
28
29/*****************EEPROM_EMULATOR************************/
30
31typedef struct
32{
33 // Schnittstellenparameter
34 uint32_t baudrate;
35 uint16_t parityMode;
36 uint16_t stopBits;
37 uint16_t slave_adress;
38 uint16_t ibn_day;
39 uint16_t ibn_month;
40 uint16_t ibn_year;
41 uint16_t user_id;
42
43 // Offset und Gain
44 int16_t batteryCurrentOffsetRefTemperatureShunt;
45 int16_t batteryCurrentOffsetRefTemperatureChip;
46 int16_t batteryCurrentGainRefTempShunt;
47 int16_t batteryCurrentGainRefTempChip;
48 int16_t batteryCurrentOffsetTemperatureCalibrationTemperature;
49 int16_t batteryCurrentGainTemperatureCalibrationShuntTemperature;
50 int16_t batteryCurrentGainTemperatureCalibrationChipTemperature;
51 int32_t batteryCurrentOffsetRefshuntVoltage;
52 int32_t batteryCurrentOffsetCommonModeCalibrationVoltage;
53 int32_t batteryCurrentOffsetCommonModeCompensationFactor;
54 int32_t batteryCurrentOffsetTemperatureCompensationFactor;
55 int32_t batteryCurrentGainRefCurrent;
56 int32_t batteryCurrentGainTemperatureCompensationShuntFactor;
57 int32_t batteryCurrentGainTemperatureCompensationChipFactor;
58
59 int32_t currentOffset;
60 uint32_t currentGain;
61
62 int32_t currentOffsetFast;
63 uint32_t currentGainFast;
64
65 int64_t mAsCounter;
66 int32_t detectedCapacity;
67 int32_t detectedEnergy;
68 int64_t mAs_AutoMode; // 160-163 Helps to restore current SoC after Reset or Shutdown
69 int64_t mWs_AutoMode; // 164-167 Helps to restore current SoC after Reset or Shutdown
70
71 // battery parameter
72 uint16_t cef;
73 uint16_t peukert;
74 uint32_t cellCapacity;
75 uint32_t cellEnergy;
76 uint16_t iBatFull;
77 uint16_t tBatFull;
78 uint16_t uBatFull;
79 uint16_t uBatEmpty;
80 uint16_t socCalcMode;
81 uint16_t cellRatedDischargeTime;
82
83 // Schaltausgänge
84 uint16_t lvpStart; // Spannung ab der die LOW Voltage Protection aktiv wird in mV
85 uint16_t lvpStop; // Spannung ab der die LOW Voltage Protection wieder inaktiv wird
86 uint16_t ovpStart; // Spannung ab der die OVER Voltage Protection aktiv wird in mV
87 uint16_t ovpStop; // Spannung ab der die OVER Voltage Protection wieder inaktiv wird
88 int16_t loadCurrentLimit; // maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
89 int16_t chargeCurrentLimit; // maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
90 int16_t chargeStopHighTemperatureStart; // Abschalttemperatur Ladung wegen zu hoher Temperatur
91 int16_t chargeStopHighTemperatureStop; // Wiedereinschalttemperatur
92 int16_t chargeStopLowTemperatureStart; // Abschalttemperatur Ladung wegen zu niedriger Temperatur
93 int16_t chargeStopLowTemperatureStop; // Wiedereinschalttemperatur
94 int16_t dischargeStopHighTemperatureStart; // Abschalttemperatur Entladung wegen zu hoher Temperatur
95 int16_t dischargeStopHighTemperatureStop; // Wiedereinschalttemperatur
96 int16_t dischargeStopLowTemperatureStart; // Abschalttemperatur EntLadung wegen zu niedriger Temperatur
97 int16_t dischargeStopLowTemperatureStop; // Wiedereinschalttemperatur
98
99 int16_t uBatEmptyCompStartTemp; // We start calculating uBatEmpty compensations only when cell temperature is lower than this value
100 int16_t uBatEmptyCompStopTemp; // We stop calculating uBatEmpty compensations when cell temperature is lower than this value
101 uint16_t uBatEmptyCompStopVolt; // uBatEmpty Voltage at temperatures lower than lvpCompStopTemp
102 int16_t extraDischargeStrom_mA; // For example, current that consumes LiPro itself
103 uint16_t cefW;
104 int16_t batteryEmptyDetectionMode;
105
106} eeprom_data_t;
107
108
109
110// Substitute for #if sizeof(some_type) == sizeof(another_type) functionality
111#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
112
113typedef struct
114{
115 // Geräteinformation
116 uint32_t SN;
117 uint8_t deviceInfoWritten;
118 uint8_t UNIQUE_NAME(reserved)[3];
119}device_info_t;
120
121typedef struct
122{
123 // Eeprom Status Infos
124 uint8_t firstStartId;
125 uint8_t UNIQUE_NAME(reserved)[3];
126 uint16_t structureSize;
127 uint16_t revisionInfo;
128 uint32_t writeCounter;
129}eeprom_state_t;
130
131// fasse zu einer Struktur zusammen um nachher einfach darauf zugreifen zu können
132typedef struct
133{
134 eeprom_state_t eepromState;
135 device_info_t deviceInfo;
136 eeprom_data_t changedData;
137}eeprom_stored_data_t;
138
139
140
141
142
143// Data to store reated defines
144//#define SIZEOF_DEFAULT_EEPROM_DATA (sizeof(eeprom_new_data_t))
145#define SIZEOF_CHANGED_EEPROM_DATA (sizeof(eeprom_data_t))
146#define SIZEOF_DEVICE_INFO (sizeof(device_info_t))
147#define SIZEOF_EEPROM_STATE (sizeof(eeprom_state_t))
148
149#define SIZE_OF_DATA_TO_STORE (SIZEOF_CHANGED_EEPROM_DATA + SIZEOF_DEVICE_INFO + SIZEOF_EEPROM_STATE)
150
151
152// Adress related defines
153#define EEPROM_ADRESS_FIRST_START_ID (0)
154#define FIRST_START_ID (0xFF)
155#define CONFIG_ID (01) // Increment by 1 to make compartible update, more than 1 - incompartible
156#if CONFIG_ID == FIRST_START_ID
157#error "CONFIG_ID must not be equal to FIRST_START_ID!!! Calibration data will be erased!!!"
158#endif
159
160
161
162static uint32_t GetPage(uint32_t Address);
163static HAL_StatusTypeDef getEEPROMData(uint32_t address, uint8_t * data, uint32_t len);
164void EEPROM_Read (uint16_t page, uint16_t offset, uint8_t *data, uint16_t size);
165void EEPROM_Write (uint16_t page, uint16_t offset, uint8_t *data, uint16_t size);
166
167
168
169// muss modulo 8 noch hinzufügen wg 8 byte alignement
170static uint8_t eepromData[SIZE_OF_DATA_TO_STORE];
171
172
173static FLASH_EraseInitTypeDef EraseInitStruct = {0};
174
175static const eeprom_data_t defaultEepromData =
176{
177 // Schnittstellenparameter
178
179 /* baudrate */ 19200, // uint32_t baudrate;
180 /* parityMode */ MODBUS_UART_PARITY_EVEN, // uint16_t parityMode;
181 /* stopBits */ 1, // uint16_t stopBits;
182 /* slave_adress */ 1, // uint16_t slave_adress;
183 /* ibn_day */ 0, // ibm_day
184 /* ibn_month */ 0, // ibm_month
185 /* ibn_year */ 0, // ibm_year
186 /* user_id */ 0, // user id
187
188 // Offset und Gain
189
190 /* batteryCurrentOffsetRefTemperatureShunt */ 0, // int16_t batteryCurrentOffsetRefTemperatureShunt;
191 /* batteryCurrentOffsetRefTemperatureChip */ 0, // int16_t batteryCurrentOffsetRefTemperatureChip
192 /* batteryCurrentGainRefTempShunt */ 0, // int16_t batteryCurrentGainRefTempShunt;
193 /* batteryCurrentGainRefTempChip */ 0, // int16_t batteryCurrentGainRefTempShip
194 /* batteryCurrentOffsetTemperatureCalibrationTemperature */ 0, // int16_t batteryCurrentOffsetTemperatureCalibrationTemperature;
195 /* batteryCurrentGainTemperatureCalibrationShuntTemperature */ 0, // int16_t batteryCurrentGainTemperatureCalibrationShuntTemperature;
196 /* batteryCurrentGainTemperatureCalibrationChipTemperature */ 0, // int16_t batteryCurrentGainTemperatureCalibrationChipTemperature;
197 /* batteryCurrentOffsetRefshuntVoltage */ 0, // int32_t batteryCurrentOffsetRefshuntVoltage;
198 /* batteryCurrentOffsetCommonModeCalibrationVoltage */ 0, // int32_t batteryCurrentOffsetCommonModeCalibrationVoltage;
199 /* batteryCurrentOffsetTemperatureCompensationFactor */ 0, // int32_t batteryCurrentOffsetTemperatureCompensationFactor;
200 /* batteryCurrentOffsetCommonModeCompensationFactor */ 0, // int32_t batteryCurrentOffsetCommonModeCompensationFactor;
201 /* batteryCurrentGainRefCurrent */ 250000, // int32_t batteryCurrentGainRefCurrent;
202 /* batteryCurrentGainTemperatureCompensationShuntFactor */ 0, // int32_t batteryCurrentGainTemperatureCompensationShuntFactor;
203 /* batteryCurrentGainTemperatureCompensationChipFactor */ 0, // int32_t batteryCurrentGainTemperatureCompensationChipFactor;
204
205 /* currentOffset */ 0, //int32_t currentOffset;
206 /* currentGain */ 1000000, //uint32_t currentGain;
207
208 /* currentOffsetFast */ 0, //int32_t currentOffset;
209 /* currentGainFast */ 1000000, //uint32_t currentGain;
210
211 /* mAsCounter */ 0, // mAsCounter
212 /* detectedCapacity */ -1, // detectedCapacity
213 /* detectedEnergy */ -1, // detectedEnergy
214 /* mAs_AutoMode */ (-100000LL*3600LL), // mAs_AutoMode = cellCapacity*3600,
215 /* mWs_AutoMode */ (-2640000LL*3600LL),// mWs_AutoMode = cellEnergy*3600,
216
217 // battery parameter
218
219 /* cef */ 99, // cef
220 /* peukert */ 105, // peukert
221 /* cellCapacity */ 160000, // cell Capacity in mAh
222 /* cellEnergy */ 2048000, // cell energy in mWh
223 /* iBatFull */ 10, // I-batt full 10%, 10A bei 100Ah akku
224 /* tBatFull */ 2, // t-batt full 2 Sekunden
225 /* uBatFull */ 0, // 14V olt Ubatt full, Neu: Bei 0: Erkung von Lipro LVP als 0%
226 /* uBatEmpty */ 11312, // 11,312V Ubatt Empty
227 /* socCalcMode */ 1, // SoC calculation mode: 0(default)
228 /* cellRatedDischargeTime */ 2, // cell rated current discharge time [C/x]. For example, if 40Ah cell is rated as 0.5c, then rated discharge time is 2
229
230 /* lvpStart */ 12000, // uint16_t lvpStart; Spannung ab der die LOW Voltage Protection aktiv wird in mV
231 /* lvpStop */ 12500, // uint16_t lvpStop; Spannung ab der die LOW Voltage Protection wieder inaktiv wird
232 /* ovpStart */ 14800, // uint16_t ovpStart; Spannung ab der die OVER Voltage Protection aktiv wird in mV
233 /* ovpStop */ 14000, // uint16_t ovpStop; Spannung ab der die OVER Voltage Protection wieder inaktiv wird
234
235#if (DEVICETYPE == 500)
236 /* loadCurrentLimit */ -500, // uint16_t loadCurrentLimit; maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
237 /* chargeCurrentLimit */ 500, // uint16_t chargeCurrentLimit; maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
238#elif (DEVICETYPE == 250)
239 /* loadCurrentLimit */ -250, // uint16_t loadCurrentLimit; maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
240 /* chargeCurrentLimit */ 250, // uint16_t chargeCurrentLimit maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
241#elif (DEVICETYPE == 125)
242 /* loadCurrentLimit */ -125, // uint16_t loadCurrentLimit; maximaler Laststrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Laststrom Protection aktiv
243 /* chargeCurrentLimit */ 125, // uint16_t chargeCurrentLimit; maximaler Ladestrom in A wenn der Strom größer ist als der eingestelle Wert dann wird die Ladestrom Protection aktiv
244#else
245#error No valid device type
246#endif
247 /* chargeStopHighTemperatureStart */ 6000, // 80°C int16_t chargeStopHighTemperatureStart; Abschalttemperatur Ladung wegen zu hoher Temperatur
248 /* chargeStopHighTemperatureStop */ 5500, // 75°C int16_t chargeStopHighTemperatureStop; Wiedereinschalttemperatur
249 /* chargeStopLowTemperatureStart */ -3000, // -35°C int16_t chargeStopLowTemperatureStart; Abschalttemperatur Ladung wegen zu niedriger Temperatur
250 /* chargeStopLowTemperatureStop */ -2500, // -30°C int16_t chargeStopLowTemperatureStop; Wiedereinschalttemperatur
251 /* dischargeStopHighTemperatureStart*/ 6000, // 80°C int16_t dischargeStopHighTemperatureStart; Abschalttemperatur Entladung wegen zu hoher Temperatur
252 /* dischargeStopHighTemperatureStop */ 5500, // 75°C int16_t dischargeStopHighTemperatureStop; Wiedereinschalttemperatur
253 /* dischargeStopLowTemperatureStart */ -3500, // -35°C int16_t dischargeStopLowTemperatureStart; Abschalttemperatur EntLadung wegen zu niedriger Temperatur
254 /* dischargeStopLowTemperatureStop */ -3000, // -30°C int16_t dischargeStopLowTemperatureStop; Wiedereinschalttemperatur
255
256 /* uBatEmptyCompStartTemp */ 50, // 5°C We start calculating uBatEmpty compensations only when cell temperature is lower than this value
257 /* uBatEmptyCompStopTemp */ -200, // -20°C We stop calculating uBatEmpty compensations when cell temperature is lower than this value
258 /* uBatEmptyCompStopVolt */ 10000, // 10V uBatEmpty voltage at temperatures lower than -20°C
259
260 /* extraDischargeStrom_mA */ 7, // mA, current that LiPro consumes itself
261 /* cefW */ 90, // 90% cef for Wh calculations
262 /* Battery Empty Detection Mode*/ 1, // Auto, from BMS
263
264
265};
266
267/**
268 * @brief Gets the page of a given address
269 * @param Addr: Address of the FLASH Memory
270 * @retval The page of a given address
271 */
272static uint32_t GetPage(uint32_t Addr)
273{
274 return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;
275}
276
277
278startType_t EEPROM_isFirstStart(void)
279{
280
281 uint8_t firstStartCatcher;
282
283 EEPROM_Read(0,EEPROM_ADRESS_FIRST_START_ID, &firstStartCatcher, 1);
284
285
286 if (firstStartCatcher == FIRST_START_ID)
287 {
288 printf ("First start detected!\n");
289 return FIRST_START_AFTER_ERASE;
290 }
291 else if (firstStartCatcher == CONFIG_ID)
292 {
293 printf ("Normal start without EEPROM changes detected\n");
294 return FIRST_START_AFTER_COMPARTIBLE_UPDATE;
295 }
296 else if (firstStartCatcher == CONFIG_ID - 1)
297 {
298 printf ("EEPROM was changed! We need to preserve calibration and settings data!\n");
299 return FIRST_START_AFTER_INCOMPARTIBLE_UPDATE;
300 }
301 else return FIRST_START_ERROR;
302}
303
304//------------------------------------------------------------------------------
305
306HAL_StatusTypeDef EEPROM_fullRestore(sys_data_t* data)
307{
308 eeprom_stored_data_t* dataToStore;
309 printf("EEPROM FULL RESTORE!\n");
310
311 /**************** LESE_DEFAULT_WERTE ************************/
312
313 dataToStore = (eeprom_stored_data_t*) eepromData;
314
315 // Schnittstellenparameter
316 dataToStore->changedData.baudrate = defaultEepromData.baudrate;
317 dataToStore->changedData.parityMode = defaultEepromData.parityMode;
318 dataToStore->changedData.stopBits = defaultEepromData.stopBits;
319 dataToStore->changedData.slave_adress = defaultEepromData.slave_adress;
320
321 // Offset und Gain
322 dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt = defaultEepromData.batteryCurrentOffsetRefTemperatureShunt;
323 dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip = defaultEepromData.batteryCurrentOffsetRefTemperatureChip;
324 dataToStore->changedData.batteryCurrentGainRefTempShunt = defaultEepromData.batteryCurrentGainRefTempShunt;
325 dataToStore->changedData.batteryCurrentGainRefTempChip = defaultEepromData.batteryCurrentGainRefTempChip;
326 dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature = defaultEepromData.batteryCurrentOffsetTemperatureCalibrationTemperature;
327 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = defaultEepromData.batteryCurrentGainTemperatureCalibrationShuntTemperature;
328 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = defaultEepromData.batteryCurrentGainTemperatureCalibrationChipTemperature;
329 dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage = defaultEepromData.batteryCurrentOffsetRefshuntVoltage;
330 dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = defaultEepromData.batteryCurrentOffsetCommonModeCalibrationVoltage;
331 dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor = defaultEepromData.batteryCurrentOffsetCommonModeCompensationFactor;
332 dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor = defaultEepromData.batteryCurrentOffsetTemperatureCompensationFactor;
333 dataToStore->changedData.batteryCurrentGainRefCurrent = defaultEepromData.batteryCurrentGainRefCurrent;
334 dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor = defaultEepromData.batteryCurrentGainTemperatureCompensationShuntFactor;
335 dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor = defaultEepromData.batteryCurrentGainTemperatureCompensationChipFactor;
336
337 dataToStore->changedData.currentOffset = defaultEepromData.currentOffset;
338 dataToStore->changedData.currentGain = defaultEepromData.currentGain;
339
340 dataToStore->changedData.currentOffsetFast = defaultEepromData.currentOffsetFast;
341 dataToStore->changedData.currentGainFast = defaultEepromData.currentGainFast;
342
343 // AH Counter Parameter
344 dataToStore->changedData.cef = defaultEepromData.cef;
345 dataToStore->changedData.peukert = defaultEepromData.peukert;
346 dataToStore->changedData.cellCapacity = defaultEepromData.cellCapacity;
347 dataToStore->changedData.cellEnergy = defaultEepromData.cellEnergy;
348 dataToStore->changedData.iBatFull = defaultEepromData.iBatFull;
349 dataToStore->changedData.tBatFull = defaultEepromData.tBatFull;
350 dataToStore->changedData.uBatFull = defaultEepromData.uBatFull;
351 dataToStore->changedData.uBatEmpty = defaultEepromData.uBatEmpty;
352 dataToStore->changedData.socCalcMode = defaultEepromData.socCalcMode;
353 dataToStore->changedData.cellRatedDischargeTime = defaultEepromData.cellRatedDischargeTime;
354
355 // Schaltausgänge
356 dataToStore->changedData.lvpStart = defaultEepromData.lvpStart;
357 dataToStore->changedData.lvpStop = defaultEepromData.lvpStop;
358 dataToStore->changedData.ovpStart = defaultEepromData.ovpStart;
359 dataToStore->changedData.ovpStop = defaultEepromData.ovpStop;
360 dataToStore->changedData.loadCurrentLimit = defaultEepromData.loadCurrentLimit;
361 dataToStore->changedData.chargeCurrentLimit = defaultEepromData.chargeCurrentLimit;
362 dataToStore->changedData.chargeStopHighTemperatureStart = defaultEepromData.chargeStopHighTemperatureStart;
363 dataToStore->changedData.chargeStopHighTemperatureStop = defaultEepromData.chargeStopHighTemperatureStop;
364 dataToStore->changedData.chargeStopLowTemperatureStart = defaultEepromData.chargeStopLowTemperatureStart;
365 dataToStore->changedData.chargeStopLowTemperatureStop = defaultEepromData.chargeStopLowTemperatureStop;
366 dataToStore->changedData.dischargeStopHighTemperatureStart = defaultEepromData.dischargeStopHighTemperatureStart;
367 dataToStore->changedData.dischargeStopHighTemperatureStop = defaultEepromData.dischargeStopHighTemperatureStop;
368 dataToStore->changedData.dischargeStopLowTemperatureStart = defaultEepromData.dischargeStopLowTemperatureStart;
369 dataToStore->changedData.dischargeStopLowTemperatureStop = defaultEepromData.dischargeStopLowTemperatureStop;
370
371 dataToStore->changedData.uBatEmptyCompStartTemp = defaultEepromData.uBatEmptyCompStartTemp;
372 dataToStore->changedData.uBatEmptyCompStopTemp = defaultEepromData.uBatEmptyCompStopTemp;
373 dataToStore->changedData.uBatEmptyCompStopVolt = defaultEepromData.uBatEmptyCompStopVolt;
374
375 dataToStore->changedData.extraDischargeStrom_mA = defaultEepromData.extraDischargeStrom_mA;
376 dataToStore->changedData.cefW = defaultEepromData.cefW;
377 dataToStore->changedData.batteryEmptyDetectionMode = defaultEepromData.batteryEmptyDetectionMode;
378
379
380
381 // Eeprom Status Infos
382 dataToStore->eepromState.writeCounter++;
383 dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t);
384 dataToStore->eepromState.revisionInfo = 0;
385 dataToStore->eepromState.firstStartId = CONFIG_ID;
386
387
388 /****************EEPROM Speichern********************/
389
390 EEPROM_Write(0, 0, (uint8_t*)eepromData, SIZE_OF_DATA_TO_STORE);
391
392
393
394
395
396 /**************** AUSLESEN_UND_PRÜFEN ********************/
397
398 return EEPROM_readConfig(data);
399
400
401
402}
403
404
405//Werkeinstellung ohne Kalibrierwert Überschreibung
406HAL_StatusTypeDef EEPROM_factoryRestore(sys_data_t* data, int resetToDefault)
407{
408 printf("EEPROM FACTORY RESTORE/UPDATE!\n");
409
410
411
412 eeprom_stored_data_t* dataToStore = (eeprom_stored_data_t*)eepromData;
413
414 EEPROM_readConfig(data); // Restoring calibration data
415
416 // Offset und Gain
417
418 dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt = data->s.parameter.batteryCurrentOffsetRefTemperatureShunt;
419 dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip = data->s.parameter.batteryCurrentOffsetRefTemperatureChip;
420 dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage = data->s.parameter.batteryCurrentOffsetRefshuntVoltage;
421 dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage;
422 dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor = data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor;
423 dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature = data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature;
424 dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor = data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor;
425 dataToStore->changedData.currentOffset = data->s.parameter.batteryCurrentOffset;
426 dataToStore->changedData.currentGain = data->s.parameter.batteryCurrentGainCorrectionFaktor;
427 dataToStore->changedData.currentOffsetFast = data->s.parameter.batteryCurrentOffsetFast;
428 dataToStore->changedData.currentGainFast = data->s.parameter.batteryCurrentGainCorrectionFaktorFast;
429
430 dataToStore->changedData.batteryCurrentGainRefTempShunt = data->s.parameter.batteryCurrentGainRefTempShunt;
431 dataToStore->changedData.batteryCurrentGainRefTempChip = data->s.parameter.batteryCurrentGainRefTempChip;
432 dataToStore->changedData.batteryCurrentGainRefCurrent = data->s.parameter.batteryCurrentGainRefCurrent;
433 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature;
434 dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor;
435 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature;
436 dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor;
437
438 // Schnittstellenparameter
439 dataToStore->changedData.baudrate = defaultEepromData.baudrate;
440 dataToStore->changedData.parityMode = defaultEepromData.parityMode;
441 dataToStore->changedData.stopBits = defaultEepromData.stopBits;
442 dataToStore->changedData.slave_adress = defaultEepromData.slave_adress;
443 dataToStore->changedData.ibn_day = defaultEepromData.ibn_day;
444 dataToStore->changedData.ibn_month = defaultEepromData.ibn_month;
445 dataToStore->changedData.ibn_year = defaultEepromData.ibn_year;
446 dataToStore->changedData.user_id = defaultEepromData.user_id;
447
448 //Ah counter
449 dataToStore->changedData.cef = defaultEepromData.cef;
450 dataToStore->changedData.cellCapacity = defaultEepromData.cellCapacity;
451 dataToStore->changedData.cellEnergy = defaultEepromData.cellEnergy;
452 dataToStore->changedData.iBatFull = defaultEepromData.iBatFull;
453 dataToStore->changedData.peukert = defaultEepromData.peukert;
454 dataToStore->changedData.tBatFull = defaultEepromData.tBatFull;
455 dataToStore->changedData.uBatFull = defaultEepromData.uBatFull;
456 dataToStore->changedData.uBatEmpty = defaultEepromData.uBatEmpty;
457 dataToStore->changedData.socCalcMode = defaultEepromData.socCalcMode;
458 dataToStore->changedData.cellRatedDischargeTime = defaultEepromData.cellRatedDischargeTime;
459
460 // Schaltausgänge
461 dataToStore->changedData.lvpStart = defaultEepromData.lvpStart;
462 dataToStore->changedData.lvpStop = defaultEepromData.lvpStop;
463 dataToStore->changedData.ovpStart = defaultEepromData.ovpStart;
464 dataToStore->changedData.ovpStop = defaultEepromData.ovpStop;
465 dataToStore->changedData.loadCurrentLimit = defaultEepromData.loadCurrentLimit;
466 dataToStore->changedData.chargeCurrentLimit = defaultEepromData.chargeCurrentLimit;
467 dataToStore->changedData.chargeStopHighTemperatureStart = defaultEepromData.chargeStopHighTemperatureStart;
468 dataToStore->changedData.chargeStopHighTemperatureStop = defaultEepromData.chargeStopHighTemperatureStop;
469 dataToStore->changedData.chargeStopLowTemperatureStart = defaultEepromData.chargeStopLowTemperatureStart;
470 dataToStore->changedData.chargeStopLowTemperatureStop = defaultEepromData.chargeStopLowTemperatureStop;
471 dataToStore->changedData.dischargeStopHighTemperatureStart = defaultEepromData.dischargeStopHighTemperatureStart;
472 dataToStore->changedData.dischargeStopHighTemperatureStop = defaultEepromData.dischargeStopHighTemperatureStop;
473 dataToStore->changedData.dischargeStopLowTemperatureStart = defaultEepromData.dischargeStopLowTemperatureStart;
474 dataToStore->changedData.dischargeStopLowTemperatureStop = defaultEepromData.dischargeStopLowTemperatureStop;
475
476 dataToStore->changedData.uBatEmptyCompStartTemp = defaultEepromData.uBatEmptyCompStartTemp;
477 dataToStore->changedData.uBatEmptyCompStopTemp = defaultEepromData.uBatEmptyCompStopTemp;
478 dataToStore->changedData.uBatEmptyCompStopVolt = defaultEepromData.uBatEmptyCompStopVolt;
479
480 dataToStore->changedData.extraDischargeStrom_mA = defaultEepromData.extraDischargeStrom_mA;
481 dataToStore->changedData.cefW = defaultEepromData.cefW;
482 dataToStore->changedData.batteryEmptyDetectionMode = defaultEepromData.batteryEmptyDetectionMode;
483
484
485
486
487
488 dataToStore->eepromState.writeCounter = dataToStore->eepromState.writeCounter++;
489 dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t);
490 dataToStore->eepromState.revisionInfo = 0;
491 dataToStore->eepromState.firstStartId = CONFIG_ID;
492
493 dataToStore->deviceInfo.deviceInfoWritten = 1;
494 dataToStore->deviceInfo.SN = data->s.parameter.sn;
495
496 EEPROM_Write(0,0, (uint8_t*)dataToStore, SIZE_OF_DATA_TO_STORE);
497
498
499 return EEPROM_readConfig(data);
500}
501
502HAL_StatusTypeDef EEPROM_storeConfig(sys_data_t* data, uint8_t withSN)
503{
504 eeprom_stored_data_t* dataToStore;
505 /****************LESE_WERTE_AUS_SYSDATA*********************/
506 printf("EEPROM STORE CONFIG!\n");
507 dataToStore = (eeprom_stored_data_t*) eepromData;
508
509 // Schnittstellenparameter
510 dataToStore->changedData.baudrate = data->s.parameter.baudrate;
511 dataToStore->changedData.parityMode = data->s.parameter.parityMode;
512 dataToStore->changedData.stopBits = data->s.parameter.stopBit;
513 dataToStore->changedData.slave_adress = data->s.parameter.slave_address;
514 dataToStore->changedData.ibn_day = data->s.parameter.ibn_day;
515 dataToStore->changedData.ibn_month = data->s.parameter.ibn_month;
516 dataToStore->changedData.ibn_year = data->s.parameter.ibn_year;
517 dataToStore->changedData.user_id = data->s.parameter.user_id;
518
519 // Offset und Gain
520 dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip = data->s.parameter.batteryCurrentOffsetRefTemperatureChip;
521 dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt = data->s.parameter.batteryCurrentOffsetRefTemperatureShunt;
522
523 dataToStore->changedData.batteryCurrentGainRefTempShunt = data->s.parameter.batteryCurrentGainRefTempShunt;
524 dataToStore->changedData.batteryCurrentGainRefTempChip = data->s.parameter.batteryCurrentGainRefTempChip;
525 dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature = data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature;
526 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature;
527 dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature = data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature;
528 dataToStore->changedData.batteryCurrentOffsetRefshuntVoltage = data->s.parameter.batteryCurrentOffsetRefshuntVoltage;
529
530 dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage = data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage;
531 dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor = data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor;
532 dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor = data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor;
533 dataToStore->changedData.batteryCurrentGainRefCurrent = data->s.parameter.batteryCurrentGainRefCurrent;
534 dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor;
535 dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor = data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor;
536
537 dataToStore->changedData.currentOffset = data->s.parameter.batteryCurrentOffset;
538 dataToStore->changedData.currentGain = data->s.parameter.batteryCurrentGainCorrectionFaktor;
539
540 dataToStore->changedData.currentOffsetFast = data->s.parameter.batteryCurrentOffsetFast;
541 dataToStore->changedData.currentGainFast = data->s.parameter.batteryCurrentGainCorrectionFaktorFast;
542
543
544 // AH COUNTER Einstellungen
545 dataToStore->changedData.cef = data->s.parameter.cef;
546 dataToStore->changedData.peukert = data->s.parameter.peukert;
547 dataToStore->changedData.cellCapacity = data->s.parameter.cellCapacity;
548 dataToStore->changedData.cellEnergy = data->s.parameter.battEnergy;
549 dataToStore->changedData.iBatFull = data->s.parameter.iBatFull;
550 dataToStore->changedData.tBatFull = data->s.parameter.tBatFull;
551 dataToStore->changedData.uBatFull = data->s.parameter.uBatFull;
552 dataToStore->changedData.uBatEmpty = data->s.parameter.uBatEmpty;
553 dataToStore->changedData.socCalcMode = data->s.parameter.socCalcMode;
554
555 dataToStore->changedData.cellRatedDischargeTime = data->s.parameter.cellRatedDischargeTime;
556 // Schaltausgänge
557 dataToStore->changedData.lvpStart = data->s.parameter.lvpStart;
558 dataToStore->changedData.lvpStop = data->s.parameter.lvpStop;
559 dataToStore->changedData.ovpStart = data->s.parameter.ovpStart;
560 dataToStore->changedData.ovpStop = data->s.parameter.ovpStop;
561 dataToStore->changedData.loadCurrentLimit = data->s.parameter.loadCurrentLimit;
562 dataToStore->changedData.chargeCurrentLimit = data->s.parameter.chargeCurrentLimit;
563 dataToStore->changedData.chargeStopHighTemperatureStart = data->s.parameter.chargeStopHighTemperatureStart;
564 dataToStore->changedData.chargeStopHighTemperatureStop = data->s.parameter.chargeStopHighTemperatureStop;
565 dataToStore->changedData.chargeStopLowTemperatureStart = data->s.parameter.chargeStopLowTemperatureStart;
566 dataToStore->changedData.chargeStopLowTemperatureStop = data->s.parameter.chargeStopLowTemperatureStop;
567 dataToStore->changedData.dischargeStopHighTemperatureStart = data->s.parameter.dischargeStopHighTemperatureStart;
568 dataToStore->changedData.dischargeStopHighTemperatureStop = data->s.parameter.dischargeStopHighTemperatureStop;
569 dataToStore->changedData.dischargeStopLowTemperatureStart = data->s.parameter.dischargeStopLowTemperatureStart;
570 dataToStore->changedData.dischargeStopLowTemperatureStop = data->s.parameter.dischargeStopLowTemperatureStop;
571
572 // Neue Parameter für SOC
573 dataToStore->changedData.uBatEmptyCompStartTemp = data->s.parameter.uBatEmptyCompStartTemp;
574 dataToStore->changedData.uBatEmptyCompStopTemp = data->s.parameter.uBatEmptyCompStopTemp;
575 dataToStore->changedData.uBatEmptyCompStopVolt = data->s.parameter.uBatEmptyCompStopVolt;
576 dataToStore->changedData.extraDischargeStrom_mA = data->s.parameter.extraDischargeStrom_mA;
577 dataToStore->changedData.cefW = data->s.parameter.cefW;
578 dataToStore->changedData.batteryEmptyDetectionMode = data->s.parameter.batteryEmptyDetectionMode;
579
580 // Eeprom Status Infos
581 dataToStore->eepromState.writeCounter++;
582 dataToStore->eepromState.structureSize = sizeof(eeprom_stored_data_t);
583 dataToStore->eepromState.revisionInfo = 0;
584 dataToStore->eepromState.firstStartId = CONFIG_ID;
585
586 if (withSN)
587 {
588 printf("Writing SN!\n");
589 dataToStore->deviceInfo.SN = data->s.parameter.sn;
590 }
591
592
593 EEPROM_Write(0,0, (uint8_t*)dataToStore, SIZE_OF_DATA_TO_STORE);
594
595 return EEPROM_readConfig(data);
596}
597
598//------------------------------------------------------------------------------
599
600HAL_StatusTypeDef EEPROM_readConfig(sys_data_t* data)
601{
602 eeprom_stored_data_t* dataToStore;
603
604 /****************WERTE_AUS_EEPROM_LESEN********************/
605
606
607 EEPROM_Read(0, 0, (uint8_t*)eepromData, sizeof(eepromData));
608
609
610 dataToStore = (eeprom_stored_data_t*)eepromData;
611
612 // Schnittstellenparameter
613 data->s.parameter.baudrate = dataToStore->changedData.baudrate;
614 data->s.parameter.parityMode = dataToStore->changedData.parityMode;
615 data->s.parameter.stopBit = dataToStore->changedData.stopBits;
616 data->s.parameter.slave_address = dataToStore->changedData.slave_adress;
617 data->s.parameter.ibn_day = dataToStore->changedData.ibn_day;
618 data->s.parameter.ibn_month = dataToStore->changedData.ibn_month;
619 data->s.parameter.ibn_year = dataToStore->changedData.ibn_year;
620 data->s.parameter.user_id = dataToStore->changedData.user_id;
621
622 // Offset und Gain
623 data->s.parameter.batteryCurrentOffsetRefTemperatureShunt = dataToStore->changedData.batteryCurrentOffsetRefTemperatureShunt;
624 data->s.parameter.batteryCurrentOffsetRefTemperatureChip = dataToStore->changedData.batteryCurrentOffsetRefTemperatureChip;
625 data->s.parameter.batteryCurrentGainRefTempShunt = dataToStore->changedData.batteryCurrentGainRefTempShunt;
626 data->s.parameter.batteryCurrentGainRefTempChip = dataToStore->changedData.batteryCurrentGainRefTempChip;
627 data->s.parameter.batteryCurrentOffsetTemperatureCalibrationTemperature = dataToStore->changedData.batteryCurrentOffsetTemperatureCalibrationTemperature;
628 data->s.parameter.batteryCurrentGainTemperatureCalibrationShuntTemperature = dataToStore->changedData.batteryCurrentGainTemperatureCalibrationShuntTemperature;
629 data->s.parameter.batteryCurrentGainTemperatureCalibrationChipTemperature = dataToStore->changedData.batteryCurrentGainTemperatureCalibrationChipTemperature;
630 data->s.parameter.batteryCurrentOffsetRefshuntVoltage = dataToStore ->changedData.batteryCurrentOffsetRefshuntVoltage;
631 data->s.parameter.batteryCurrentOffsetCommonModeCalibrationVoltage = dataToStore->changedData.batteryCurrentOffsetCommonModeCalibrationVoltage;
632 data->s.parameter.batteryCurrentOffsetCommonModeCompensationFactor = dataToStore->changedData.batteryCurrentOffsetCommonModeCompensationFactor;
633 data->s.parameter.batteryCurrentOffsetTemperatureCompensationFactor = dataToStore->changedData.batteryCurrentOffsetTemperatureCompensationFactor;
634 data->s.parameter.batteryCurrentGainRefCurrent = dataToStore->changedData.batteryCurrentGainRefCurrent;
635 data->s.parameter.batteryCurrentGainTemperatureCompensationShuntFactor = dataToStore->changedData.batteryCurrentGainTemperatureCompensationShuntFactor;
636 data->s.parameter.batteryCurrentGainTemperatureCompensationChipFactor = dataToStore->changedData.batteryCurrentGainTemperatureCompensationChipFactor;
637 data->s.parameter.batteryCurrentOffset = dataToStore->changedData.currentOffset;
638 data->s.parameter.batteryCurrentGainCorrectionFaktor = dataToStore->changedData.currentGain;
639
640 data->s.parameter.batteryCurrentOffsetFast = dataToStore->changedData.currentOffsetFast;
641 data->s.parameter.batteryCurrentGainCorrectionFaktorFast = dataToStore->changedData.currentGainFast;
642
643 //Einstellungenm für AH counter
644 data->s.parameter.cef = dataToStore ->changedData.cef;
645 data->s.parameter.peukert = dataToStore ->changedData.peukert;
646 data->s.parameter.cellCapacity = dataToStore ->changedData.cellCapacity;
647 data->s.parameter.battEnergy = dataToStore ->changedData.cellEnergy;
648 data->s.parameter.iBatFull = dataToStore ->changedData.iBatFull;
649 data->s.parameter.tBatFull = dataToStore->changedData.tBatFull;
650 data->s.parameter.uBatFull = dataToStore->changedData.uBatFull;
651 data->s.parameter.uBatEmpty = dataToStore->changedData.uBatEmpty;
652 data->s.parameter.socCalcMode = dataToStore->changedData.socCalcMode;
653 data->s.parameter.cellRatedDischargeTime = dataToStore->changedData.cellRatedDischargeTime;
654
655 // New EU directive says that cell Energy in Wh must be somwhere on the
656 // visible part of the cell as well as capacity in Ah
657
658
659 // Schaltausgänge
660 data->s.parameter.lvpStart = dataToStore->changedData.lvpStart;
661 data->s.parameter.lvpStop = dataToStore->changedData.lvpStop;
662 data->s.parameter.ovpStart = dataToStore->changedData.ovpStart;
663 data->s.parameter.ovpStop = dataToStore->changedData.ovpStop;
664 data->s.parameter.loadCurrentLimit = dataToStore->changedData.loadCurrentLimit;
665 data->s.parameter.chargeCurrentLimit = dataToStore->changedData.chargeCurrentLimit;
666 data->s.parameter.chargeStopHighTemperatureStart = dataToStore->changedData.chargeStopHighTemperatureStart;
667 data->s.parameter.chargeStopHighTemperatureStop = dataToStore->changedData.chargeStopHighTemperatureStop;
668 data->s.parameter.chargeStopLowTemperatureStart = dataToStore->changedData.chargeStopLowTemperatureStart;
669 data->s.parameter.chargeStopLowTemperatureStop = dataToStore->changedData.chargeStopLowTemperatureStop;
670 data->s.parameter.dischargeStopHighTemperatureStart = dataToStore->changedData.dischargeStopHighTemperatureStart;
671 data->s.parameter.dischargeStopHighTemperatureStop = dataToStore->changedData.dischargeStopHighTemperatureStop;
672 data->s.parameter.dischargeStopLowTemperatureStart = dataToStore->changedData.dischargeStopLowTemperatureStart;
673 data->s.parameter.dischargeStopLowTemperatureStop = dataToStore->changedData.dischargeStopLowTemperatureStop;
674
675 data->s.parameter.uBatEmptyCompStartTemp = dataToStore->changedData.uBatEmptyCompStartTemp;
676 data->s.parameter.uBatEmptyCompStopTemp = dataToStore->changedData.uBatEmptyCompStopTemp;
677 data->s.parameter.uBatEmptyCompStopVolt = dataToStore->changedData.uBatEmptyCompStopVolt;
678
679 data->s.parameter.extraDischargeStrom_mA = dataToStore->changedData.extraDischargeStrom_mA;
680 data->s.parameter.cefW = dataToStore->changedData.cefW;
681 data->s.parameter.batteryEmptyDetectionMode = dataToStore->changedData.batteryEmptyDetectionMode;
682
683
684
685 // Geräteinformation
686 data->s.parameter.sn = dataToStore->deviceInfo.SN;
687
688 // prüfe Eeprom Status Infos
689 //dataToStore->eepromState.writeCounter ++ ;
690 if (dataToStore->eepromState.structureSize != sizeof(eeprom_stored_data_t)) return HAL_ERROR;
691 if (dataToStore->eepromState.revisionInfo != 0) return HAL_ERROR;
692 if (dataToStore->eepromState.firstStartId != CONFIG_ID) return HAL_ERROR;
693
694
695 return HAL_OK;
696}
697
698/*Entfernte EEPROM Werte
699
700 data->s.values.dischargeTotalAh = dataToStore->changedData.dischargeTotalAh;
701 data->s.values.chargeTotalAh = dataToStore->changedData.chargeTotalAh;
702 data->s.values.dischargeTotalWh = dataToStore->changedData.dischargeTotalWh;
703 data->s.values.chargeTotalWh = dataToStore->changedData.chargeTotalWh;
704 data->s.values.onTime = dataToStore->changedData.onTime;
705 data->s.values.mAsCounter = dataToStore->changedData.mAsCounter;
706 data->s.values.detectedCapacity = dataToStore->changedData.detectedCapacity;
707 data->s.values.detectedEnergy = dataToStore->changedData.detectedEnergy;
708 data->s.values.mAs_AutoMode = dataToStore->changedData.mAs_AutoMode;
709 data->s.values.mWs_AutoMode = dataToStore->changedData.mWs_AutoMode;
710*/
711
712
713//--- NEW Functions
714// function to determine the remaining bytes
715uint16_t bytestowrite (uint16_t size, uint16_t offset)
716{
717 if ((size+offset)<PAGE_SIZE) return size;
718 else return PAGE_SIZE-offset;
719}
720
721
722void EEPROM_Read (uint16_t page, uint16_t offset, uint8_t *data, uint16_t size)
723{
724 //int paddrposition = log(PAGE_SIZE)/log(2);
725 int paddrposition = PADDRPOSITION;
726
727 uint16_t startPage = page;
728 uint16_t endPage = page + ((size+offset)/PAGE_SIZE);
729
730 uint16_t numofpages = (endPage-startPage) + 1;
731 uint16_t pos=0;
732
733 for (int i=0; i<numofpages; i++)
734 {
735 uint16_t MemAddress = startPage<<paddrposition | offset;
736 uint16_t bytesremaining = bytestowrite(size, offset);
737 HAL_I2C_Mem_Read(EEPROM_I2C, EEPROM_ADDR, MemAddress, 2, &data[pos], bytesremaining, 1000);
738 startPage += 1;
739 offset=0;
740 size = size-bytesremaining;
741 pos += bytesremaining;
742 }
743
744}
745
746
747void EEPROM_Write (uint16_t page, uint16_t offset, uint8_t *data, uint16_t size)
748{
749
750 // Find out the number of bit, where the page addressing starts
751 int paddrposition = PADDRPOSITION;
752
753 // calculate the start page and the end page
754 uint16_t startPage = page;
755 uint16_t endPage = page + ((size+offset)/PAGE_SIZE);
756
757 // number of pages to be written
758 uint16_t numofpages = (endPage-startPage) + 1;
759 uint16_t pos=0;
760
761 // write the data
762 for (int i=0; i<numofpages; i++)
763 {
764 /* calculate the address of the memory location
765 * Here we add the page address with the byte address
766 */
767 uint16_t MemAddress = startPage<<paddrposition | offset;
768 uint16_t bytesremaining = bytestowrite(size, offset); // calculate the remaining bytes to be written
769
770 HAL_I2C_Mem_Write(EEPROM_I2C, EEPROM_ADDR, MemAddress, 2, &data[pos], bytesremaining, 1000); // write the data to the EEPROM
771 startPage += 1; // increment the page, so that a new page address can be selected for further write
772 offset=0; // since we will be writing to a new page, so offset will be 0
773 size = size-bytesremaining; // reduce the size of the bytes
774 pos += bytesremaining; // update the position for the data buffer
775
776 HAL_Delay (5); // Write cycle delay (5ms)
777 }
778}
Note: See TracBrowser for help on using the repository browser.