/*Este ejercicio consiste en escribir y leer en la eeprom (25LC020).
Los pasos para poder escribir y leer en este caso, serán los siguientes:
ESCRITURA:
1- ) Habilitar la escritura (para esto hay que habilitar el chip-select (cs) y deshabilitarlo.
2- ) Mandarla instrucción de escritura, (se requiere volver habilitar el cs).
3- ) Direccionar donde se quiere escribir.
4- ) MANDAR los 16 datos.(en este caso enviaré 5 datos).
LECTURA:
1- ) Habilitar el cs.
2- ) configurar como lectura.
3- ) direccionar la eeprom.
Una vez teniendo esto en cuenta, lo siguiente es hacer el pro*/
////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Esmelis Rafael Noviembre/2011
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: Escritura EEPROM (25LC020) VERSIÓN: 1.0
// DISPOSITIVO: PIC18F46k20 COMPILADOR: CCS vs4.088
// Entorno IDE: MPLAB 8.56 SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: VIRTUAL DEBUGGER: VIRTUAL
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// Escribir 5 bytes en la memoria EEPROM a través del bus SPI
//
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <main.h>
//#USE SPI (MASTER, CLK=PIN_C0, DI=PIN_C1, DO=PIN_C2, ENABLE=PIN_C3, LOAD=PIN_C5, DIAGNOSTIC=PIN_C4, MODE=0, BITS=8, STREAM=SPI_1)
#use delay(internal=8Mhz) // Selecciona la velocidad del oscilador interno
#include <LCD.c>
/*
Mientras no empleemos el bus USB, se utilizará el oscilador interno para simplificar
la configuración de reloj y reducir componentes externos.
*/
////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
//setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
// setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
int8 direccion=0;
int8 dato;
int8 blank;
setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16| SPI_XMIT_L_TO_H);
setup_oscillator(OSC_INTRC|OSC_8MHZ);
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"\fpresione A1");
lcd_putc("\n");
printf(lcd_putc,"para escribir");
for(;
{
if(input(pin_A1)==0){ //si es cero A1 escribe
/*
Para decidir cual es la configuración de la lógica de control del bus SPI del micro,
debemos de mirar el databook de la EEPROM
Esta configuración deja el estado IDLE en bajo activo, recoje el dato en el flanco
de subida y deja la velocidad del reloj de transferencia en FOSC/16
El IDLE y el FLANCO deben de coincidir en ambos dispositivos
*/
//ESCRITURA //////////////////////////////////////////////////////////
lcd_putc("\f"); // PASO (HABILITAR LA ESCRITURA)
lcd_gotoxy(1,1); //Para ello es necesario habilitar el CS y deshabilitarlo.
for(dato=0;dato<255;dato++) //256 es el max de cap de la eeprom
{
output_low(PIN_A0); //HABILITO CS
spi_write(0x06); //HABILITO ESCRITURA
output_high(PIN_A0); //DESHABILITO CS
//2º PASO (MANDAR LA INSTRUCCIÓN DE ESCRITURA).
output_low(PIN_A0); //Hay que volver a habilitar la EEPROM
spi_write(0x02); //CONFIGURO OPERACIÓN ESCRITURA
//3º PASO (DIRECCIONAR DONDE SE QUIERE ESCRIBIR)
spi_write(direccion); //DIRECCIONO
//4º PASO (MANDAR LOS 5 DATOS)
//Para una transferencia de datos correcta, hay que finalizar deshabilitando la EEPROM
spi_write(dato);
output_high(PIN_A0);
//spi_write(dato); //No ha hecho falta poner retardos para mandar los datos
printf(lcd_putc,"%u ",dato); //escribir en el LCD el valor de dato
delay_ms(200);
++direccion;
}
lcd_putc("\f");
printf(lcd_putc," escritura ");
lcd_putc("\n");
printf(lcd_putc," finalizada ");
}
output_high(PIN_A0);
delay_ms(1000); //esperar 1 segundo
lcd_putc("\n"); //escribir en la siguiente linea del LCD L (lectura)
if(input(pin_A2)==0){ //si es cero A2 lee
//// LECTURA///////////////////////////////////////////////////////////
//1º PASO (HABILITAR CS)
output_low(PIN_A0); //Es necesario habilitar el CS
//2ºPASO (CONFIGURAR COMO LECTURA)
spi_read(0x03); //Además de leer, con esta función puedo escribir en la EEPROM.
//siempre que meta un dato en el paréntesis.
//En nuesto caso aprovechamos para mandar la instrucción de LECTURA.
//De este modo no hace falta habilitar el permiso de escritura.
//3ºPASO (DIRECCIONAR LA EEPROM)
spi_read(0x10); //DIRECCIONO
lcd_putc("\f");
lcd_gotoxy(1,1);
for(direccion=0;direccion<255;direccion++) //255 es el max de cap de la eeprom
{
dato =(spi_read(direccion));
printf(lcd_putc,"%u",dato);
//printf(lcd_putc,"%c",dato);
delay_ms(500);
}
output_high(PIN_A0);
lcd_putc("\f");
printf(lcd_putc," lectura ");
lcd_putc("\n");
printf(lcd_putc," finalizada ");
}
if(input(pin_A3)==0){ // rutina de borrado
direccion=0;
for(blank=0;blank<255;blank++) //255 es el max de cap de la eeprom
{
dato=0x00;
output_low(PIN_A0); //HABILITO CS
spi_write(0x06); //HABILITO ESCRITURA
output_high(PIN_A0); //DESHABILITO CS
//2º PASO (MANDAR LA INSTRUCCIÓN DE ESCRITURA).
output_low(PIN_A0); //Hay que volver a habilitar la EEPROM
spi_write(0x02); //CONFIGURO OPERACIÓN ESCRITURA
//3º PASO (DIRECCIONAR DONDE SE QUIERE ESCRIBIR)
spi_write(direccion); //DIRECCIONO
//4º PASO (MANDAR LOS 5 DATOS)
//Para una transferencia de datos correcta, hay que finalizar deshabilitando la EEPROM
spi_write(dato);
output_high(PIN_A0);
//spi_write(dato); //No ha hecho falta poner retardos para mandar los datos
printf(lcd_putc,"%u ",dato); //escribir en el LCD el valor de dato
delay_ms(200);
++direccion;
}
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc," borrado ");
lcd_putc("\n");
printf(lcd_putc," finalizado");
}
}
}
//este es el programa que escribe y lee una memoria 25lc020. una mem 25lc1024 no! ese problema tengo ahora. slds.