Autor Tema: Leer/escribir byte en EEPROM serie  (Leído 3043 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Mireya

  • PIC10
  • *
  • Mensajes: 2
Leer/escribir byte en EEPROM serie
« en: 20 de Enero de 2009, 14:06:53 »
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);

   }
}

Desconectado PFCarrera

  • PIC10
  • *
  • Mensajes: 32
Re: Leer/escribir byte en EEPROM serie
« Respuesta #1 en: 04 de Marzo de 2010, 09:56:15 »
hola mireya!
Estoy intentado leer y escribir en una memoria EEPROM externa y quería saber si has solucionado tu problema para poder guiarme de tu programa, ya que voy un poco perdida en lo que es spi.

Un saludo!