Tiempo de ciclo de escritura de EEPROM y resistencia de ciclo de escritura

Tengo una aplicación de software integrada que copia un búfer de la RAM a la EEPROM. En este caso, el dispositivo EPROM es un 28C010 (128K x 8). La copia se realiza a intervalos no regulares, generalmente en bloques de varios bytes. Asumiría que otras EEPROM (no todas) se comportan como esta, pero esto es con lo que tengo que trabajar.

Las respuestas a mis preguntas a continuación ayudarán a determinar la estrategia para guardar información persistente mientras se realiza el procesamiento en tiempo real.

Se puede acceder a la EEPROM al igual que la RAM con algunas excepciones para escribir:

  • ESCRITURA DE BYTE: se pueden escribir bytes individuales y la finalización del ciclo de escritura se puede determinar mediante sondeo
  • ESCRITURA DE PÁGINA: se pueden escribir bloques contiguos de bytes para bytes dentro del mismo bloque de 128 bytes y, siempre que cada escritura de byte sea seguida por otra escritura de byte en el mismo bloque dentro de 150 microsegundos, entonces se obtienen los beneficios de ESCRITURA DE PÁGINA . El beneficio es que se puede completar la escritura de la página sondeando al final de la escritura del bloque. (No hay retrasos entre las escrituras de bytes, y la finalización del ciclo de escritura de la página se internaliza en la EEPROM).
  • Duración del ciclo de escritura: Hay un límite de 10.000 ciclos de escritura. No se dan otros detalles.

En ambos casos, el sondeo se realiza leyendo el último byte escrito hasta que el valor devuelto sea igual al valor que se escribió.

Hay otras formas de determinar que una escritura está completa, incluso esperar el tiempo de ciclo de escritura de página máximo especificado, que es de 10 milisegundos.

Tengo la intención de utilizar el sondeo, con la expectativa de que determinará la finalización antes de los 10 milisegundos del ciclo de escritura de página.

Tengo dos preguntas:

  1. ¿Puedo esperar que mi tiempo de sondeo en el modo Escritura de página sea proporcional a la cantidad de bytes escritos (o puedo ver algún beneficio al escribir unos pocos bytes en lugar de una página completa)?
  2. ¿Cómo funciona la resistencia del ciclo de escritura? ¿Se aplica a cada byte solo o a dos de una página completa (oa toda la memoria como un todo)? En otras palabras, si escribo una página parcial en un ciclo de escritura de página y luego escribo el resto de la página en otro ciclo de escritura de página, ¿cómo afecta eso a la resistencia de mi ciclo de escritura? ¿Cuenta como dos ciclos de escritura? ¿Alguien puede dar más detalles sobre esto?

Dado que la EEPROM completa internamente las escrituras de página en la EEPROM después de la última escritura en una página, puedo realizar las escrituras en segundo plano en la mayoría de las circunstancias.

El tamaño de los bloques que se copian variará un poco cada vez y no se puede esperar que sean múltiplos del tamaño de la página. Se pueden hacer para que sean tan pequeños como poco más de un tamaño de página o más de varias páginas, según un umbral que se determinará más adelante.

Cosas como esta son la razón por la que uso NVRAM o SRAM respaldada por batería.
Comprendido. Pero, como dije, esto es con lo que tengo que trabajar. Es un diseño existente, y eso no es una opción.

Respuestas (2)

Lo que describes es típico de los chips EEPROM. El número mínimo de bytes que tiene que borrar a la vez, el máximo que puede escribir a la vez y el mínimo que puede escribir a la vez pueden ser diferentes.

La forma en que generalmente trato con esto es tener un módulo que virtualice lecturas y escrituras en la EEPROM. Este módulo presenta una interfaz de procedimiento para leer y escribir bytes individuales.

Por cierto, es una buena idea que este módulo use una dirección más amplia que la que realmente requiere la EEPROM. No es nada raro que los proyectos evolucionen y reemplacen el chip EEPROM por uno más grande más tarde. Si solo usó una dirección de 16 bits y pasó de 64 kB a una EEPROM más grande, debe verificar y posiblemente reescribir un montón de código de la aplicación que ahora tiene que usar al menos 3 bytes de dirección cuando se escribió para 2. Por lo general, uso Para empezar, direcciones de 24 bits en una máquina de 8 bits y direcciones de 32 bits en una máquina de 16 bits, a menos que exista una buena razón específica del proyecto para no hacerlo. Eso también le permite crear módulos para varias EEPROM diferentes que presentan la misma interfaz de procedimiento de lectura/escritura de un solo byte.

De todos modos, el módulo EEPROM mantiene un búfer RAM de una página de borrado (normalmente son más grandes o del mismo tamaño que las páginas de escritura). El módulo realiza un seguimiento de qué bloque de EEPROM, si lo hay, se encuentra actualmente en el búfer de RAM y si se han realizado cambios (bandera sucia) que aún no se han escrito en la EEPROM física. Las lecturas y escrituras de la aplicación funcionan en este búfer de RAM y no necesariamente provocan la lectura/escritura directamente en la EEPROM. Se proporciona una rutina FLUSH para que la aplicación pueda obligar a que los datos almacenados en caché se escriban en la EEPROM. En algunos casos, usé un temporizador para llamar a la rutina de descarga automáticamente en un tiempo fijo después de la última escritura.

Cuando la aplicación accede a un byte que no está en el búfer de RAM, primero se lee el bloque que contiene el byte de la EEPROM. Si el búfer está sucio, siempre se vacía antes de que se escriba un bloque EEPROM diferente.

Este esquema es generalmente más rápido y también minimiza el número real de escrituras en la EEPROM. El indicador sucio solo se establece si los datos nuevos son diferentes de los datos antiguos. Si la aplicación escribe los mismos datos varias veces, la EEPROM se escribe como máximo una vez.

Este esquema también usa la EEPROM de manera más eficiente ya que los bloques completos se borran y escriben a la vez. Esto se hace una vez por bloque, independientemente de cuánta actividad de escritura haya dentro del bloque antes de que la aplicación aborde un byte en un bloque diferente. Para la mayoría de las EEPROM, escribir un bloque completo o escribir un byte dentro de un bloque cuentan lo mismo en términos de vida útil. Para maximizar la vida útil de la EEPROM, desea escribir con la menor frecuencia posible y borrar y escribir bloques completos cuando lo haga.

Esto me da algunas ideas, pero no creo que este dispositivo en particular use su búfer de RAM como usted describe, según cómo leí la hoja de datos. Si no se produce una nueva escritura de bytes en la misma página dentro de 150 uS, la operación de escritura de página se completa, tal como la leo, incluso si solo se escribió parte de una página. (EN este caso, el software debe tener esto en cuenta antes de continuar con más accesos, hasta que se complete la escritura). Podría externalizar la función de búfer de RAM que acaba de describir en SW para que solo escriba páginas completas (es un búfer de registro secuencial ) hasta que llegue el momento de cerrarlo.
@Jim: nunca mencioné nada sobre un búfer en este dispositivo. Como dije, el módulo que virtualiza el acceso a la EEPROM mantiene internamente un búfer RAM de una página.
ah Bueno. Buena sugerencia, entonces. Es posible que tenga otros problemas con ese enfoque, pero veré si puedo encontrar una especie de híbrido. (Los últimos bytes de la ROM siempre deben ser un marcador EOF, en caso de interrupción del suministro eléctrico, a menos que se nos ocurran otras ideas al respecto. El llenado previo con marcadores EOF puede ser una respuesta, pero a costa de la duración del ciclo de escritura).

En algunos diseños de chips, el tiempo de escritura de páginas será esencialmente el mismo que el tiempo de escritura de bytes, ya que un chip que puede estar organizado como 128Kx8 externamente puede ser 1024x1024 internamente y, por lo tanto, tener una matriz EEPROM que puede escribir hasta 1024 bits. (128 bytes) a la vez. En otros diseños de chips, cada escritura de página se realizará como una secuencia de operaciones más pequeñas (posiblemente escrituras de bytes individuales), pero el rendimiento aún puede ser más rápido que escribir bytes individuales si los chips usan bombas de carga para suministrar corriente de escritura; a menudo, tales bombas de carga deben encenderse antes de cada operación de escritura y apagarse después; si un chip tarda, por ejemplo, 1 ms en encenderse y 1 ms en escribir un byte, escribir un byte tardaría 2 ms,

En general, espero que escribir muchos bytes en una página lleve más tiempo que escribir uno, pero será mucho más rápido que escribir todos esos bytes individualmente. Incluso en un chip que tiene un bus de ancho completo entre los búferes de página y la matriz de memoria, es posible que la bomba de carga no pueda suministrar suficiente corriente para escribir 1024 bits tan rápido como podría escribir uno. Además, algunos chips pueden incluir circuitos de enclavamiento para limitar el número de escrituras de bits simultáneas; cada vez que se completa una escritura de bits, el chip podría pasar a procesar otra que aún no se había iniciado.