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 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_ */
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user