Autor Tema: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI  (Leído 9693 veces)

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

Desconectado david2130

  • PIC10
  • *
  • Mensajes: 17
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #15 en: 13 de Diciembre de 2010, 08:42:46 »
os paso los programas que hicimos en ccs para grabar y para leer.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #16 en: 13 de Diciembre de 2010, 10:01:10 »
os paso los programas que hicimos en ccs para grabar y para leer.

  Un consejito, la próxima vez que quieras mostrar un código intentá hacerlo con la opción para insertar código dentro del propio post (es el botón que dice GeSHi, es un menú desplegable y tenés varios formatos de códigos), así es más fácil y rápido para quien esté leyendo.

  Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".
  La idea básica de la transmisión sería algo así

Código: C
  1. void main(void)
  2. {
  3.   ........
  4.   ........
  5.   ........
  6.   pin CS memoria = 1;
  7.   ........
  8.   ........
  9.   while (1);
  10.   {
  11.     pin CS memoria = 0;       // indica que quiero trabajar con la memoria
  12.     spi_xfer (EEPROM, 0x0f);
  13.     spi_xfer (EEPROM, 0xff);
  14.     pin CS memoria = 1;       // recien despues de esta linea comenzara el proceso interno de grabado
  15.     delay_ms (10);               // espera para asegurar el grabado
  16.   }
  17. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #17 en: 13 de Diciembre de 2010, 19:37:43 »
Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".

Pues precisamente esa es la ventaja de la función spi_xfer, te permite enviar una cantidad de bits especificada previamente con la instrucción #use spi(...), y además ella activa y desactiva el pin CS autmaticamente.
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 AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #18 en: 13 de Diciembre de 2010, 19:48:28 »
Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".

Pues precisamente esa es la ventaja de la función spi_xfer, te permite enviar una cantidad de bits especificada previamente con la instrucción #use spi(...), y además ella activa y desactiva el pin CS autmaticamente.

  Ah, mira que interesante. Entonces david debería definir un pin para CS dentro del #use spi(....) y listo. Porque en el programita de él no tiene ningún pin definido como CS.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #19 en: 13 de Diciembre de 2010, 20:16:29 »
os paso los programas que hicimos en ccs para grabar y para leer.

En el link que puse en el primer post, te muestro una librería completamente funcional para escribir y para leer un dato de la eeprom.

Hola david!

A como dice Jeremy si buscas un poco en el foro puedes encontrar la respuesta.

Si te fijas en la hoja de datos la memoria 25lc1024 es igual a la memeoria 25aa1024, posiblemente solo buscaste para la primera por lo cual no te dio ningun buen resultado.

Por Aquí puedes encontrar una libreria para la memoria 25aa1024. Aún no esta completa pero te puede servir de inicio.

 :-/ Suerte.

En mi librería solo debes modificar la linea de #use spi(), recordando que en tu caso debes utilizar transmisión spi por software no por hardware a como lo hago yo, y además debes decir que la cantidad de bits es de 16, al igual que como esta en mi librería.
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 bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #20 en: 13 de Diciembre de 2010, 20:24:34 »
  Ah, mira que interesante. Entonces david debería definir un pin para CS dentro del #use spi(....) y listo. Porque en el programita de él no tiene ningún pin definido como CS.

Así es, para ello debes poner ago como esto #use spi(......,ENABLE=PIN_A3,......)
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 david2130

  • PIC10
  • *
  • Mensajes: 17
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #21 en: 15 de Diciembre de 2010, 08:15:48 »
os paso los programas que hicimos en ccs para grabar y para leer.

  Un consejito, la próxima vez que quieras mostrar un código intentá hacerlo con la opción para insertar código dentro del propio post (es el botón que dice GeSHi, es un menú desplegable y tenés varios formatos de códigos), así es más fácil y rápido para quien esté leyendo.

  Estuve viendo un poquito tus programas, yo no sé como será la función spi_xfer pero no veo que actives ningún pin para la línea CS de la memoria.
  Normalmente las memorias comienzan el proceso de grabado interno cuando aparece un "1" en dicho pin.
Ese pin tiene que estar normalmente en "1", cuando hacés "0" el pin CS de algún dispositivo es porque querés acceder a él, cuando terminaste de trabajar con él lo volves hacer "1".
  La idea básica de la transmisión sería algo así

Código: C
  1. void main(void)
  2. {
  3.   ........
  4.   ........
  5.   ........
  6.   pin CS memoria = 1;
  7.   ........
  8.   ........
  9.   while (1);
  10.   {
  11.     pin CS memoria = 0;       // indica que quiero trabajar con la memoria
  12.     spi_xfer (EEPROM, 0x0f);
  13.     spi_xfer (EEPROM, 0xff);
  14.     pin CS memoria = 1;       // recien despues de esta linea comenzara el proceso interno de grabado
  15.     delay_ms (10);               // espera para asegurar el grabado
  16.   }
  17. }



hice esto, pero no me hizo nada de nada

Desconectado david2130

  • PIC10
  • *
  • Mensajes: 17
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #22 en: 15 de Diciembre de 2010, 08:20:13 »
hice lo que me decis, no hace nada de nada, haber, hemos estado comprobando si a la eeprom llega la señal del relog, y llegar llegua, pero la eeprom no graba, estamos haciendo un codgio nuevo, cuando lo tenga os lo pasaré para que lo veais.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #23 en: 20 de Diciembre de 2010, 01:53:04 »
En esta ocasion traigo una versión modificada de la libreria para el 25xx1024.
Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
////   Autores:  
////     Luis Alberto Vargas Tijerino
////     Francisco Sevilla
////  
////   Version: 2.0
////   Fecha: 19-Dic-10
////  
////   LIBRERIA PARA EEPROM EXTERNA 25AA1024 UTILIZANDO SPI            ////
////                                                                   ////
////   init_ext_eeprom();    Call before the other functions are used  ////
////                         if you use hardware spi                   ////
////                                                                   ////
////   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    ////
////                                                                   ////
////   ext_eeprom_ready();  wait until the eeprom is ready             ////
////                            to receive opcodes                     ////
////                                                                   ////
////   The main program may define EEPROM_SELECT and #use spi(...)     ////
////                                                                   ////
////                                                                   ////
////                      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
#ifndef EEPROM_SELECT
   #define EEPROM_SELECT PIN_A4
   #use spi(MASTER,DI=PIN_A0,DO=PIN_A1,CLK=PIN_A2,MODE=0,MSB_FIRST,BITS=8)
#endif

#use spi(MASTER,DI=PIN_A0,DO=PIN_A1,CLK=PIN_A2,MODE=0,MSB_FIRST,BITS=8)

#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   0x05     //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

#define init_ext_eeprom() SETUP_SPI(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4);   //Configurar SPI

void ext_eeprom_ready(){
   OUTPUT_LOW(EEPROM_SELECT);
   spi_xfer(RDSR);                     //Espera a que el registro status de la eeprom sea
   while(bit_test(spi_xfer(RDSR),0));  //igual a cero
   OUTPUT_HIGH(EEPROM_SELECT);
}

void write_enable_extee(){
   OUTPUT_LOW(EEPROM_SELECT);
   spi_xfer(WREN);      //Enviamos el comando Write Enable
   OUTPUT_HIGH(EEPROM_SELECT);
}
  

void write_ext_eeprom(int32 address, BYTE data) {
   int cmd[5];
   int i;
   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;
  
   write_enable_extee();
  
   OUTPUT_LOW(EEPROM_SELECT);//Habilito el pin de seleccion de chip.
   for(i=0;i<=4;i++)
      spi_xfer(cmd[i]);       //Envio los cmd del 0 hasta el 4
   OUTPUT_HIGH(EEPROM_SELECT);//Deshabilito el pin de seleccion de chip.
}


BYTE read_ext_eeprom(int32 address) {
   int cmd[4];
   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
  
   ext_eeprom_ready();
  
   OUTPUT_LOW(EEPROM_SELECT);
   for(i=0;i<=3;i++)
      spi_xfer(cmd[i]);       //envio los cmd desde el 0 hasta el 3
   data=spi_xfer(0);          //luego envio 0 y recivo el dato.
   OUTPUT_HIGH(EEPROM_SELECT);
   return data;
}

Y a continuacion el ejemplo de utilización.
Código: [Seleccionar]
#include <12f683.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=4M)

#define EEPROM_SELECT PIN_A4
#use spi(MASTER,DI=PIN_A0,DO=PIN_A1,CLK=PIN_A2,MODE=0,MSB_FIRST,BITS=8)
#include <251024.c>


void main(){
   int datos_recibidos,i=0;
   OUTPUT_HIGH(EEPROM_SELECT);
   while (TRUE){
      write_ext_eeprom(i,i+' ');
  
      datos_recibidos=read_ext_eeprom(i);
      
      i++;
   }
}

La ventaja de esta version es que puede ser utilizada por los PIC que no tienen spi por hardware.

A continuacion dejo el archivo adjunto del trabajo.
« Última modificación: 13 de Enero de 2011, 13:53:10 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 david2130

  • PIC10
  • *
  • Mensajes: 17
Re: necesito conectar el pic16f876 a una eeprom 25LC1024 por SPI
« Respuesta #24 en: 13 de Enero de 2011, 09:23:19 »

He tenido q poner en la libreria antes de #use spi..e tenido q poner #use delay (clock=8000000) xq sino no me dejaba compilrlo, aciendo esto lo e compilado pero no me va y nose si es problema de la libreria o es xq tenga mal puestas las entradas o las salidas es decir nose si tengo mal el SET_TRIS_A(0b00001001).De todas maneras la libreria q hicistes es par el pic 12f683 no?¿ por que es el pic q estoy utilizando. Segire probando cosas aver y avisame con algo muxhas gracias

« Última modificación: 17 de Enero de 2011, 05:00:46 por david2130 »


 

anything