28C64 EEPROM Programación usando Arduino

7

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.

    
pregunta Matthew R.

2 respuestas

4

El dispositivo tiene 13 pines de dirección, que deben especificar una dirección en binario de 0x0000 a 0x1FFF. ¿No has indicado que estás haciendo algo con ellos?

También, le sugiero que escriba un procedimiento writebyte que establece la salida de todos los cables de dirección y de datos y les asigna los valores adecuados, garantiza que WE y OE sean desactivados, afirma CE, afirma y libera WE y lanza CE, y un procedimiento de readbyte que establece la salida de todos los cables de dirección y les asigna los valores adecuados, establece la entrada de todos los cables de datos, confirma CE y OE, muestra todos los cables de datos y libera CE y OE. Eso hará que el resto de su código sea mucho más legible.

    
respondido por el supercat
1

Al mirar la hoja de datos en la página 12, se muestra un diagrama de tiempo y el Tiempo de acceso para habilitar el chip puede ser de hasta 250 nS. Si usa un AVR con un reloj > = 4MHz, puede estar en este tiempo y necesita algunos pequeños retrasos en su código de lectura, para comenzar, tal vez incluso pruebe con retrasos prolongados como lo hizo con el código de escritura hasta que sepa que está funcionando .

El mismo diagrama muestra que CE está siendo confirmado seguido de OE para un ciclo de lectura. Recomiendo seguir la misma secuencia y también cambiar la secuencia de escritura para seguir el diagrama en la página siguiente.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas