Corrupción de flash serial extraña

0

Estoy experimentando un problema muy típico con la corrupción de datos en un chip flash de una manera no tan típica. Estoy usando el chip flash serie M25P16 de 16Mb de Micron para registrar datos históricos en mi dispositivo a través de SPI.

El registro funciona maravillosamente con un error conocido, y eso es cuando la alimentación del dispositivo se enciende durante una operación de Flash.

Esperaba que se corrompiera el último bloque de datos escrito en Flash, ¡pero en realidad parece que todo el Sector se corrompe!

Esto es lo que quiero decir con corrupto, cada bloque de datos que escribo en Flash recibe una suma de comprobación, si se lee un bloque de datos dañado, todos los datos son correctos EXCEPTO la palabra baja de la suma de comprobación . La palabra baja de la suma de comprobación siempre devuelve 0x0000.

Por ejemplo, una suma de comprobación de 0xA533037E escrita en flash se leerá como 0xA5330000.

Ahora, para la parte extraña, si este problema está ocurriendo y NUEVOS DATOS está escrito para parpadear, ¡sucede lo mismo con los nuevos datos!

La forma en que he estado resolviendo este problema es borrando todos los datos y volviendo a empezar. Esto parece resolver el problema de una manera no tan buena.

Mi pregunta es esta: para Serial Flash, si se produce una corrupción, ¿cree que es el sector completo el que se daña o solo un punto de datos? ¿Parece esto un comportamiento "típico" para valores corruptos?

Cualquier entrada es apreciada :)

Addendum Aquí está el enlace a la hoja de datos para el flash:

Micron - 16Mb Serial NOR Flash

    
pregunta R. Johnson

1 respuesta

2

Para escribir en la memoria flash, primero se debe borrar una página completa de flash, que establece todos los bits en 1, y luego los bits individuales se establecen en 0. El M25P16 (probablemente) carga la página para escribir La RAM, o alguna otra memoria volátil, voltea los bits de acuerdo con el comando del programa y luego vuelve a escribir esa página en la memoria.

Cuando extraiga el poder durante la programación, es muy probable que corrompa otros "bloques de datos" (como ha definido de 64 bytes). Esto se debe a que el tamaño de página en el M25P16 es de 256 bytes. Cuando escribe en un bloque de datos, también está causando que se escriban otros 3 bloques de datos. El M25P16 se encarga de los detalles de programación de bajo nivel para usted, por lo que otros datos en la página no se pierden. El poder de Yanking cuando el M25P16 está programando una página hará datos corruptos en la página, lo que incluirá otros bloques de datos.

¿Moral de la historia? Al flash no le gusta perder poder mientras está escribiendo. Una forma de reducir el riesgo de pérdida de energía durante la programación es colocar unos cuantos condensadores robustos (tal vez incluso una tapa superior) en el riel de alimentación del microcontrolador y M25P16. Incluso si alguien tira de la fuerza, las tapas mantendrán al micro y al M25 funcionando el tiempo suficiente para terminar lo que están haciendo.

    
respondido por el CHendrix

Lea otras preguntas en las etiquetas