Autor Tema: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455  (Leído 3572 veces)

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

Desconectado fxsevilla

  • PIC10
  • *
  • Mensajes: 2
Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
« 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.
« Última modificación: 12 de Noviembre de 2010, 15:33:23 por fxsevilla »

Desconectado fxsevilla

  • PIC10
  • *
  • Mensajes: 2
Re: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
« Respuesta #1 en: 12 de Noviembre de 2010, 15:30:46 »
Imagen de la depuracion con SPI debugger

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
« Respuesta #2 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
« Última modificación: 13 de Noviembre de 2010, 02:26:35 por bigluis »
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado electron87

  • PIC10
  • *
  • Mensajes: 1
Re: Memoria EEPROM 25AA1024 de Microchip y PIC18F4455
« Respuesta #3 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!!