Escribir áreas no utilizadas de una página en un flash NAND

0

Estoy trabajando en un proyecto basado en el ESP32 que utiliza un chip NAND de la familia GD5F1 (enlace a la hoja de datos) . Lo siento por la pregunta larga, pero está un poco complicada y me está volviendo loco durante la última semana.

Logré escribir de forma coherente y sin problemas durante mucho tiempo. Ahora, tuve una idea sobre cómo firmar algunas páginas después de un cierto proceso, así que puedo hacer un seguimiento de las páginas procesadas y, en caso de pérdida de energía, reiniciar desde la primera página sin procesar.

Como tengo un poco de memoria adicional en cada página, pensé, "por qué no agregar un cierto patrón, por ejemplo, 0x11223344, en la última 4B, ya que siempre son 0xFFFFFFFF". Que yo sepa, y en base a algunas pruebas preliminares, puedo escribir en una página que contiene datos. Si el sector de la página que estoy escribiendo sigue siendo 0xFF, obtengo lo que quiero y si no lo es, obtengo el AND de lo que quería escribir y lo que había antes. Hasta ahora todo bien, y todo funcionando como se esperaba.

Como dije, hice algunas pruebas y todas funcionaron como se esperaba, pero ahora, en mi aplicación, el comportamiento es muy errático. En mi aplicación, uso la primera página de la NAND para almacenar algunos metadatos (60B) y luego escribo un número variable de páginas con 2016B (el tamaño de la página es 2048B). Cuando trato de escribir algo en la página de cabecera, me escribo la basura si escribo en una posición inferior a 2016, y lo que quería obtener si escribo después de la marca 2016B.

Si cambio la cantidad de datos en las páginas 1 y en adelante, digamos 1500B, y luego intento escribir en la página de metadatos, obtengo basura antes del 1500B y lo que sea que quisiera escribir después del 1500B.

Estoy realmente desconcertado por este comportamiento. ¿Alguien puede arrojar algo de luz?

La prueba más relevante que he hecho hasta ahora es escribir 4 bytes en los primeros 4 bloques (256 páginas) en la posición 0, luego repetir en la posición 4, 8, ... 2048. Resultado: todas las páginas son escrito correctamente, lo que demuestra que puedo escribir en una página siempre que su contenido sea 1. Intentado también con otros tamaños, no hay problema alguno en ir y venir escribiendo en áreas no utilizadas del flash.

Lo que no funciona: escriba 60B en la página 0, luego escriba 2016B en las siguientes páginas, e intente escribir nuevamente en la página 0, en cualquier ubicación < de 2016. No hay otras referencias en mi código a ese 2016 que no sean los comandos "escribir 2016B".

El código que estoy usando es una gran parte dividida en varias bibliotecas. Creo que tomará bastante tiempo revisar. Es un problema bastante complejo. Estoy luchando incluso para intentar explicarlo, así que busco más ideas de cosas que intentar que alguien que audita mi código.

¡Gracias!

    
pregunta Joel Santos Rico

0 respuestas

Lea otras preguntas en las etiquetas