Hola!
Llevo tiempo queriendo leer y escribir en una memoria EEPROM externa. Concretamente en la 25LC640 de Microchip, el compilador que empleo es el C18 y el PiC que estoy utilizando es el 18F2320. La verdad es que he conseguido arrancar la cosa, y diría que la escritura es correcta, lo que pasa es que cuando miro la señal de lectura sale una señal muy rara que no se parece en nada a lo que tendíra que ser...
Aquí os dejo el código que estoy empleando, para ver si alguien me puede echar una mano, porque yo ya no sé qué tocar!
Muchas gracias por adelantado.
Mireya
#include <p18f2320.h>
#include <spi.h>
#pragma config WDT = OFF
#pragma config WDTPS = 128
#pragma config OSC = HS
#pragma config FSCM = OFF
#pragma config IESO = OFF
#pragma config BOR = OFF
#pragma config PWRT = OFF
#pragma config BORV = 20
#pragma config MCLRE = OFF //desactiva master clear
#pragma config PBAD = DIG
#pragma config STVR = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#define SPI_CS PORTCbits.RC2
#define SPIEEPROM_RDSR 0b00000101
#define SPIEEPROM_WRSR 0b00000001
#define SPIEEPROM_WREN 0b00000110
#define SPIEEPROM_WRDI 0b00000100
#define SPIEEPROM_WRITE 0b00000010
#define SPIEEPROM_READ 0b00000011
unsigned char var,dato,alta, longitud;
void SPIEEPROM_CMD_Write( unsigned char SPI_Cmd)
{
SSPBUF = SPI_Cmd ;
while (!PIR1bits.SSPIF);
PIR1bits.SSPIF =0;
}
unsigned char SPIEEPROM_Busy( void )
{
unsigned char SPIEEPROM_Status ;
SPI_CS = 0;
SPIEEPROM_CMD_Write( SPIEEPROM_RDSR );
SPIEEPROM_CMD_Write(0b00000000) ;
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
ReadSPI();
SPIEEPROM_CMD_Write( 0x00);
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
ReadSPI();
SPIEEPROM_Status = SSPBUF ;
SPI_CS = 1 ;
if ( SPIEEPROM_Status & 0b00000001 )
return 1 ;
else
return 0 ;
}
void SET_WREN( void )
{
SPI_CS = 0 ;
SPIEEPROM_CMD_Write( SPIEEPROM_WREN ) ; // Enable for Write !!
SPIEEPROM_CMD_Write(0b00000000) ;
SPI_CS = 1 ;
while ( SPIEEPROM_Busy( ) ) ;
}
void Readstatus (void)
{
SPI_CS = 0 ;
SPIEEPROM_CMD_Write(0x05);
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
ReadSPI() ;
SPIEEPROM_CMD_Write(0x00) ;
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
ReadSPI();
SPIEEPROM_CMD_Write(0x00) ;
SPI_CS = 1 ;
}
void SPIEEPROM_SetMode( void )
{
SPI_CS = 0 ;
SPIEEPROM_CMD_Write( SPIEEPROM_WREN ) ;
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
SPI_CS = 1 ;
SPI_CS = 0 ;
SPIEEPROM_CMD_Write( SPIEEPROM_WREN ) ; // Enable for Write !!
SPIEEPROM_CMD_Write(0b00000000) ;
SPI_CS = 1 ;
while ( SPIEEPROM_Busy( ) ) ;
}
void SPIEEPROM_Byte_Write(unsigned char alta,unsigned char dato )
{
SET_WREN();
Readstatus ();
SPI_CS = 0 ;
SPIEEPROM_CMD_Write( SPIEEPROM_WRITE ) ; // Write Command
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
SPIEEPROM_CMD_Write( alta ) ; // Write Address Low Byte
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
SPIEEPROM_CMD_Write( dato ) ; // Write Data to EEPROM
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
SPI_CS = 1 ;
}
unsigned char SPIEEPROM_Byte_Read(unsigned char alta, unsigned char *dato, unsigned char longitud)
{
SPI_CS = 0 ;
SPIEEPROM_CMD_Write( SPIEEPROM_READ ); // Write Read Command
SPIEEPROM_CMD_Write(0b00000000) ;
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
SPIEEPROM_CMD_Write( alta ) ; // Write Address Low Byte
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
getsSPI(dato,longitud);
//ReadSPI();
SPIEEPROM_CMD_Write(0) ; // Dummy data
while ( PIR1bits.SSPIF) ; PIR1bits.SSPIF = 0 ;
SPI_CS = 1 ;
return ( SSPBUF) ;
}
void main (void)
{
TRISA=0x00; //Salidas
PORTA=0X00;
TRISB=0xFF; //Entradas
//ADC
//ADC ADCON0 REGISTER
ADCON0bits.ADON=0; //Desactivar els ADC
//ADC ADCON1 REGISTER
ADCON1bits.PCFG3=1; //AN config com I/0 digitals
ADCON1bits.PCFG2=1;
ADCON1bits.PCFG1=1;
ADCON1bits.PCFG0=1;
while(1)
{
/////////////////////////////////////inicializacion SPI////////////////////////////////////////////////
PORTCbits.RC1=1; //ENABLED MUX SPI
PORTCbits.RC0=0; //DISABLED MUX I2C
TRISCbits.TRISC2=0; //Configuración de CS como salida
SPI_CS=1; //Chip select en RESET
//SPI MASTER CONFIG
TRISCbits.TRISC3=0; //SCK como salida
TRISCbits.TRISC4=1; //SDI como entrada
TRISCbits.TRISC5=0; //SDO como salida
SSPSTAT = 0b11000000 ;
SSPCON1 = 0x21;
PORTA=0x02;
SPIEEPROM_SetMode();
alta=0x00;
dato=0xAA;
longitud=0x01;
SPIEEPROM_Byte_Write(alta,dato);
PORTAbits.RA3=1;
SPIEEPROM_Byte_Read(alta,&dato,longitud);
}
}