mirror of
https://github.com/DashyFox/StackSport.git
synced 2025-05-04 15:20:16 +00:00
Handle EEPROM i2c error
This commit is contained in:
parent
c667854e7e
commit
195d6ef021
@ -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_ */
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user