Handle EEPROM i2c error

This commit is contained in:
DashyFox 2024-12-01 15:56:31 +03:00
parent c667854e7e
commit 195d6ef021
2 changed files with 58 additions and 1 deletions

View File

@ -29,6 +29,7 @@
#define MEMORY_END (START_ADR_MACRO + (MACRO_BLOCKSIZE*MAX_MACRO_COUNT)) #define MEMORY_END (START_ADR_MACRO + (MACRO_BLOCKSIZE*MAX_MACRO_COUNT))
#define EEPROM_REED_RETRY 3;
typedef enum MemoryStatus { typedef enum MemoryStatus {
EEPROM_FAIL, EEPROM_FAIL,
EEPROM_MISSING_ELEMENT, EEPROM_MISSING_ELEMENT,
@ -147,4 +148,6 @@ MemoryStatus delMacro(unsigned char number);
MemoryStatus saveInfoBlock(); MemoryStatus saveInfoBlock();
MemoryStatus getInfoBlock(); MemoryStatus getInfoBlock();
void EEPROM_FAIL_HANDLER();
#endif /* INC_EEPROM_H_ */ #endif /* INC_EEPROM_H_ */

View File

@ -10,9 +10,11 @@ extern IWDG_HandleTypeDef hiwdg;
//*********************** EEPROM_INIT ********************************// //*********************** EEPROM_INIT ********************************//
MemoryStatus EEPROM_INIT() { MemoryStatus EEPROM_INIT() {
uint8_t attempts = EEPROM_REED_RETRY; retry:
memset(&infoBlock, 0x00, sizeof(infoBlock)); memset(&infoBlock, 0x00, sizeof(infoBlock));
MemoryStatus status = getInfoBlock(&infoBlock); MemoryStatus status = getInfoBlock(&infoBlock);
if (status != EEPROM_OK) { if (status != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
char errorMsg[] = "Error reading InfoBlock from EEPROM\n"; char errorMsg[] = "Error reading InfoBlock from EEPROM\n";
CDC_Transmit_FS((uint8_t*) errorMsg, strlen(errorMsg)); CDC_Transmit_FS((uint8_t*) errorMsg, strlen(errorMsg));
return status; return status;
@ -135,11 +137,13 @@ MemoryStatus saveInfoBlock() {
} }
MemoryStatus getInfoBlock() { MemoryStatus getInfoBlock() {
uint8_t attempts = EEPROM_REED_RETRY; retry:
memset(&infoBlock, 0x00, sizeof(InfoBlock)); memset(&infoBlock, 0x00, sizeof(InfoBlock));
MemoryStatus status = FLASH_ReadBlock(START_ADR_STAT, 0, MemoryStatus status = FLASH_ReadBlock(START_ADR_STAT, 0,
(uint8_t*) &infoBlock, sizeof(InfoBlock)); (uint8_t*) &infoBlock, sizeof(InfoBlock));
if (status != EEPROM_OK) { if (status != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
@ -147,44 +151,54 @@ MemoryStatus getInfoBlock() {
} }
MemoryStatus saveShot(unsigned char number, Shot *shot) { MemoryStatus saveShot(unsigned char number, Shot *shot) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
if (FLASH_WriteBlock(START_ADR_SHOT, number, (uint8_t*) shot, if (FLASH_WriteBlock(START_ADR_SHOT, number, (uint8_t*) shot,
SHOT_BLOCKSIZE, SHOT_BLOCKSIZE) == EEPROM_OK) { SHOT_BLOCKSIZE, SHOT_BLOCKSIZE) == EEPROM_OK) {
return EEPROM_OK; return EEPROM_OK;
} }
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
MemoryStatus getShot(unsigned char number, Shot *shot) { MemoryStatus getShot(unsigned char number, Shot *shot) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
HAL_IWDG_Refresh(&hiwdg); HAL_IWDG_Refresh(&hiwdg);
memset(shot, 0x00, sizeof(Shot)); memset(shot, 0x00, sizeof(Shot));
if (FLASH_ReadBlock(START_ADR_SHOT, number, (uint8_t*) shot, SHOT_BLOCKSIZE) if (FLASH_ReadBlock(START_ADR_SHOT, number, (uint8_t*) shot, SHOT_BLOCKSIZE)
!= EEPROM_OK) { != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
if (!shot->isExist) { if (!shot->isExist) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_MISSING_ELEMENT; return EEPROM_MISSING_ELEMENT;
} }
return EEPROM_OK; return EEPROM_OK;
} }
MemoryStatus delShot(unsigned char number) { MemoryStatus delShot(unsigned char number) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
if (FLASH_DelBlock(START_ADR_SHOT, number, SHOT_BLOCKSIZE) == EEPROM_OK) { if (FLASH_DelBlock(START_ADR_SHOT, number, SHOT_BLOCKSIZE) == EEPROM_OK) {
return EEPROM_OK; return EEPROM_OK;
} }
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
MemoryStatus saveProg(unsigned char number, Program *prog) { MemoryStatus saveProg(unsigned char number, Program *prog) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
MemoryStatus result = EEPROM_OK; MemoryStatus result = EEPROM_OK;
for (uint16_t i = 0; i < prog->header.shotCount; ++i) { for (uint16_t i = 0; i < prog->header.shotCount; ++i) {
HAL_IWDG_Refresh(&hiwdg); HAL_IWDG_Refresh(&hiwdg);
Shot shot; Shot shot;
MemoryStatus stat = getShot(prog->shots[i].id, &shot); MemoryStatus stat = getShot(prog->shots[i].id, &shot);
if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) { if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
if (!shot.isExist) { if (!shot.isExist) {
// todo: добавить в запросы для загрузки снимков // todo: добавить в запросы для загрузки снимков
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
result = EEPROM_MISSING_ELEMENT; 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, if (FLASH_WriteBlock(START_ADR_PROGRAM, number, (uint8_t*) prog, totalSize,
PROGRAM_BLOCKSIZE) != EEPROM_OK) { PROGRAM_BLOCKSIZE) != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
return result; return result;
} }
MemoryStatus getProg(unsigned char number, Program *prog) { MemoryStatus getProg(unsigned char number, Program *prog) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
memset(prog, 0x00, sizeof(Program)); memset(prog, 0x00, sizeof(Program));
if (FLASH_ReadBlock(START_ADR_PROGRAM, number, (uint8_t*) prog, if (FLASH_ReadBlock(START_ADR_PROGRAM, number, (uint8_t*) prog,
PROGRAM_BLOCKSIZE) != EEPROM_OK) { PROGRAM_BLOCKSIZE) != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
if (!prog->header.shotCount) { if (!prog->header.shotCount) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_MISSING_ELEMENT; return EEPROM_MISSING_ELEMENT;
} }
@ -214,24 +232,29 @@ MemoryStatus getProg(unsigned char number, Program *prog) {
} }
MemoryStatus delProg(unsigned char number) { MemoryStatus delProg(unsigned char number) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
if (FLASH_DelBlock(START_ADR_PROGRAM, number, PROGRAM_BLOCKSIZE) if (FLASH_DelBlock(START_ADR_PROGRAM, number, PROGRAM_BLOCKSIZE)
== EEPROM_OK) { == EEPROM_OK) {
return EEPROM_OK; return EEPROM_OK;
} }
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
MemoryStatus saveMacro(unsigned char number, Macro *macro) { MemoryStatus saveMacro(unsigned char number, Macro *macro) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
MemoryStatus result = EEPROM_OK; MemoryStatus result = EEPROM_OK;
for (uint16_t i = 0; i < macro->header.programmCount; ++i) { for (uint16_t i = 0; i < macro->header.programmCount; ++i) {
HAL_IWDG_Refresh(&hiwdg); HAL_IWDG_Refresh(&hiwdg);
Program prog; Program prog;
MemoryStatus stat = getProg(macro->programs[i].id, &prog); MemoryStatus stat = getProg(macro->programs[i].id, &prog);
if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) { if (!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
if (!prog.header.shotCount) { if (!prog.header.shotCount) {
result = EEPROM_MISSING_ELEMENT; result = EEPROM_MISSING_ELEMENT;
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
// todo: добавить в запросы для загрузки программ // todo: добавить в запросы для загрузки программ
} }
} }
@ -241,6 +264,7 @@ MemoryStatus saveMacro(unsigned char number, Macro *macro) {
if (FLASH_WriteBlock(START_ADR_MACRO, number, (uint8_t*) macro, totalSize, if (FLASH_WriteBlock(START_ADR_MACRO, number, (uint8_t*) macro, totalSize,
MACRO_BLOCKSIZE) != EEPROM_OK) { MACRO_BLOCKSIZE) != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
@ -248,26 +272,32 @@ MemoryStatus saveMacro(unsigned char number, Macro *macro) {
} }
MemoryStatus getMacro(unsigned char number, Macro *macro) { MemoryStatus getMacro(unsigned char number, Macro *macro) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
memset(macro, 0x00, sizeof(Macro)); memset(macro, 0x00, sizeof(Macro));
if (FLASH_ReadBlock(START_ADR_MACRO, number, (uint8_t*) macro, if (FLASH_ReadBlock(START_ADR_MACRO, number, (uint8_t*) macro,
MACRO_BLOCKSIZE) != EEPROM_OK) { MACRO_BLOCKSIZE) != EEPROM_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
if (!macro->header.programmCount) { if (!macro->header.programmCount) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_MISSING_ELEMENT; return EEPROM_MISSING_ELEMENT;
} }
return EEPROM_OK; return EEPROM_OK;
} }
MemoryStatus delMacro(unsigned char number) { MemoryStatus delMacro(unsigned char number) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
if (FLASH_DelBlock(START_ADR_MACRO, number, MACRO_BLOCKSIZE) == EEPROM_OK) { if (FLASH_DelBlock(START_ADR_MACRO, number, MACRO_BLOCKSIZE) == EEPROM_OK) {
return EEPROM_OK; return EEPROM_OK;
} }
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
MemoryStatus EEPROM_EARSE() { MemoryStatus EEPROM_EARSE() {
uint16_t addr = 0; uint16_t addr = 0;
const uint16_t EEPROM_MAX_ADDR = 1024*32; const uint16_t EEPROM_MAX_ADDR = 1024*32;
led_PingPong_start(7, 12); led_PingPong_start(7, 12);
@ -294,7 +324,8 @@ MemoryStatus EEPROM_EARSE() {
MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number, MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number,
uint8_t *writeData, uint16_t dataSize, uint16_t blockSize) { 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 const uint16_t maxWriteSize = 64; // Максимальный размер блока для EEPROM AT24
uint16_t currentAddr = startAddr + (number * blockSize); uint16_t currentAddr = startAddr + (number * blockSize);
uint16_t bytesWritten = 0; uint16_t bytesWritten = 0;
@ -324,6 +355,7 @@ MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number,
HAL_Delay(1); HAL_Delay(1);
if (result != HAL_OK) { if (result != HAL_OK) {
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; 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, MemoryStatus FLASH_DelBlock(uint16_t startAddr, uint8_t number,
uint16_t dataSize) { uint16_t dataSize) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
HAL_StatusTypeDef result; HAL_StatusTypeDef result;
// Проверка на корректность входных данных // Проверка на корректность входных данных
@ -360,6 +393,8 @@ MemoryStatus FLASH_DelBlock(uint16_t startAddr, uint8_t number,
sizeof(Buf), 10); sizeof(Buf), 10);
HAL_Delay(1); HAL_Delay(1);
if (result != HAL_OK) { if (result != HAL_OK) {
if (--attempts > 0) goto retry;
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
return EEPROM_OK; 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, MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number,
uint8_t *readData, uint16_t dataSize) { uint8_t *readData, uint16_t dataSize) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
HAL_StatusTypeDef result; HAL_StatusTypeDef result;
// Проверка на корректность входных данных // Проверка на корректность входных данных
@ -396,7 +432,25 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number,
HAL_Delay(1); HAL_Delay(1);
if (result != HAL_OK) { if (result != HAL_OK) {
// print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11"); // print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
EEPROM_FAIL_HANDLER(); if (--attempts > 0) goto retry;
return EEPROM_FAIL; return EEPROM_FAIL;
} }
return EEPROM_OK; 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);
}