TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: fxsevilla en 12 de Noviembre de 2010, 15:23:08

Título: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
Publicado por: fxsevilla en 12 de Noviembre de 2010, 15:23:08
Hola comunidad de TODOPIC,

Soy algo nuevo en el foro y esta es una de mis primeras consultas:

Quiero realizar un almacenamiento de datos ene la memoria EEPROM 25AA1024 de Microchip usando la interfaz SPI del PIC18F4455. Para esto utilizo el compilador CCS y una version modificada de la libreria de 25640, que simula por software el protocolo SPI. Cuando realizo la simulacion en Proteus y el SPI Debugger los datos enviados a traves del puerto serial (SDO hacia SI de la EEPROM) son correctos, aparentemente, revise esto con la hoja de datos de la EEPROM para los ciclos de escritura y lectura. Y NO FUNCIONA. Luego, suponiendo que puede ser un problema de simulacion, implemento en mi tabla de nodos con el PIC, y nada :(

Ahh, los pines de HOLD y WP estan debidamente a +5V

Alguna sugerencia, esta es la parte fundamental de un proyecto en el que estoy trabajando.
Título: Re: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
Publicado por: fxsevilla en 12 de Noviembre de 2010, 15:30:46
Imagen de la depuracion con SPI debugger
Título: Re: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
Publicado por: bigluis en 13 de Noviembre de 2010, 01:48:13
Hola Francisco!

 :-/ Problema Resuelto.

A continuación muestro el código de como debería quedar la librería de la memoria 25aa1024.
Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
////   Autores:
////           Luis Alberto Vargas Tijerino
////           Francisco Sevilla
////          
////   Pais:   Nicaragua.
////   Fecha:  12-Nov-10.
////  
////   LIBRERIA PARA EEPROM EXTERNA 25AA1024 UTILIZANDO SPI            ////
////                                                                   ////
////   init_ext_eeprom();    Call before the other functions are used  ////
////                                                                   ////
////   write_ext_eeprom(a, d);  Write the byte d to the address a      ////
////                                                                   ////
////   d = read_ext_eeprom(a);   Read the byte d from the address a    ////
////                                                                   ////
////   b = ext_eeprom_ready();  Returns TRUE if the eeprom is ready    ////
////                            to receive opcodes                     ////
////                                                                   ////
////   The main program may define EEPROM_SELECT, EEPROM_DI, EEPROM_DO ////
////   and EEPROM_CLK to override the defaults below.                  ////
////                                                                   ////
////                                                                   ////
////                      Pin Layout                                   ////
////   -----------------------------------------------                 ////
////   |    __                                       |                 ////
////   | 1: CS   EEPROM_SELECT | 8: VCC   +5V        |                 ////
////   |                       |    ____             |                 ////
////   | 2: SO   EEPROM_DO     | 7: HOLD  +5V        |                 ////
////   |    __                 |                     |                 ////
////   | 3: WP   +5V           | 6: SCK   EEPROM_CLK |                 ////
////   |                       |                     |                 ////
////   | 4: VSS  GND           | 5: SI    EEPROM_DI  |                 ////
////   -----------------------------------------------                 ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////      Este codigo fue modificado para utilizarzse en               ////
////      SPI Serial Bus 25AA1024 a partir de la libreria 25640.c      ////
////      9356SPI.c y ex_spi.c                                         ////
///////////////////////////////////////////////////////////////////////////

//Definicion de pines

#define EEPROM_SELECT PIN_C6
#define EEPROM_CLK    PIN_B1
#define EEPROM_DI     PIN_C7
#define EEPROM_DO     PIN_B0

#define EEPROM_ADDRESS long int
#define EEPROM_SIZE    8388608            //1024Kb = 1024*1024*8=8388608

//SET DE INSTRUCCIONES DE 25AA1024
#define READ   0x03     //Read data from memory array beginning at selected address
#define WRITE  0x02     //Write data to memory array beginning at selected address
#define WREN   0x06     //Set the write enable latch (enable write operations)
#define WRDI   0x04     //Reset the write enable latch (disable write operations)
#define RDSR   0x0500   //Read STATUS register
#define WRSR   0x01     //Write STATUS register
#define PE     0x42     //Page Erase – erase one page in memory array
#define SE     0xD8     //Sector Erase – erase one sector in memory array
#define CE     0xC7     //Chip Erase – erase all sectors in memory array
#define RDID   0xAB     //Release from Deep power-down and read electronic signature
#define DPD    0xB9     //Deep Power-Down mode

#use spi(MASTER,FORCE_HW,ENABLE=PIN_C6,ENABLE_ACTIVE=0,SAMPLE_RISE,IDLE=0,MSB_FIRST,BITS=16)
  
#define init_ext_eeprom() SETUP_SPI(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_64);   //Configurar SPI

#define ext_eeprom_ready() while(bit_test(spi_xfer(RDSR),0));

void write_ext_eeprom(int32 address, BYTE data) {
   int cmd[5];
   int i;
   int data2;
   cmd[0]=WRITE;
   cmd[1]=make8(address,2);//Tomamos el byte 2 de address
   cmd[2]=make8(address,1);//Tomamos el byte 1 de address
   cmd[3]=make8(address,0);//Tomamos el byte 0 de address
   cmd[4]=data;
  
   OUTPUT_LOW(EEPROM_SELECT);
   spi_write(WREN);      //Enviamos el comando Write Enable
   OUTPUT_HIGH(EEPROM_SELECT);
   do{
      data2=spi_xfer(RDSR);
   }while(bit_test(data2, 1)==0);
   OUTPUT_LOW(EEPROM_SELECT);// Deshabilito el pin de seleccion de chip.
   for(i=0;i<=4;i++)
      spi_write(cmd[i]);      //Enviamos el comando de Escritura, seguido de la direccion y el dato a escribir.
   OUTPUT_HIGH(EEPROM_SELECT);//Habilito el pin de seleccion de chip.
  
   ext_eeprom_ready();
   OUTPUT_LOW(EEPROM_SELECT);// Deshabilito el pin de seleccion de chip.
   spi_write(WRDI);      //SI NO ENVIAMOS WREN, observamos en la simulacion que no escribe!
   OUTPUT_HIGH(EEPROM_SELECT);//Habilito el pin de seleccion de chip.
}


BYTE read_ext_eeprom(int32 address) {
   int cmd[5];
   int i,data;
   cmd[0]=READ;
   cmd[1]=make8(address,2);//Tomamos el byte 2 de address
   cmd[2]=make8(address,1);//Tomamos el byte 1 de address
   cmd[3]=make8(address,0);//Tomamos el byte 0 de address
   cmd[4]=0;
  
   ext_eeprom_ready();
  
   OUTPUT_LOW(EEPROM_SELECT);// Deshabilito el pin de seleccion de chip.
   for(i=0;i<=4;i++)
      spi_write(cmd[i]);   //Enviamos el comando de lectura, seguido de la direccion y un byte de espera
   data=spi_read();        //Leemos el byte recibido de la memoria.
   OUTPUT_HIGH(EEPROM_SELECT);//Habilito el pin de seleccion de chip.
   return data;
}

Y a continuación muestro el código con el que se pueden realizar las pruebas.
Código: [Seleccionar]
#include <18f4455.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG,CPUDIV4
#use delay(clock=4000000)


#define LCD_ENABLE_PIN  PIN_D0
#define LCD_RS_PIN      PIN_D1
#define LCD_RW_PIN      PIN_D2
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5
#define LCD_DATA6       PIN_D6
#define LCD_DATA7       PIN_D7
#include "LCD.c"

#include "251024.c"


void main(){
   int datos_recibidos;
  
   init_ext_eeprom();
   while (TRUE){
      write_ext_eeprom(0x10,0x55);
  
      datos_recibidos=read_ext_eeprom(0x10);
      
      if (datos_recibidos==0x55){
         lcd_init();
         lcd_putc("\fPRUEBA 10-11-10");
      }
   }
}

A continuacion dejo el archivo adjundo del código
Título: Re: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
Publicado por: electron87 en 14 de Abril de 2015, 02:14:27
Hola Amigo bigluis, estoy utilizando tu archivo para ser interpretado pero al compilarla en CCS me genera errores en la linea:

 spi(MASTER,FORCE_HW,ENABLE=PIN_C6,ENABLE_ACTIVE=0,SAMPLE_RISE,IDLE=0,MSB_FIRST,BITS=16)

Tiene alguna idea dde por que es??
GRacias Por tu aporte!!

Cuando simulo tu programa funciona correctamente!!