From 195d6ef021cefea158e10863dfd4d58ccdd216b4 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Sun, 1 Dec 2024 15:56:31 +0300 Subject: [PATCH] Handle EEPROM i2c error --- Core/Inc/EEPROM.h | 3 +++ Core/Src/EEPROM.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/Core/Inc/EEPROM.h b/Core/Inc/EEPROM.h index c8105d8..195d629 100644 --- a/Core/Inc/EEPROM.h +++ b/Core/Inc/EEPROM.h @@ -29,6 +29,7 @@ #define MEMORY_END (START_ADR_MACRO + (MACRO_BLOCKSIZE*MAX_MACRO_COUNT)) +#define EEPROM_REED_RETRY 3; typedef enum MemoryStatus { EEPROM_FAIL, EEPROM_MISSING_ELEMENT, @@ -147,4 +148,6 @@ MemoryStatus delMacro(unsigned char number); MemoryStatus saveInfoBlock(); MemoryStatus getInfoBlock(); +void EEPROM_FAIL_HANDLER(); + #endif /* INC_EEPROM_H_ */ diff --git a/Core/Src/EEPROM.c b/Core/Src/EEPROM.c index f2d18dc..6fbaa00 100644 --- a/Core/Src/EEPROM.c +++ b/Core/Src/EEPROM.c @@ -10,9 +10,11 @@ extern IWDG_HandleTypeDef hiwdg; //*********************** EEPROM_INIT ********************************// MemoryStatus EEPROM_INIT() { + uint8_t attempts = EEPROM_REED_RETRY; retry: memset(&infoBlock, 0x00, sizeof(infoBlock)); MemoryStatus status = getInfoBlock(&infoBlock); if (status != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; char errorMsg[] = "Error reading InfoBlock from EEPROM\n"; CDC_Transmit_FS((uint8_t*) errorMsg, strlen(errorMsg)); return status; @@ -135,11 +137,13 @@ MemoryStatus saveInfoBlock() { } MemoryStatus getInfoBlock() { + uint8_t attempts = EEPROM_REED_RETRY; retry: memset(&infoBlock, 0x00, sizeof(InfoBlock)); MemoryStatus status = FLASH_ReadBlock(START_ADR_STAT, 0, (uint8_t*) &infoBlock, sizeof(InfoBlock)); if (status != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } @@ -147,44 +151,54 @@ MemoryStatus getInfoBlock() { } MemoryStatus saveShot(unsigned char number, Shot *shot) { + uint8_t attempts = EEPROM_REED_RETRY; retry: if (FLASH_WriteBlock(START_ADR_SHOT, number, (uint8_t*) shot, SHOT_BLOCKSIZE, SHOT_BLOCKSIZE) == EEPROM_OK) { return EEPROM_OK; } + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } MemoryStatus getShot(unsigned char number, Shot *shot) { + uint8_t attempts = EEPROM_REED_RETRY; retry: HAL_IWDG_Refresh(&hiwdg); memset(shot, 0x00, sizeof(Shot)); if (FLASH_ReadBlock(START_ADR_SHOT, number, (uint8_t*) shot, SHOT_BLOCKSIZE) != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } if (!shot->isExist) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_MISSING_ELEMENT; } return EEPROM_OK; } MemoryStatus delShot(unsigned char number) { + uint8_t attempts = EEPROM_REED_RETRY; retry: if (FLASH_DelBlock(START_ADR_SHOT, number, SHOT_BLOCKSIZE) == EEPROM_OK) { return EEPROM_OK; } + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } MemoryStatus saveProg(unsigned char number, Program *prog) { + uint8_t attempts = EEPROM_REED_RETRY; retry: MemoryStatus result = EEPROM_OK; for (uint16_t i = 0; i < prog->header.shotCount; ++i) { HAL_IWDG_Refresh(&hiwdg); Shot shot; MemoryStatus stat = getShot(prog->shots[i].id, &shot); if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } if (!shot.isExist) { // todo: добавить в запросы для загрузки снимков + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; result = EEPROM_MISSING_ELEMENT; } } @@ -194,19 +208,23 @@ MemoryStatus saveProg(unsigned char number, Program *prog) { if (FLASH_WriteBlock(START_ADR_PROGRAM, number, (uint8_t*) prog, totalSize, PROGRAM_BLOCKSIZE) != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } return result; } MemoryStatus getProg(unsigned char number, Program *prog) { + uint8_t attempts = EEPROM_REED_RETRY; retry: memset(prog, 0x00, sizeof(Program)); if (FLASH_ReadBlock(START_ADR_PROGRAM, number, (uint8_t*) prog, PROGRAM_BLOCKSIZE) != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } if (!prog->header.shotCount) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_MISSING_ELEMENT; } @@ -214,24 +232,29 @@ MemoryStatus getProg(unsigned char number, Program *prog) { } MemoryStatus delProg(unsigned char number) { + uint8_t attempts = EEPROM_REED_RETRY; retry: if (FLASH_DelBlock(START_ADR_PROGRAM, number, PROGRAM_BLOCKSIZE) == EEPROM_OK) { return EEPROM_OK; } + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } MemoryStatus saveMacro(unsigned char number, Macro *macro) { + uint8_t attempts = EEPROM_REED_RETRY; retry: MemoryStatus result = EEPROM_OK; for (uint16_t i = 0; i < macro->header.programmCount; ++i) { HAL_IWDG_Refresh(&hiwdg); Program prog; MemoryStatus stat = getProg(macro->programs[i].id, &prog); if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } if (!prog.header.shotCount) { result = EEPROM_MISSING_ELEMENT; + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; // todo: добавить в запросы для загрузки программ } } @@ -241,6 +264,7 @@ MemoryStatus saveMacro(unsigned char number, Macro *macro) { if (FLASH_WriteBlock(START_ADR_MACRO, number, (uint8_t*) macro, totalSize, MACRO_BLOCKSIZE) != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } @@ -248,26 +272,32 @@ MemoryStatus saveMacro(unsigned char number, Macro *macro) { } MemoryStatus getMacro(unsigned char number, Macro *macro) { + uint8_t attempts = EEPROM_REED_RETRY; retry: memset(macro, 0x00, sizeof(Macro)); if (FLASH_ReadBlock(START_ADR_MACRO, number, (uint8_t*) macro, MACRO_BLOCKSIZE) != EEPROM_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } if (!macro->header.programmCount) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_MISSING_ELEMENT; } return EEPROM_OK; } MemoryStatus delMacro(unsigned char number) { + uint8_t attempts = EEPROM_REED_RETRY; retry: if (FLASH_DelBlock(START_ADR_MACRO, number, MACRO_BLOCKSIZE) == EEPROM_OK) { return EEPROM_OK; } + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } MemoryStatus EEPROM_EARSE() { + uint16_t addr = 0; const uint16_t EEPROM_MAX_ADDR = 1024*32; led_PingPong_start(7, 12); @@ -294,7 +324,8 @@ MemoryStatus EEPROM_EARSE() { MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number, uint8_t *writeData, uint16_t dataSize, uint16_t blockSize) { - HAL_StatusTypeDef result; + uint8_t attempts = EEPROM_REED_RETRY; retry: + HAL_StatusTypeDef result; const uint16_t maxWriteSize = 64; // Максимальный размер блока для EEPROM AT24 uint16_t currentAddr = startAddr + (number * blockSize); uint16_t bytesWritten = 0; @@ -324,6 +355,7 @@ MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number, HAL_Delay(1); if (result != HAL_OK) { + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } @@ -337,6 +369,7 @@ MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number, MemoryStatus FLASH_DelBlock(uint16_t startAddr, uint8_t number, uint16_t dataSize) { + uint8_t attempts = EEPROM_REED_RETRY; retry: HAL_StatusTypeDef result; // Проверка на корректность входных данных @@ -360,6 +393,8 @@ MemoryStatus FLASH_DelBlock(uint16_t startAddr, uint8_t number, sizeof(Buf), 10); HAL_Delay(1); if (result != HAL_OK) { + if (--attempts > 0) goto retry; + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } return EEPROM_OK; @@ -367,6 +402,7 @@ MemoryStatus FLASH_DelBlock(uint16_t startAddr, uint8_t number, MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number, uint8_t *readData, uint16_t dataSize) { + uint8_t attempts = EEPROM_REED_RETRY; retry: HAL_StatusTypeDef result; // Проверка на корректность входных данных @@ -396,7 +432,25 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number, HAL_Delay(1); if (result != HAL_OK) { // print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11"); + EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry; return EEPROM_FAIL; } return EEPROM_OK; } + +extern I2C_HandleTypeDef hi2c1; +extern void Error_Handler(void); +void EEPROM_FAIL_HANDLER(){ +// NVIC_SystemReset(); +// return; + + __HAL_RCC_I2C1_FORCE_RESET(); + HAL_Delay(1); + __HAL_RCC_I2C1_RELEASE_RESET(); + HAL_Delay(1); + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + HAL_Delay(1); +}