TODOPIC
Microcontroladores PIC => Pic32 => Mensaje iniciado por: fantabuloso en 04 de Enero de 2012, 17:08:57
-
Hola, revisando los ejemplos de Suky, trate de conectar la memoria con el micro, y no pude utilizar la libreria de microchip, ya q se colgaba en algun lugar. Por lo q escribi las mias basandome en las del libro de c32, funcionó bien o es lo q yo pensaba ya q siempre escribia y leía en la misma ubicación, pero me encontre con la sorpresa de que luego de escrita una posición, cuando la trataba de escribir nuevamente, obvio con otro dato, esta no cambia el contenido, entonces traté de realizar un borrado del chip con la instruccion 0x60, pero n o tuve exito, aca dejo el codigo para q lo vean, pero no se cual pueda ser el inconveniente, es la primera vez que pruebo estas memorias, gracias de antemano.
#include <p32xxxx.h>
#include "see.h"
// I/O definitions
#define CSEE _RB11 // select line for Serial EEPROM
#define TCSEE _TRISB11 // tris control for CSEE pin
// peripheral configurations
#define SPI_CONF 0x8120 // SPI on, 8-bit master,CKE=1,CKP=0
#define SPI_BAUD 39//1 // clock divider Fpb/(2 * (15+1))
// sst25vf016 Serial EEPROM commands
#define WRSR 0x01 // guarda o escribe el registro de stado
#define WRITE 0x02 // comando escribir byte memoria
#define READ_LOW 0x03 // comando leer memoria hasta 25MHz
#define WRDI 0x04 // write disable
#define STATUS 0x05 // read status register
#define WREN 0x06 // write enable
#define READ_HIGH 0x0b // comando leer memoria hasta 80Mhz
#define ERASE4K 0x20 // borra 4K
#define ERASE32K 0x52 // borra 32K
#define ERASE64K 0xd8 // borra 64K
#define ERASEFULL 0x60 // borra 64K
#define AAI 0xAD // autoincrementa programacion
#define EWSR 0x50 // habilita escrtura registro
#define RDID 0x90 // lee id
#define JEDEC 0x9f // lee jedec id
#define EBSY 0x70 // habilita SO durante AAI
#define DBSY 0x80 // desabilita SO durante AAI
#define DUMMY 0x00 // dummy
char prueba = 0xff;
int writeSPI3A( int i)
{
SPI3ABUF = i;
while( !SPI3ASTATbits.SPIRBF);
return SPI3ABUF;
}
void initSEE( void)
{
TCSEE = 0;
CSEE = 1;
SPI3ACON = SPI_CONF;
SPI3ABRG = SPI_BAUD;
if (readStatus() == 28)
{
CSEE = 0;
writeSPI3A(EWSR);
CSEE = 1;
DelayUS(1);
CSEE = 0;
writeSPI3A(WRSR);
writeSPI3A(0x00);
CSEE = 1;
}
while (readStatus() & 0x1);
CSEE = 0; // agregado para borra chip
writeSPI3A(0xC7); //
CSEE = 1;
DelayMS(60); // tiempo de borrado minimo 50us segun HdD
}
int readStatus(void)
{
int i;
CSEE = 0;
writeSPI3A(STATUS);
i = writeSPI3A(0);
CSEE = 1;
return i;
}
char readSEE(int address)
{
char i;
while (readStatus() & 0x1);
CSEE = 0;
writeSPI3A(READ_LOW);
//writeSPI3A(address >> 16);
//writeSPI3A(address >> 8);
//writeSPI3A(address);
writeSPI3A(0x10); //deje direcciones fijas para probar
writeSPI3A(0x10);
writeSPI3A(0x12);
i = writeSPI3A(DUMMY); //lectura
CSEE = 1;
return ( i);
}
void writeEnable(void)
{
CSEE = 0;
writeSPI3A(WREN);
CSEE = 1;
}
void writeSEE(int address, char data)
{
while (readStatus() & 0x1);
writeEnable();
CSEE = 0;
writeSPI3A(WRITE);
//writeSPI3A(address >> 16);
//writeSPI3A(address >> 8);
//writeSPI3A(address);
writeSPI3A(0x10); //deje direcciones fijas para probar
writeSPI3A(0x10);
writeSPI3A(0x12);
writeSPI3A(0x67); //deje dato fijo para probar
CSEE = 1;
}
Editado: Soy un Sr. nabo, me lataba WREN antes de mandar 0x60 o 0xc7. y bue pasa en las mejores familias