I'm trying to write to and read from an AT93C46D eeprom using an Arduino UNO but for some reason the output I'm getting is not what I expect.
The eeprom has a data structure of 128 words of 8 bits each and I'm trying to write 10000010 to each word. When reading back the data however I get 11000001. When I write 00000000 to all words I get 10000000 for all words when reading. I tested my code on 2 AT93C46D eeproms and both gave the same result.
It looks like the MSB is always 1 (when reading) for some reason.
I'm probably making a stupid mistake but I can't seem to find it, any help is greatly appreciated!
Datasheet: http://www.atmel.com/images/atmel-5193-seeprom-at93c46d-datasheet.pdf
#include<SPI.h>
#define DATAOUT 11//MOSI
#define DATAIN 12//MISO
#define SPICLOCK 13//sck
#define SS 10//ss
void setup()
{
pinMode(SS,OUTPUT);
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK,OUTPUT);
digitalWrite(SS,LOW);
Serial.begin(9600);
SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));
fill();
dump();
}
void loop()
{
}
void fill()
{
Serial.println("Send EWEN opcode");
digitalWrite(SS,HIGH);
SPI.transfer(B10011); //EWEN
SPI.transfer(B0000000);
digitalWrite(SS,LOW);
delay(100);
for (int i=0; i < 128; i++) {
digitalWrite(SS,HIGH);
SPI.transfer(B101);
SPI.transfer(i);
SPI.transfer(B10000010);
delay(10);
digitalWrite(SS,LOW);
}
delay(100);
Serial.println("Send EWDS opcode");
digitalWrite(SS,HIGH);
SPI.transfer(B1000); //EWDS
SPI.transfer(B00000000);
digitalWrite(SS,LOW);
delay(10);
}
void dump(){
Serial.println("Dumping AT93C46D");
byte b;
for (int i=0; i < 128; i++) {
digitalWrite(SS,HIGH);
SPI.transfer(B110); //read opcode
SPI.transfer(i);
b = SPI.transfer(B00000000); //clock data out
digitalWrite(SS,LOW);
Serial.println(b, BIN);
}
}
B10011
? Don't you meanB10011000
? – Gerben Feb 25 '16 at 13:43