Hi Pito,
As requested, this is code that I have wrote. Erase function still remain for later when write and read are functionnal:
#define SERIALDATA 10
#define SERIALCLK 12
#define LATCH 11
#define WE A3
#define OE A4
#define CE A5
#define A18 A0
#define A17 A1
#define A16 A2
#define OUT 0
#define IN 1
//Change pinMode of D0- D7
void flash_change_pins_mode(boolean io)
{
if (io) {
for (int i = 2; i < 10; i++)
pinMode(i, INPUT);
}
else
{
for (int i = 2; i < 10; i++)
pinMode(i, OUTPUT);
}
}
void flash_ctrl_deselect()
{
digitalWrite(OE, HIGH);
digitalWrite(WE, HIGH);
digitalWrite(CE, HIGH);
}
void flash_ctrl_rd_enable()
{
digitalWrite(CE, LOW);
digitalWrite(OE, LOW);
}
void flash_ctrl_rd_disable()
{
digitalWrite(CE, HIGH);
digitalWrite(OE, HIGH);
}
void flash_ctrl_wr_enable()
{
digitalWrite(CE, LOW);
digitalWrite(WE, LOW);
}
void flash_ctrl_wr_disable()
{
digitalWrite(CE, HIGH);
digitalWrite(WE, HIGH);
}
void flash_addr_set(unsigned int address)
{
digitalWrite(LATCH, LOW);
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (address>>8));
shiftOut(SERIALDATA, SERIALCLK, MSBFIRST, (address&0xFF));
digitalWrite(LATCH, HIGH);
}
void flash_data_set(byte data)
{
flash_change_pins_mode(OUT);
for (int i = 0; i < 8; i++)
{
if (data&bit(i))
digitalWrite(i+2, HIGH);
else
digitalWrite(i+2, LOW);
}
}
byte flash_data_get()
{
byte data = 0;
boolean state = LOW;
flash_change_pins_mode(IN);
for (int i = 2, j = 0; i <= 9; i++, j++)
{
state = digitalRead(i);
if (state == HIGH)
bitWrite(data, j, HIGH);
}
return data;
}
byte flash_read(unsigned int address)
{
byte data = 0;
flash_ctrl_deselect();
flash_change_pins_mode(IN);
flash_addr_set(address);
flash_ctrl_rd_enable();
delayMicroseconds(7);
data = flash_data_get();
flash_ctrl_rd_disable();
return data;
}
boolean flash_get_DQ7()
{
boolean state = LOW;
pinMode(9, INPUT);
state = digitalRead(9);
if (state == HIGH)
return true;
else return false;
}
boolean flash_get_DQ6()
{
unsigned long duration = 0;
pinMode(8, INPUT);
duration = pulseIn(8, HIGH);
if (duration > 0)
return true;
else return false;
}
boolean flash_get_DQ5()
{
boolean state = LOW;
pinMode(7, INPUT);
state = digitalRead(7);
if (state == HIGH)
return true;
else return false;
}
boolean flash_get_DQ3()
{
boolean state = LOW;
pinMode(5, INPUT);
state = digitalRead(5);
if (state == HIGH)
return true;
else return false;
}
boolean flash_get_DQ2()
{
boolean state = LOW;
pinMode(4, INPUT);
state = digitalRead(4);
if (state == HIGH)
return true;
else return false;
}
//Check data
boolean flash_byte_write_poll()
{
boolean state = LOW;
state = flash_get_DQ7();
if (state)
return true; //Under process
else return false; //Done
}
//Sequence/Command
void flash_write_command(unsigned int address, byte data)
{
flash_change_pins_mode(OUT);
flash_addr_set(address);
flash_data_set(data);
}
void flash_write(unsigned int address, byte data)
{
flash_ctrl_deselect();
flash_change_pins_mode(OUT);
//Set address and data
flash_addr_set(address);
flash_data_set(data);
flash_ctrl_wr_enable();
//Send command sequence
flash_write_command(0x555, 0xAA);
flash_write_command(0x2AA, 0x55);
flash_write_command(0x555, 0xA0);
flash_ctrl_wr_disable();
}
void flash_erase()
{
}
void setup()
{
Serial.begin(9600);
//Init A16 - A18 flash pins
pinMode(A17, OUTPUT);
pinMode(A16, OUTPUT);
pinMode(A18, OUTPUT);
//Init pin's shoft register
pinMode(LATCH, OUTPUT);
pinMode(SERIALCLK, OUTPUT);
pinMode(SERIALDATA, OUTPUT);
//Init flash command pins
pinMode(WE, OUTPUT);
pinMode(CE, OUTPUT);
pinMode(OE, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
{
if (Serial.read() == 'r') {
int count = 0;
Serial.println("");
for (unsigned int addr = 0; addr < 0xFF; addr++) {
Serial.print(flash_read(addr), HEX);
Serial.print(" ");
if (++count == 15) {
Serial.println("");
count = 0;
}
}
}
Serial.flush();
}
if (Serial.available() > 0)
{
if (Serial.read() == 'w')
{
for (unsigned int addr = 0; addr < 100; addr++)
{
byte value = 0xAB;
Serial.println("");
flash_write(addr, value);
while (flash_byte_write_poll()) {
Serial.print("*");
delay(5);
}
Serial.print("Byte ");
Serial.print(addr);
Serial.println(" Written");
}
Serial.println("Operation complete");
}
Serial.flush();
}
}
I tested it out but still no result.
There is one thing which I can't understand why I should execute device command at last ? shouldn't be at first ?
What I'm supposed to do now ?
Thanks.