I sent the email from a different computer - Here's the full code:
#include <stdio.h>
//Pins
#define MOSI 11
#define MISO 12
#define CLK 13
#define CS 10
//opcodes
#define WRITE 0x02 //page program
#define READ 0x03 //read data
#define WREN 0x06 //write enable
#define ERASE 0x20 //erase 4k sector
void setup()
{
Serial.begin(115200);
pinMode(MOSI, OUTPUT);
pinMode(MISO, INPUT);
pinMode(CLK, OUTPUT);
pinMode(CS, OUTPUT);
digitalWrite(CS, HIGH); //disable device
//Set SPI Control Register:
SPCR = (1<<SPE)|(1<<MSTR);
Serial.println("\nSetup done...\n");
delay(10);
}
void loop()
{
byte data[256] = {0xff,0xff,0xff,0xff,0xff,..stripped for display purpose...,0xc9};
char byte_buffer[1];
char szBuffer[8];
byte eeprom_data;
unsigned long read_address;
unsigned long erase_address;
unsigned long write_address;
int iBytes = 1;
//Erase a 4K sector - required for successful writing
address = 0; //0x00000000
Serial.println("\nErasing 4K sector... ");
sector_erase(erase_address);
Serial.println("Done erasing...\n");
delay(1000);
//Writing to eeprom
Serial.println("\nWriting data");
address = 0;
write_eeprom(write_address, data);
Serial.println("Done writing...\n");
delay(1000);
//Reading EEPROM
address = 0; //Start address of device memory
Serial.println("Reading EEPROM...\n");
sprintf(szBuffer, "%#08lx ", address);
Serial.print(szBuffer);
for (int i=0; i<256; i++) //read 256 bytes, for testing purposes
{
if (iBytes > 32) //Printing to serial monitor in rows of 32 bytes
{
Serial.print("\n");
sprintf(szBuffer, "%#08lx ", address);
Serial.print(szBuffer);
iBytes = 1;
}
delay(1);
}
Serial.println("\n\nDone reading...");
delay(1);
exit(0);
}
char spi_transfer(volatile byte data)
{
delay(1);
SPDR = data;
while (!(SPSR & (1<<SPIF)));
return SPDR;
}
byte read_eeprom(unsigned long EEPROM_address)
{
//read EEPROM data
byte data;
digitalWrite(CS, LOW);
spi_transfer(READ);
spi_transfer((byte)(EEPROM_address>>16)); //address bits 23-16
spi_transfer((byte)(EEPROM_address>>8)); //address bits 15-8
spi_transfer((byte)(EEPROM_address)); //address bits 7-0
data = spi_transfer(0xFF);
digitalWrite(CS, HIGH);
return data;
}
void write_enable()
{
digitalWrite(CS, LOW);
spi_transfer(WREN);
digitalWrite(CS, HIGH);
delay(10);
}
void sector_erase(unsigned long erase_address)
{
write_enable();
digitalWrite(CS, LOW);
spi_transfer(ERASE);
spi_transfer((byte)(erase_address>>16)); //address bits 23-16
spi_transfer((byte)(erase_address>>8)); //address bits 15-8
spi_transfer((byte)(erase_address)); //address bits 7-0
digitalWrite(CS, HIGH);
delay(10);
}
void write_eeprom(unsigned long address, byte data[])
{
write_enable();
digitalWrite(CS, LOW);
spi_transfer(WRITE);
spi_transfer((byte)(address>>16));
spi_transfer((byte)(address>>8));
spi_transfer((byte)(address));
for (int i=0; i<256; i++)
{
spi_transfer(data[i]);
delay(1);
}
digitalWrite(CS, HIGH);
delay(10);
}