mirror of
https://github.com/DashyFox/StackSport.git
synced 2025-12-16 09:19:53 +00:00
EEPROM write fix
This commit is contained in:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user