Hello,
I did what you have said and I studied the timing diagram of reading and writing operations (Special command / Sequence).
I also tested my code below but without any result.
Below is my code:
Writing:
#define SERIALDATA 10
#define SERIALCLK 12
#define STORECLK 11
#define WE A3
#define OE A4
#define CE A5
#define OUT 0
#define IN 1
unsigned int addr = 0;
int count = 0;
unsigned int unlock = 0;
void ChangeMode(byte io)
{
if (io) {
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
}
else
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
}
void setup()
{
Serial.begin(19200);
//Data read or write D0 - D7 - Pin9 - Pin2
ChangeMode(OUT);
//Shiftregister pins
pinMode(STORECLK, OUTPUT);
pinMode(SERIALCLK, OUTPUT);
pinMode(SERIALDATA, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
digitalWrite(WE, HIGH);
digitalWrite(CE, HIGH);
digitalWrite(OE, HIGH);
}
void loop()
{
Serial.println("START WRITING ...");
for (addr = 0; addr <= 0xFFF; addr++)
{
//Send address to the memory ...
digitalWrite(STORECLK, LOW);
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (addr>>8));
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (addr&0xFF));
digitalWrite(STORECLK, HIGH);
//write the same data ...
delay(1);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(WE, LOW); //Write disabled
digitalWrite(CE, LOW); //Chip disable
//Write 0x555
unlock = 0x555;
digitalWrite(STORECLK, LOW);
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (unlock>>8));
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (unlock&0xFF));
digitalWrite(STORECLK, HIGH);
delay(1);
//Write 0xAA
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
delayMicroseconds(10);
//Write 2AA
unlock = 0x2AA;
digitalWrite(STORECLK, LOW);
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (unlock>>8));
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (unlock&0xFF));
digitalWrite(STORECLK, HIGH);
delay(1);
//send 0x55 data
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
delayMicroseconds(10);
//Write again 0x555 §Sequence
unlock = 0x555;
digitalWrite(STORECLK, LOW);
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (unlock>>8));
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (unlock&0xFF));
digitalWrite(STORECLK, HIGH);
//Write 0xA0 command
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
delayMicroseconds(10);
digitalWrite(WE, HIGH);
digitalWrite(CE, HIGH);
}
Serial.print("FINAL STEP, PLEASE WAIT ");
for (int c = 0; c < 3; c++) {
Serial.print(".");
delay(1000);
}
delay(1000);
Serial.println("");
Serial.println("WRITING COMPLETE.");
while(1)
delay(50);
}
Reading:
#define SERIALDATA 10
#define SERIALCLK 12
#define STORECLK 11
#define WE A3
#define OE A4
#define CE A5
#define OUT 0
#define IN 1
unsigned int addr = 0;
byte data = 0;
int counter = 0;
boolean val = LOW;
void ChangeMode(byte io)
{
if (io) {
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
}
else
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
}
void setup()
{
Serial.begin(19200);
//Data read or write D0 - D7 - Pin9 - Pin2
ChangeMode(IN);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
//Shiftregister pins
pinMode(STORECLK, OUTPUT);
pinMode(SERIALCLK, OUTPUT);
pinMode(SERIALDATA, OUTPUT);
//Command register - default
digitalWrite(WE, HIGH);
digitalWrite(CE, HIGH);
digitalWrite(OE, HIGH);
}
void loop()
{
Serial.println("START READING");
for (addr = 0; addr < 0xFFF; addr++)
{
digitalWrite(STORECLK, LOW);
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (addr>>8));
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (addr&0xFF));
digitalWrite(STORECLK, HIGH);
digitalWrite(CE, LOW);
digitalWrite(OE, LOW);
delayMicroseconds(7);
for (int i = 2, j = 0; i <= 9; i++, j++)
{
val = digitalRead(i);
if (val == HIGH)
bitWrite(data, j, HIGH);
}
digitalWrite(CE, HIGH);
digitalWrite(OE, HIGH);
Serial.print(data, HEX);
Serial.print(" ");
if (++counter == 32) {
Serial.println("");
counter = 0;
}
}
Serial.println("");
Serial.println("READING FINISH");
while(1);
}
The reading always return 0xFF even if I execute the write code. Really, I don't understand why it's so easy when you read the datasheet but in real world is much complicated.
The datasheet is in the attachement file for a person who want to help me.
Thanks in advance.
AM29F040B.pdf (826 KB)