4 votos

Lectura y escritura de EEPROM

Se sabe que los ciclos de lectura y escritura de la EEPROM son limitados. Supongamos que escribo alguna información importante en la EEPROM y la leo después de apagarla y encenderla. Supongamos que en algún momento la EEPROM falla, ¿cómo saber esta condición? ¿Cuáles son las comprobaciones que puedo hacer? Otra pregunta es comprobar un byte de La comprobación de un byte de la memoria EEPROM, como la escritura de un valor conocido y la lectura del mismo valor, es equivalente a la comprobación de toda la memoria EEPROM, digamos 4K.

5voto

Nils Pipenbrinck Puntos 1718

Existen varias estrategias para detectar estos fallos.

Una simple funciona e incluso atrapa los casos en los que tu dispositivo se apaga durante una escritura:

Digamos que tienes un bloque de n bytes que quieres escribir:

 [ xx xx xx xx xx xx ]

En lugar de escribir simplemente ese bloque, lo encapsulas con dos contadores y una suma de comprobación (crc, por ejemplo), así:

 [ counter1 xx xx xx xx xx xx checksum counter2]

Escriba el algoritmo:

Antes de escribir los datos, lea primero el valor antiguo del contador1:

  a = eeprom_read_read (counter1_offset)

Ahora sobrescribes los datos con contadores incrementados y una suma de comprobación:

  eeprom_write(counter1_offset, a+1);
  eeprom_write(data_offset, data);
  eeprom_write(checksum_offset, calc_checksum...);
  eeprom_write(counter2_offset, a+1);

Lea el algoritmo:

Si quieres acceder a tus datos en la eeprom, lee siempre los contadores y la suma de comprobación junto con los datos. Si el contador1 difiere del contador2 es probable que haya habido un fallo de alimentación durante la operación de escritura. Si los contadores son iguales pero la suma de comprobación no coincide, tienes una celda de eeprom mala.

0 votos

Este es un algoritmo impresionante para implementar.

0 votos

@rajesh Sí. Simple y efectivo.

0 votos

Si estoy de acuerdo y puedes por favor comentar mi segunda pregunta que si una celda de la eeprom es buena significa que la eeprom completa está bien.

2voto

Bernd Puntos 61

Durante años he implementado el almacenamiento de pequeños conjuntos de datos en EEPROM (la mayoría de las veces del tipo serie con una interfaz SPI o I2C) almacenando dos copias de los datos. Cada copia tiene un CRC de 16 bits. Las dos copias se almacenan en la EEPROM de forma secuencial, de manera que si el proceso de actualización del almacenamiento se interrumpe (pérdida de energía o reinicio accidental o inesperado), sólo una de las dos copias se ve afectada.

Al encenderlo se leen ambas copias de los datos y se comprueban los CRC. Si el CRC de la primera copia es correcto, se utiliza como dato más reciente. Si el CRC de la primera copia es malo, recurre a la segunda copia si su CRC es correcto. En casi todos los casos, ésta será la copia almacenada anteriormente del conjunto de datos. Si el CRC del segundo conjunto de datos es malo, hay que recurrir a la configuración de todos los parámetros del conjunto de datos a los valores por defecto.

La escritura de la EEPROM en serie puede llevar mucho tiempo, por lo que está más expuesta a la posibilidad de interrupción. Así que llevo el algoritmo anterior un paso más allá y si ambas copias del conjunto de datos tienen un buen CRC y si el contenido de ambos es el mismo entonces mantengo una copia del conjunto de datos en la RAM del procesador. A la hora de actualizar el conjunto de datos cuando se han realizado cambios, comparo la nueva imagen con la copia almacenada en la RAM byte a byte y sólo almaceno aquellos bytes que realmente cambian. Esto acelera significativamente el proceso porque típicamente sólo unos pocos bytes a la vez están cambiando cuando el conjunto de datos es algo así como un almacén de parámetros.

Si se trabaja con una EEPROM en serie, es una buena idea actualizar los datos cuidadosamente en los "límites de tamaño de página" internos del chip, ya que se puede eliminar el típico tiempo de escritura de 10 mseg para cada byte, repartiendo ese tiempo entre múltiples bytes hasta el tamaño de la página. En los últimos años he cambiado a utilizar la tecnología FRAM en serie en lugar de EEPROMs en serie porque esta tecnología no tiene la propiedad de desgaste como EEPROM. La FRAM también tiene la hermosa propiedad de que la escritura y la lectura operan a toda la velocidad de la interfaz serial sin necesidad de tener esa larga penalización de 10mseg de tiempo de escritura. Por supuesto, las piezas cuestan más, pero esto puede ser una gran ventaja.

Tres cosas más a tener en cuenta sobre el almacenamiento de conjuntos de datos en EEPROM (o FRAM).

  1. Es un hecho que el software embebido cambia continuamente y se pueden añadir y quitar parámetros al conjunto de datos. Dado que el conjunto de datos almacenados está empaquetado en binario, puede parecer que tiene el CRC correcto aunque se haya utilizado una versión de software diferente para escribir los parámetros que la versión de software actual actualizada que está leyendo el conjunto de parámetros. Este problema se resuelve añadiendo un número de versión de software a su código y almacenando ese número en el conjunto de datos junto con los demás parámetros. En el momento de leer los datos, el número de versión almacenado se compara con el número de versión del software actual. Si es diferente, el software sabe que debe aplicar los valores predeterminados a todos los miembros del conjunto de datos para crear un conjunto de datos nuevo y válido en lugar de utilizar los datos defectuosos.
  2. Es una buena idea comparar los parámetros leídos de un conjunto de datos almacenados con un conjunto de criterios esperados. Para los tipos de datos numéricos, compruebe el rango de cada valor para asegurarse de que son buenos. En el caso de las cadenas, compruebe las longitudes y que los caracteres de las cadenas almacenadas están dentro del rango del conjunto de códigos que se está utilizando. Si algunos parámetros no son válidos, es conveniente declarar el conjunto de datos leído como no válido y aplicar los valores por defecto a todo.
  3. Puede ser una buena idea mantener un parámetro en el conjunto de datos que cuente el número de veces que una u otra de las copias del conjunto de datos se lee con un error CRC. Si este número se eleva a un cierto nivel, querrá alertar al usuario de que la EEPROM puede estar desgastada y necesita ser reemplazada. Alternativamente, puedes mover el almacenamiento del conjunto de datos a otra parte de la EEPROM para que empieces con un nuevo conjunto de celdas sin usar. Tenga en cuenta que la FRAM no necesita esto ya que no se desgasta de la misma manera que la EEPROM. Además, si evitas escribir en la EEPROM con demasiada frecuencia, por ejemplo limitando las escrituras a una vez cada 15 minutos aproximadamente, las especificaciones de vida útil de la EEPROM te permitirán utilizar el dispositivo de almacenamiento durante 15 o 20 años sin tener que preocuparte por el fenómeno del desgaste. De todos modos, la mayoría de los dispositivos electrónicos no son aplicables después de ese número de años.

0 votos

"He cambiado a la tecnología FRAM en serie en lugar de EEPROMs en serie porque esta tecnología no tiene la propiedad de desgaste como EEPROM", "Tenga en cuenta que la FRAM no necesita esto ya que no se desgasta de la misma manera que EEPROM" - ¿No tienen las FRAM un ciclo de resistencia? (Sólo las SRAM no tienen desgaste, ¿verdad? Referencia )

0 votos

@AkshayImmanuelD - Acabo de decir que las FRAM son diferentes a las EEPROM seriales. Las piezas FRAM que utilizo están especificadas con una retención de datos típica de 151 años y una resistencia de 100 billones de ciclos de lectura/escritura. Vea la hoja de datos aquí: mouser.com/ds/2/100/

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X