Problema con STM32 y memoria flash M25P16.

Hola amig@s.
Tengo un grave problema con una placa de desarrollo de esas chinas, donde su documentacion y ejemplos son maravillos :cry:
A base de destripar las fuentes, he conseguido bastantes cosas y mi proyecto esta muy adelantado, pero, ahora estoy estancado mas de un mes.
El problema está la memoria externa flash M25P16 que incorpora.
Estoy usando las librerias que trae keil para este chip y todo funciona perfectamente menos cuando cambio de direccion de escritura.
para probar, he hecho un sencillo programa:
se llena un array con datos conocidos, se vuelca el array en la M25P16, se limpia el array, se lee la M25P16 en el array y si los datos son distintos a los conocidos, da error.
Funciona bien, siempre y cuando no cambie de direccion de destino en la M25P16. Ahora bien. Si al principio del programa borro la flash con SPI_FLASH_BulkErase();, siempre funciona bien, sea cual sea la direccion de destino.
pero...¿porque?
gracias!!!!
 
ese es el comportamiento normal de una Flash. Si un bit determinado esta en 1 siempre lo puedes cambiar a cero mediante una escritura a una direccion especifica. Pero es imposible cambiara el valor de un bit de cero a 1 mediante escritura. La unica manera de lograr poner todos los bits en 1 es un borrado de bloque.
 
gracias por tu respuesta. no tenia ni idea de este comportamiento. Entonces, la unica forma es borrar el sector, pero un sector es muy grande; estaré perdiendo espacio a lo bestia!!!. La flash que trae es de 16MBytes divididos en 32 sectores. osea, que si quiero escribir 100bytes solo puedo hacerlo en uno de estos 32 sectores. si quiero escribir mas bloques de 100 bytes, cada uno en un sector diferente....¿no?. si es asi, se me ocurre algo: paso la informacion del sector al que quiere añadir bytes a un sector "temporal", borro el sector y vuelvo a pasar lo que tiene el temporal mas el nuevo bloque de 100bytes. supongo que valdrá!
gracias!!!!!
 
bien..me respondo a mi mismo. La idea funciona :aplauso:, aunque un poco lento, tener que borrar los sectores. He añadido un pequeño filtro que verifica, si en el espacio donde escribir, hay valores distintos de 0xff. En ese caso, se debe borrar el sector, guardandolo antes en uno temporal (que tambien debe ser borrado) para luego recuperarlo. PERFECTO!!!
un millon de gracias, estaba estacao!!!!:oops:
 
No es nada!

En un proyecto que hicimos, para evitar continuos borrados, escribiamos toda la info en RAM. Solamente al cortarse la alimentacion pasabamos todos los datos a Flash.
 
No es tan complicado, se detecta la bajada de tension y se envia una interrupcion al procesador para que grabe la Flash antes que la tension caiga del todo.
 
SUPER RAPIDO!!! a mi flash le cuesta al menos 3 segundos borrar un sector!!!. 3 segundos para borrar el sector temporal, mas otros 3 para borrar el definitivo... bufff!!! demasiado tiempo!!! Mi flash es una M25P16 por SPI.
 
Te entiendo... no era mi caso, yo siempre trabaje con Flash paralelas. En mis tarjetas yo siempre ponia una fuente de 3.3 para el procesador en forma exclusiva, y otra de 3.3 para el resto de la tarjeta, ademas de las otras fuentes que necesitara. Cuando detectaba bajada de tension, mandaba la interr. y el procesador enseguida mandaba power down a todas las fuentes restantes... y en unos cuantos ms. escribia el sector de Flash que necesitaba actualizar.

Te podria decir que siempre tengas borrado un sector de antemano... pero todavia puede pasar que recibas un power down al rpincipio del borrado... una bateria de respaldo podria ser una solucion, aunque un poco engorrosa. Otra un capacitor grande, o super capacitor.
 
Atrás
Arriba