EEPROM write fix

This commit is contained in:
2024-10-09 15:10:28 +03:00
parent 08b99d8ec2
commit 4506f53d95
3 changed files with 195 additions and 93 deletions

View File

@ -188,7 +188,7 @@ MemoryStatus saveProg(unsigned char number, Program *prog) {
result = EEPROM_MISSING_ELEMENT;
}
}
HAL_IWDG_Refresh(&hiwdg);
uint16_t totalSize = sizeof(ProgramHeader)
+ sizeof(ProgramShot) * prog->header.shotCount;
@ -293,40 +293,48 @@ 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 *writeData, uint16_t dataSize, uint16_t blockSize) {
HAL_StatusTypeDef result;
const uint16_t maxWriteSize = 64; // Максимальный размер блока для EEPROM AT24
uint16_t currentAddr = startAddr + (number * blockSize);
uint16_t bytesWritten = 0;
// Проверка на корректность входных данных
if ((startAddr == START_ADR_SHOT && number >= MAX_SHOT_COUNT)
|| (startAddr == START_ADR_PROGRAM && number >= MAX_PROGRAM_COUNT)
|| (startAddr == START_ADR_MACRO && number >= MAX_MACRO_COUNT)) {
return EEPROM_OUT_OF_RANGE;
}
// Проверка на корректность входных данных
if ((startAddr == START_ADR_SHOT && number >= MAX_SHOT_COUNT) ||
(startAddr == START_ADR_PROGRAM && number >= MAX_PROGRAM_COUNT) ||
(startAddr == START_ADR_MACRO && number >= MAX_MACRO_COUNT)) {
return EEPROM_OUT_OF_RANGE;
}
uint16_t blockAddr16 = (uint16_t) (startAddr
+ (uint16_t) (number * blockSize));
uint8_t blockAddr[2] = { HIBYTE(blockAddr16), LOBYTE(blockAddr16) };
while (bytesWritten < dataSize) {
uint16_t chunkSize = (dataSize - bytesWritten > maxWriteSize) ? maxWriteSize : (dataSize - bytesWritten);
uint16_t blockAddr16 = currentAddr;
uint8_t blockAddr[2] = { HIBYTE(blockAddr16), LOBYTE(blockAddr16) };
unsigned char Buf[dataSize + 2];
memset(Buf, 0x00, sizeof(Buf));
Buf[0] = blockAddr[0];
Buf[1] = blockAddr[1];
unsigned char Buf[chunkSize + 2];
memset(Buf, 0x00, sizeof(Buf));
Buf[0] = blockAddr[0];
Buf[1] = blockAddr[1];
for (unsigned char i = 0; i < dataSize; i++)
Buf[i + 2] = writeData[i];
for (uint16_t i = 0; i < chunkSize; i++) {
Buf[i + 2] = writeData[bytesWritten + i];
}
result = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), Buf,
(dataSize + 2), 10);
// print("Written ");
// printNumber(dataSize);
// print(" bytes\n");
HAL_Delay(1);
if (result != HAL_OK) {
return EEPROM_FAIL;
}
return EEPROM_OK;
result = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), Buf, (chunkSize + 2), 10);
HAL_Delay(1);
if (result != HAL_OK) {
return EEPROM_FAIL;
}
bytesWritten += chunkSize;
currentAddr += chunkSize;
}
return EEPROM_OK;
}
MemoryStatus FLASH_DelBlock(uint16_t startAddr, uint8_t number,
uint16_t dataSize) {
HAL_StatusTypeDef result;
@ -365,7 +373,7 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number,
if ((startAddr == START_ADR_SHOT && number > MAX_SHOT_COUNT)
|| (startAddr == START_ADR_PROGRAM && number > MAX_PROGRAM_COUNT)
|| (startAddr == START_ADR_MACRO && number > MAX_MACRO_COUNT)) {
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
// print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
return EEPROM_OUT_OF_RANGE;
}
@ -381,13 +389,13 @@ MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number,
result = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1) | 1, readData,
dataSize, 10);
print("FLASH_ReadBlock: ");
printNumber(blockAddr16);
// print("FLASH_ReadBlock: ");
// printNumber(blockAddr16);
// print("\n");
HAL_Delay(1);
if (result != HAL_OK) {
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
// print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11");
return EEPROM_FAIL;
}
return EEPROM_OK;