Estoy trabajando en una computadora Z80 y necesito escribir datos en una EEPROM. Estoy utilizando el chip Xicor 28C64AP-25 ( hoja de datos ). Escribí un programa para el Arduino Uno que escribe datos en las primeras 4 direcciones y luego vuelve a leer los datos. Ya que solo estoy usando los primeros tres pines de dirección, el resto está atado bajo. Aquí está mi código, perdón si parece demasiado desordenado:
#define WE 11
#define OE 12
#define CE 13
#define NUM_ADDR 3
int DP[8] = {A0, A1, A2, A3, A4, A5, 2, 3};
int AP[] = {4, 5, 6};
byte data[] = {0x3E, 0xAA, 0xD3, 0x00, 0xC3, 0x00, 0x00};
void setupDataBus(int mode) {
for (int i = 0; i < 8; i++) {
pinMode(DP[i], mode);
}
}
void setupControlPins(int mode) {
pinMode(WE, mode);
pinMode(OE, mode);
pinMode(CE, mode);
}
void setupAddressBus(int mode) {
for (int i = 0; i < NUM_ADDR; i++) {
pinMode(AP[i], mode);
}
}
void writeByte(int address, byte data) {
setupDataBus(OUTPUT);
setupAddressBus(OUTPUT);
setupControlPins(OUTPUT);
Serial.print("Write Byte: ");
for (int b = 0; b < 7; b++) {
digitalWrite(AP[b], bitRead(address, b));
}
Serial.print(address, HEX);
Serial.print(", ");
Serial.print(data, HEX);
Serial.println();
delay(1);
// Enable write
digitalWrite(OE, HIGH);
delay(1);
digitalWrite(CE, LOW);
delay(1);
delay(10);
for (int b = 0; b < 8; b++) {
digitalWrite(DP[b], bitRead(data, b));
}
unsigned long time_i, time_f;
time_i = micros();
// Start write
digitalWrite(WE, LOW);
// End write
digitalWrite(WE, HIGH);
time= micros();
Serial.println(time_f-time_i, DEC);
delay(1);
digitalWrite(OE, LOW);
delay(1);
digitalWrite(CE, HIGH);
delay(1);
}
byte readByte(int address) {
setupDataBus(INPUT);
setupAddressBus(OUTPUT);
setupControlPins(OUTPUT);
byte val;
digitalWrite(WE, HIGH);
delay(1);
digitalWrite(CE, HIGH);
delay(1);
digitalWrite(OE, HIGH);
delay(1);
Serial.print("Read Byte: ");
for (int b = 0; b < 7; b++) {
digitalWrite(AP[b], bitRead(address, b));
}
Serial.print(address, HEX);
Serial.print(", ");
delay(1);
digitalWrite(WE, HIGH);
delay(1);
digitalWrite(CE, LOW);
delay(1);
digitalWrite(OE, LOW);
delay(1);
for (int b = 0; b < 8; b++) {
bitWrite(val, b, digitalRead(DP[b]));
}
Serial.print(val, HEX);
delay(1);
digitalWrite(OE, HIGH);
delay(1);
digitalWrite(CE, HIGH);
delay(1);
digitalWrite(WE, HIGH);
Serial.println();
return val;
}
void setup() {
setupDataBus(OUTPUT);
setupAddressBus(OUTPUT);
pinMode(WE, OUTPUT);
pinMode(OE, OUTPUT);
pinMode(CE, OUTPUT);
Serial.begin(9600);
}
void loop() {
// init
digitalWrite(OE, HIGH);
digitalWrite(CE, HIGH);
digitalWrite(WE, HIGH);
Serial.println("Initializing pins for write...");
delay(1000);
for (int i = 0; i < sizeof(data); i++) {
writeByte(i, data[i]);
}
for (int i = 0; i < sizeof(data); i++) {
readByte(i);
}
while(true);
}
Todos esos delay
s son solo para asegurarse de que no vaya demasiado rápido para la EEPROM.
Puedo decir a través de algunos LED que el Arduino está enviando los datos correctos a los pines de E / S de la EEPROM, pero cuando leo los datos, todo lo que obtengo es 0xFF. Aquí está la salida en serie.
Initializing pins for write...
Write Byte: 0, 3E
/WE enable time: 12
Write Byte: 1, AA
/WE enable time: 12
Write Byte: 2, D3
/WE enable time: 12
Write Byte: 3, 0
/WE enable time: 12
Write Byte: 4, C3
/WE enable time: 12
Write Byte: 5, 0
/WE enable time: 12
Write Byte: 6, 0
/WE enable time: 12
Read Byte: 0, FF
Read Byte: 1, FF
Read Byte: 2, FF
Read Byte: 3, FF
Read Byte: 4, FF
Read Byte: 5, FF
Read Byte: 6, FF
He probado una versión anterior del programa anterior con un chip de RAM estático y todo funciona muy bien. Simplemente no funciona con la EEPROM.
Cualquier ayuda sería muy apreciada.