Pages: [1]   Go Down
Author Topic: Problem interfacing with an 25LC040 EEPROM (SPI)  (Read 588 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm trying to store and read data from a 25LC040 EEPROM (http://www.c-stamp.com/Documents/Documentation/CS450000d1.pdf).
When I'm trying to read the addresses I'm just getting zeros as output.

I followed along with this tutorial: http://arduino.cc/en/Tutorial/SPIEEPROM.

This is my code:

Code:
#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 [16];
int a = 2;

void fill_buffer()
{
  for(int i = 0; i < 16; i++)
  {
    buffer[i] = i;
  }
}

void setup()
{
  Serial.begin(9600);
 
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK, OUTPUT);
  pinMode(SLAVESELECT, OUTPUT);
 
  digitalWrite(SLAVESELECT, HIGH);

  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1);
  clr=SPSR;
  clr=SPDR;
  delay(10);
 
  fill_buffer();
 
  digitalWrite(SLAVESELECT, LOW);
  spi_transfer(WREN);
  digitalWrite(SLAVESELECT, HIGH);
  delay(10);
 
  digitalWrite(SLAVESELECT, LOW);
  spi_transfer(WRITE);
  spi_transfer(address);
  for(int i = 0; i < 16; i++)
  {
    spi_transfer(buffer[i]);
  }
  digitalWrite(SLAVESELECT, HIGH);
  delay(3000);
  Serial.write("done writing \n");
  delay(1000);
}

void loop()
{
  if(address < 16)
  {
    Serial.print("reading data \n");
    eeprom_output_data = read_eeprom(address);
    Serial.print(eeprom_output_data,DEC);
    Serial.write('\n');
    address++;
    delay(500);
  }
}

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

byte read_eeprom(int EEPROM_address)
{
  int data;
  digitalWrite(SLAVESELECT, LOW);
  spi_transfer(READ);
  spi_transfer((char)(EEPROM_address));
  data = spi_transfer(0xFF);
  digitalWrite(SLAVESELECT,HIGH);
  return data;
}

Any help would be very much appreciated.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nevermind.

I failed to wire the EEPROM correctly... stupid me:).
Logged

Pages: [1]   Go Up
Jump to: