Go Down

Topic: Grabar y Leer Eeprom SPI (Read 1 time) previous topic - next topic

Antikles

Buenas Gente :

Estoy con una EEprom SPI (de 128k en concreto CAT25128LI de Onsemi ) y sigiendo el ejemplo de  http://arduino.cc/es/Tutorial/SPIEEPROM
conecto la placa perfecto con la memoria pero a la hora de cargar el programa K.O. error de compilacion ??????

EJ: del sketch completo:

#define DATAOUT 11//MOSI
#define DATAIN  12//MISO
#define SPICLOCK  13//sck
#define SLAVESELECT 10//ss

//opcodes
#define WREN  6
#define WRDI  4
#define RDSR  5
#define WRSR  1
#define READ  3
#define WRITE 2

byte eeprom_output_data;
byte eeprom_input_data=0;
byte clr;
int address=0;
//data buffer
char buffer [128];

void fill_buffer()
{
  for (int I=0;I<128;I++)
  {
    buffer=I;
  }
}

char spi_transfer(volatile char data)
{
  SPDR = data;                    // Start the transmission
  while (!(SPSR & (1<<SPIF)))     // Wait the end of the transmission
  {
  };
  return SPDR;                    // return the received byte
}

void setup()
{
  Serial.begin(9600);

  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //disable device
  // SPCR = 01010000
  //interrupt disabled,spi enabled,msb 1st,master,clk low when idle,
  //sample on leading edge of clk,system clock/4 rate (fastest)
  SPCR = (1<<SPE)|(1<<MSTR);
  clr=SPSR;
  clr=SPDR;
  delay(10);
  //fill buffer with data
  fill_buffer();
  //fill eeprom w/ buffer
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(WREN); //write enable
  digitalWrite(SLAVESELECT,HIGH);
  delay(10);
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(WRITE); //write instruction
  address=0;
  spi_transfer((char)(address>>8));   //send MSByte address first
  spi_transfer((char)(address));      //send LSByte address
  //write 128 bytes
  for (int I=0;I<128;I++)
  {
    spi_transfer(buffer); //write data byte
  }
  digitalWrite(SLAVESELECT,HIGH); //release chip
  //wait for eeprom to finish writing
  delay(3000);
  Serial.print('h',BYTE);
  Serial.print('i',BYTE);
  Serial.print('\n',BYTE);//debug
  delay(1000);
}

byte read_eeprom(int EEPROM_address)
{
  //READ EEPROM
  int data;
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer(READ); //transmit read opcode
  spi_transfer((char)(EEPROM_address>>8));   //send MSByte address first
  spi_transfer((char)(EEPROM_address));      //send LSByte address
  data = spi_transfer(0xFF); //get data byte
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
  return data;
}

void loop()
{
  eeprom_output_data = read_eeprom(address);
  Serial.print(eeprom_output_data,DEC);
  Serial.print('\n',BYTE);
  address++;
  if (address == 128)
    address = 0;
  delay(500); //pause for readability
}


Error de compilacion en void setup .

Soy novato en esto .. hay algun ejemplo mas sencillo ??? el el IDE de Arduino los ejemplos de EEPROM son de su propia eeprom no externa , es decir sin comunicación verdad???

Saludos


OoTzToO

#1
Dec 15, 2012, 01:12 am Last Edit: Dec 15, 2012, 12:39 pm by OoTzToO Reason: 1
Por lo que veo, tienes algunos problemas con los arrays y con la función serial.print

Cuando llenas el buffer, fíjate que en el ejemplo pone

Code: [Select]
buffer[I]=I; y tú tienes
Code: [Select]
buffer=I;

Luego da error de compilación porque parece que ya no se puede usar
Code: [Select]
serial.print(var,BYTE);, sino que debes cambiarlos por
Code: [Select]
serial.write(var);

A mí ahora me compila con 1.0.1 y 1.0.2

;)

PD: edito porque el elemento del array cambia el formato a cursiva y no aparece bien. Como a ti también te pasa, supongo que también lo tendrás bien. Para pegar códico usa los tags de CODE ;)

Antikles

Gracias OoTzToO .... en cuanto tenga un ratito le doy caña y os comento .

Todavía ando un poco novel jajajjaja.

8)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy