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

Last change on this file since 73 was 73, checked in by f.jahn, 32 hours ago

Delta Sigma ADC auf 10Channel geändert.

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