TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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.
-
Imagen de la depuracion con SPI debugger
-
Hola Francisco!
:-/ Problema Resuelto.
A continuación muestro el código de como debería quedar la librería de la memoria 25aa1024.
///////////////////////////////////////////////////////////////////////////
//// 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.
#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
-
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!!