From f7c0d4149b163dc3e8ae984f4c943eccb3d19e7f Mon Sep 17 00:00:00 2001 From: Krzysiek Egzmont Date: Fri, 20 Oct 2023 12:01:06 +0200 Subject: [PATCH] Reduce EEPROM wear, don't check if changed before write. --- driver/eeprom.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/driver/eeprom.c b/driver/eeprom.c index 606e4c6..a22adfb 100644 --- a/driver/eeprom.c +++ b/driver/eeprom.c @@ -14,6 +14,9 @@ * limitations under the License. */ +#include +#include + #include "driver/eeprom.h" #include "driver/i2c.h" #include "driver/system.h" @@ -38,16 +41,22 @@ void EEPROM_ReadBuffer(uint16_t Address, void *pBuffer, uint8_t Size) void EEPROM_WriteBuffer(uint16_t Address, const void *pBuffer) { - I2C_Start(); + if (pBuffer == NULL || Address >= 0x2000) + return; - I2C_Write(0xA0); - I2C_Write((Address >> 8) & 0xFF); - I2C_Write((Address >> 0) & 0xFF); + uint8_t buffer[8]; + EEPROM_ReadBuffer(Address, buffer, 8); + if (memcmp(pBuffer, buffer, 8) != 0) + { + I2C_Start(); + I2C_Write(0xA0); + I2C_Write((Address >> 8) & 0xFF); + I2C_Write((Address >> 0) & 0xFF); + I2C_WriteBuffer(pBuffer, 8); + I2C_Stop(); + } - I2C_WriteBuffer(pBuffer, 8); - - I2C_Stop(); - - SYSTEM_DelayMs(10); + // give the EEPROM time to burn the data in (apparently takes 5ms) + SYSTEM_DelayMs(8); }