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

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