Hi, recently I bought 27c512 512kb EEPROM. I reprogramed Arduino, from which I want to write data on it, several times for the past week (deleting code, writing it again) and without surprises, it didn't work every time. I was looking into its datasheet on the internet.
I got all the circuits: 5 volts, 13 volts(needed for writing data) and GND to chip enable (CE) and switching between 5 and 6.5 volts on Vcc line with the button. I am 5/13 volts / GND switching with optocouplers but 6.5 volts with the button. I just press it when in serial monitor counts to 0 (you will see in code). I get 6.5 volts from resistor divider.
So, I think I manage to read data from EEPROM but not write it on it. Last time I program the Arduino to do it I got weird data from it (writing binary 10, giving me binary 8 ).
I am programming it from Arduino Mega and I have only 8 address pins connected to Arduino, other address lines are hooked up to GND.
Here is my last code witch works best from all. Here is the code:
#define CE 52
#define OE5 50
#define OE13 51
void setup() {
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT); //address
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(A6, OUTPUT);
pinMode(A7, OUTPUT);
pinMode(A8, OUTPUT);
pinMode(A9, OUTPUT);
pinMode(A10, OUTPUT);
pinMode(A11, OUTPUT);
pinMode(A12, OUTPUT); //data
pinMode(A13, OUTPUT);
pinMode(A14, OUTPUT);
pinMode(A15, OUTPUT);
pinMode(CE, OUTPUT); //chip enable (CE (enable low!))
digitalWrite(CE, HIGH);
pinMode(OE5, OUTPUT); //5V into OE
pinMode(OE13, OUTPUT); //13V into OE
digitalWrite(OE5, HIGH);
digitalWrite(OE13, LOW);
digitalWrite(A0, LOW);
digitalWrite(A1, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);
digitalWrite(A5, LOW);
digitalWrite(A6, LOW);
digitalWrite(A7, LOW);
digitalWrite(A8, LOW);
digitalWrite(A9, LOW);
digitalWrite(A10, LOW);
digitalWrite(A11, LOW);
digitalWrite(A12, LOW);
digitalWrite(A13, LOW);
digitalWrite(A14, LOW);
digitalWrite(A15, LOW);
Serial.begin(9600);
}
void loop() {
Serial.println("READY"); //counts down so I can press button...
delay(2000);
Serial.println("3");
delay(1000);
Serial.println("2");
delay(1000);
Serial.println("1"); //...here
delay(1000);
Serial.println("WRITING...");
eeFlash(0, 10);
Serial.println("DONE - reading in 2s");
delay(2000);
Serial.println();
Serial.println(eeRead(0));
while (true);
}
void toAddress(int adr) {
digitalWrite(A0, HIGH && (adr & B00000001));
digitalWrite(A1, HIGH && (adr & B00000010));
digitalWrite(A2, HIGH && (adr & B00000100));
digitalWrite(A3, HIGH && (adr & B00001000)); //setting address lines from int to binary
digitalWrite(A4, HIGH && (adr & B00010000));
digitalWrite(A5, HIGH && (adr & B00100000));
digitalWrite(A6, HIGH && (adr & B01000000));
digitalWrite(A7, HIGH && (adr & B10000000));
}
void setData(int dat) {
pinMode(A8, OUTPUT);
pinMode(A9, OUTPUT);
pinMode(A10, OUTPUT);
pinMode(A11, OUTPUT);
pinMode(A12, OUTPUT); //data
pinMode(A13, OUTPUT);
pinMode(A14, OUTPUT);
pinMode(A15, OUTPUT);
digitalWrite(A8, HIGH && (dat & B00000001));
digitalWrite(A9, HIGH && (dat & B00000010));
digitalWrite(A10, HIGH && (dat & B00000100));
digitalWrite(A11, HIGH && (dat & B00001000)); //setting data lines from int to binary
digitalWrite(A12, HIGH && (dat & B00010000));
digitalWrite(A13, HIGH && (dat & B00100000));
digitalWrite(A14, HIGH && (dat & B01000000));
digitalWrite(A15, HIGH && (dat & B10000000));
}
int chk;
int eeCheck() {
chk = 0;
pinMode(A8, INPUT);
pinMode(A9, INPUT);
pinMode(A10, INPUT);
pinMode(A11, INPUT);
pinMode(A12, INPUT); //data
pinMode(A13, INPUT);
pinMode(A14, INPUT);
pinMode(A15, INPUT);
delay(10);
chk = chk+digitalRead(A8);
chk = chk << 1;
chk = chk+digitalRead(A9);
chk = chk << 1;
chk = chk+digitalRead(A10);
chk = chk << 1;
chk = chk+digitalRead(A11); //shifting data and combining signals to number
chk = chk << 1;
chk = chk+digitalRead(A12);
chk = chk << 1;
chk = chk+digitalRead(A13);
chk = chk << 1;
chk = chk+digitalRead(A14);
chk = chk << 1;
chk = chk+digitalRead(A15);
Serial.println(nibbleShift(chk), BIN);
return nibbleShift(chk);
}
int data;
void eeFlash(int adr, int val) {
digitalWrite(OE5, LOW);
digitalWrite(OE13, HIGH);
digitalWrite(CE, HIGH);
toAddress(adr);
setData(val);
delay(10);
digitalWrite(CE, LOW);
delay(100);
digitalWrite(CE, HIGH); //I thing here somewhere is a problem
delay(10);
digitalWrite(OE5, LOW);
digitalWrite(OE13, LOW);
delay(10);
digitalWrite(CE, LOW);
delay(10);
data = eeCheck();
Serial.print(data, BIN);
Serial.println(" --> " + String(data));
digitalWrite(CE, HIGH);
digitalWrite(OE5, HIGH);
}
int eeRead(int adr) {
toAddress(adr);
digitalWrite(CE, LOW);
digitalWrite(OE5, LOW);
digitalWrite(OE13, LOW);
delay(5);
data = eeCheck();
digitalWrite(CE, HIGH);
digitalWrite(OE5, HIGH);
return data;
}
int nibbleShift(int num) { //function for inverting byte (ex.: 10100011 --> 11000101)
int var = 0;
int i, x, y, p;
int s = 8; // number of bits in 'num'. (This case a 8bit nibble)
for (i = 0; i < (s / 2); i++) {
p = s - i - 1;
x = num & (1 << p);
x = x >> p;
y = num & (1 << i);
y = y >> i;
var = var | (x << i);
var = var | (y << p);
}
return var;
}
And this is what I get on Serial:
READY
3
2
1
WRITING...
1010
1010 --> 10
DONE - reading in 2s
1000
8
Am I doing it right? I checked it several times from datasheet and it looks ok from my perspective.