Parece que está desgastando la EEPROM. Todas estas células de memoria de puerta flotante tienen un número finito de veces que pueden ser escritas y borradas antes de que se dañen irremediablemente. Comprueba la hoja de datos. Debería indicar los valores mínimos de "vida útil" garantizados para las escrituras y los borrados.
La mayoría de las EEPROM puras están preparadas para realizar más de 10.000 operaciones de este tipo. Sin embargo, eso es lo que aparentemente está haciendo su código cada vez . Y, especialmente durante el desarrollo y la depuración, es muy posible que algo se haya ejecutado en un bucle y haya realizado estas operaciones muchas veces.
Tu EEPROM está tostada, acabada, desgastada. Si la sustituyes por un nuevo chip y el problema desaparece (temporalmente), entonces es definitivamente lo que ha ocurrido.
En general, si se requiere una actualización frecuente de los datos no volátiles, hay que hacer algo más que conectar a ciegas una EEPROM. La primera estrategia es cambiar la arquitectura para que el estado no volátil no tenga que actualizarse tan a menudo. Si eso es imposible, entonces hay que vivir con la vida útil limitada o utilizar una tecnología diferente.
Otra cosa que hay que mirar es cómo exactamente el firmware está escribiendo en la EEPROM. Estas cosas suelen tener "páginas" que se borran eléctricamente o se escriben a la vez. A veces es posible escribir bytes individuales, pero sigue contando como un evento para toda la página.
Por lo tanto, el firmware debe ser inteligente en cuanto a la forma en que se realizan las escrituras. Suelo crear rutinas de interfaz que permiten leer o escribir bytes individuales de forma aleatoria. Sin embargo, por debajo realmente almacenan en caché una página entera. Las escrituras no van a la EEPROM física hasta que se necesite una página diferente o hasta que se llame a la rutina FLUSH explícita. A veces la rutina FLUSH es llamada automáticamente por un temporizador.
Sin embargo, en todos los casos no se hace una escritura física cuando no se está cambiando ningún valor. Mantengo un bit "sucio" que indica si la página en caché ha sido cambiada desde que se leyó de la EEPROM. Cuando se va a una página diferente, no se hace ninguna escritura si la caché actual no está sucia. También hay una lógica para comprobar si las escrituras de bytes individuales no cambian el valor de la caché. En ese caso, el indicador de suciedad no se activa.
Unas rutinas adecuadas de acceso a la EEPROM de bajo nivel pueden ayudar, pero la aplicación también tiene que ser consciente de las limitaciones de la memoria no volátil. Debe intentar evitar, por ejemplo, saltar por todo el espacio de direcciones escribiendo pequeños números de bytes. Si tienes que hacer una escritura grande, ten cuidado de hacerla secuencialmente.
Por supuesto, no se puede escribir un nuevo valor cada segundo, por ejemplo, y esperar que un dispositivo de 100.000 escrituras dure más de 28 horas. Incluso un dispositivo de 1.000.000 de escrituras no duraría ni 12 días en este caso.