¿Tendrá un chip SPI EEPROM los mismos problemas con las operaciones de escritura no atómicas que la EEPROM interna de un dsPIC? [duplicar]

3

Hace un tiempo tuve algunos problemas intermitentes con el interno EEPROM de un dsPIC. De vez en cuando, se encontraría un valor en la EEPROM puesto a cero en el encendido. Rastreé el problema hasta que el chip perdió energía después del paso de borrado del ciclo de escritura, pero antes de que se completara la escritura. Se trataba de la sincronización del apagado en relación con la ejecución del firmware, que era (en funcionamiento normal) aleatorio. Resolví esto agregando una sección de búfer a mi EEPROM, para garantizar que se pudiera completar un ciclo de escritura incompleto en la restauración de la energía. Tuve que convertir las escrituras de EEPROM en una operación atómica.

(Para más detalles, mi técnica de almacenamiento en búfer define un área de memoria persistente que consta de tres campos: dirección para escribir, datos para escribir y un indicador LISTO. Una "escritura" consiste en cuatro pasos: escribir en el búfer , establezca el indicador READY, escriba desde el búfer, desactive el indicador READY. En el encendido, verifique el indicador READY. Si está configurado, ejecute lo que haya en el búfer. Esto funcionó bien en la EEPROM interna.)

Ahora estoy usando un dsPIC diferente sin EEPROM interna, y estoy tratando de usar un chip EEPROM externo para almacenar datos persistentes. Me pregunto si debería tener preocupaciones similares. ¿Debería preocuparme que mi chip EEPROM externo se apague durante la mitad de la escritura y la pérdida de datos, y escriba una solución para esto en mi firmware, como hice con la EEPROM interna? ¿O el chip en sí garantiza operaciones de escritura atómica?

    
pregunta Stephen Collings

2 respuestas

2

El chip no puede garantizar escrituras atómicas: si la energía desaparece mientras se escribe (o se borra), no hay nada que pueda hacer al respecto.

Por supuesto, los diseñadores de chips podrían implementar algún tipo de tienda de almacenamiento (como usted lo ha hecho), pero eso agrega costos que otros usuarios no querrán pagar. Además, ¿qué sucede si se corta la alimentación mientras se escribe en el búfer en lugar de en la memoria "real"?

    
respondido por el Martin Thompson
2

Para la recuperación confiable de datos de EEPROM, hay varias cosas que se pueden hacer. Consideremos, por ejemplo, almacenar un valor de contador ocasional en el almacenamiento persistente de la EEPROM. Debe tener en cuenta tanto el problema de pérdida de potencia que estamos discutiendo aquí como las características de resistencia de escritura de la EEPROM serial.

Está bien usar la EEPROM en un modo de lectura / escritura (dado que tiene tiempo para hacerlo) siempre y cuando se asegure de poder asegurar que la resistencia al desgaste de las celdas de memoria no se agote. En la duración del producto. Como por ejemplo, he realizado diseños de productos con EEPROM externa, como 93C46, conectado a un microcontrolador a través de 3 pines de puerto. He usado ciertas ubicaciones en la EEPROM para acumular información como el conteo acumulado o el tiempo total transcurrido. He realizado cálculos utilizando los números de resistencia del 93C46 y he descubierto que si desea asegurarse de que un producto pueda durar 10 años, en promedio puede permitir que la ubicación de la EEPROM se actualice una vez cada 10 minutos.

Teniendo esto en cuenta, normalmente diseño mi software para que el microcontrolador mantenga el conteo actual o el acumulador de tiempo en la RAM local y luego una función de temporizador proporciona una actualización "una vez cada 10 minutos" para copiar las ubicaciones de la RAM en la EEPROM. Para muchas aplicaciones, esta solución simple es más que adecuada, ya que la pérdida ocasional de 10 minutos de acumulación no es particularmente crítica.

Si el mantenimiento del recuento debe ser más crítico, puede organizar que el microcontrolador gestione su propio apagado y forzar una actualización final de las ubicaciones de EEPROM desde las ubicaciones de RAM justo antes de apagarse.

Y si se requiere un mantenimiento aún más crítico, puede hacer que se produzca una interrupción de falla de alimentación de advertencia temprana que permitirá al software forzar una actualización de la EEPROM justo antes de que el microcontrolador pierda su suministro de electrones de sangre.

Ahora hay un tema aún más importante a considerar al usar una EEPROM para mantener contadores no volátiles. Esto se relaciona con la forma en que administra el proceso de mantener un almacenamiento confiable de los acumuladores cuando se apaga la alimentación, tal como está en el proceso de escribir en la EEPROM. He abordado este problema a lo largo de los años, en muchos proyectos, de la siguiente manera:

Tomemos el chip 93C46 como ejemplo. Tiene ubicaciones de 16 bits en él. Normalmente uso 2 ubicaciones y hago que mi acumulador tenga 24 bits y luego calculo un tipo XOR simple de CRC sobre estos tres bytes y lo conecto en el 4to byte de los 32 bits del par de ubicaciones EEPROM. Luego, cuando se escribe la EEPROM, el acumulador + CRC se escribe en la EEPROM en dos lugares diferentes. (I.E. el acumulador se almacena de forma redundante en la EEPROM). También asegúrese de escribir su software para que la escritura de una copia del acumularor + CRC esté completamente escrita antes de que se inicie la otra. También es una buena idea interponer un retraso de algunos milisegundos entre el par de operaciones de escritura.

Luego, en el próximo encendido, cuando inicializo la copia basada en RAM de los acumuladores de EEPROM, uso el siguiente concepto. Leí la primera copia del acumulador + CRC de la EEPROM y verifico el CRC. Si es correcto, utilizo el valor de lectura de los otros 24 bits como el valor para escribir en las ubicaciones de la RAM. Si la verificación de la primera ubicación falla, entonces voy a leer la segunda copia y la verifico. Si está bien, se convierte en el valor conectado a las ubicaciones de la memoria RAM. Si ambos han fallado, aplico un valor predeterminado al contador en la memoria RAM, como cero o el recuento "completo". (El recuento "completo" se aplicaría a los casos en los que la ubicación de EEPROM se esté utilizando para realizar un seguimiento si cuántas veces quedan para permitir que suceda algo ... [por ejemplo, cuántas cajas se permiten antes de que el microcontrolador publique un mantenimiento. solicitud ... etc etc].

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas