TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Rikr09 en 21 de Agosto de 2012, 10:58:27
-
Buenas, estoy usando una memoria Flash SST25VF080B con un PIC24FJ128GA310. Ella escribo a partir de la dirección de memoria 4096, ya que el primer sector de ella (Sectores de 4K), se ha de emplear para almacenar temporalmente los datos de n sector en el momento que se vaya a borrar. Mi problema radica en que , cuando le quito la alimentación de voltaje al PIC y sobreescribo sobre las 10 primeras posiciones de memoria de ella, ya escritas, el resto de información que ya estaba guardado, se modifica, siendo que sobre él no he efectuado cambio alguno.
Agradezco su pronta ayuda, ya que esto me ha retrasado un poco en la realización de mis actividades.
Gracias
-
Pero para volver a escribir no debes borrar el sector?
-
Hay que tener algunas consideraciones en este tipo de memorias:
Lo que dice Suky es cierto, para que grabe correctamente la posicion de memoria debe estar en 0xFF y no se puede "limpiar" los bytes individualmente sino que se borran por bloques.
El metodo de grabación en tipo page program no debe exceder la pagina actual es decir cada pagina esta compuesta por 256 bytes, y cuando la memoria hace la transicion de 256 a 0 sobreescribe la direccion 0 de la pagina en la que se inició la grabación malogrando lo que antes estaba grabado, el chip no cambia de pagina automaticamente. Esto me dió buenos dolores de cabeza, pero en el datasheet esta indicado. Esto por lo menos ya lo he visto en SST25VF064C y 25LC1024, asi que se debe grabar byte a byte.
Saludos.
-
De antemano agradezco sus respuestas.
Ahora bien, el método que empleo para escribir, automaticamente antes de realizar la escritura de los datos copia estos y los guarda en el primer sector de la memoria (0-4095) , luego los borra, escribe los nuevos datos junto con los que ya se habian copiado.
Este es el siguiente, void ChangeStringSector( BYTE *Data, DWORD Addrs, UINT Length ){
DWORD i, con2; BYTE data, band; UINT con1;
con1 = i = band = 0;
con2 = ( SelectSector(Addrs) * SECTOR_4K ) - SECTOR_4K; // Inicio de Sector a leer
// Lee la memoria y hace el cambio de datos
for( i=con2;i<(SelectSector(Addrs) * SECTOR_4K); i++ ){
data = FlashRead(i);
if( Addrs == i ){
while( Length-- ){ data = *Data++; FlashWrite(data, con1 ); con1++; i++; }
band = 1;
}
if( band == 1 ){ band = 0; }else{ FlashWrite( data, con1 ); con1++; }
}
// Borra el Sector leido
EraserSector( SelectSector(Addrs), 1 );
// Escribe en el sector borrado los nuevos datos
con1 = 0;
for( i=con2;i<(SelectSector(Addrs) * SECTOR_4K);i++ ){
FlashWrite( FlashRead(con1), i ); con1++;
}
//strlen(buffer);//me determina el tamao del buffer que he de implementar para ubicarlo en el lugar de Lenght
// Borra el Sector utilizado como buffer
EraserSector( 0, 1 );
}
El problema que detecto es que al momento de Reset el PIC, y leo lo que esta en la memoria, luego de haber 'sobreescrito' los primeros 10 bytes de la memoria (a partir de la 52096), la lectura empieza desplazada n+1, es decir se vuela el primer dato, es decri, hasta el dato numero 10 todo es perfecto, luego cuando empieza la segunda linea de 10 datos, no me lee el numero 11 sino el 12 y asi... de ahi adelante todo carece de coherencia...
Gracias por su atencion, interes y ayuda, Suky, Kallitos y todos los q deseen colaborarme con esto. :-/