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 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_ */

View File

@ -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,6 +324,7 @@ MemoryStatus EEPROM_EARSE() {
MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number,
uint8_t *writeData, uint16_t dataSize, uint16_t blockSize) {
uint8_t attempts = EEPROM_REED_RETRY; retry:
HAL_StatusTypeDef result;
const uint16_t maxWriteSize = 64; // Максимальный размер блока для EEPROM AT24
uint16_t currentAddr = startAddr + (number * blockSize);
@ -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);
}