Testare un LH5116D-10 con arduino

Buonasera ragazzi, scusate la domanda, è da un po' che ho smesso di giocare con l'Arduino.
Secondo voi, è possibile con un Arduino Uno, testare un chip di questa ram ?

Il chip ha 11 pin di address (A0 .. A10), 8 pin di I/O e 3 pin di controllo ... ti occorrono 22 I/O ... usando TUTTI i pin digitali e quelli analogici come digitali ... comunque ti manca qualche pin ... meglio usare un Arduino MEGA 2560 che ha pin di I/O in abbondanza :wink:

Guglielmo

P.S.: allego datasheet: LH5116-10_to_LH5116N-10.pdf (91.1 KB)

E' da una vita che non scrivo una riga in c++, per cui se ho scritto fesserie portate pazienza.

// Definizione dei pin
const int addrPins[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}; // Pin per gli indirizzi A0-A10
const int dataPins[] = {40, 41, 42, 43, 44, 45, 46, 47}; // Pin per i dati I/O0-I/O7
const int csPin = 48;   // Pin per Chip Select (CS)
const int wePin = 49;   // Pin per Write Enable (WE)
const int oePin = 50;   // Pin per Output Enable (OE)

// Funzione di setup
void setup() {
  Serial.begin(9600);

  // Imposta i pin di controllo
  pinMode(csPin, OUTPUT);
  pinMode(wePin, OUTPUT);
  pinMode(oePin, OUTPUT);

  // Imposta i pin degli indirizzi come output
  for (int i = 0; i < 11; i++) {
    pinMode(addrPins[i], OUTPUT);
  }

  // Imposta i pin dei dati come output inizialmente (per scrittura)
  for (int i = 0; i < 8; i++) {
    pinMode(dataPins[i], OUTPUT);
  }

  // Disabilita il chip all'inizio
  digitalWrite(csPin, HIGH);
  digitalWrite(wePin, HIGH);
  digitalWrite(oePin, HIGH);
  
  // Test scrittura e lettura
  testRAM();
}

// Funzione per impostare un indirizzo
void setAddress(uint16_t address) {
  for (int i = 0; i < 11; i++) {
    digitalWrite(addrPins[i], (address >> i) & 0x01);
  }
}

// Funzione per impostare i dati
void writeData(uint8_t data) {
  for (int i = 0; i < 8; i++) {
    digitalWrite(dataPins[i], (data >> i) & 0x01);
  }
}

// Funzione per leggere i dati
uint8_t readData() {
  uint8_t data = 0;
  for (int i = 0; i < 8; i++) {
    data |= (digitalRead(dataPins[i]) << i);
  }
  return data;
}

// Funzione per scrivere su RAM
void writeToRAM(uint16_t address, uint8_t data) {
  setAddress(address);        // Imposta l'indirizzo
  writeData(data);            // Imposta i dati
  digitalWrite(csPin, LOW);   // Abilita il chip
  digitalWrite(wePin, LOW);   // Abilita la scrittura
  delayMicroseconds(10);      // Attendi il tempo di scrittura
  digitalWrite(wePin, HIGH);  // Disabilita la scrittura
  digitalWrite(csPin, HIGH);  // Disabilita il chip
}

// Funzione per leggere dalla RAM
uint8_t readFromRAM(uint16_t address) {
  setAddress(address);        // Imposta l'indirizzo

  // Imposta i pin dei dati come input per la lettura
  for (int i = 0; i < 8; i++) {
    pinMode(dataPins[i], INPUT);
  }

  digitalWrite(csPin, LOW);   // Abilita il chip
  digitalWrite(oePin, LOW);   // Abilita la lettura
  delayMicroseconds(10);      // Attendi il tempo di lettura
  uint8_t data = readData();  // Leggi i dati
  digitalWrite(oePin, HIGH);  // Disabilita la lettura
  digitalWrite(csPin, HIGH);  // Disabilita il chip

  // Riporta i pin dei dati come output
  for (int i = 0; i < 8; i++) {
    pinMode(dataPins[i], OUTPUT);
  }

  return data;
}

// Funzione di test per scrivere e leggere
void testRAM() {
  for (uint16_t address = 0; address < 2048; address++) {
    uint8_t data = address % 256;  // Scrive un valore di test
    writeToRAM(address, data);     // Scrivi su RAM
    uint8_t readData = readFromRAM(address);  // Leggi dalla RAM

    // Verifica se la lettura corrisponde alla scrittura
    if (readData == data) {
      Serial.print("Address: 0x");
      Serial.print(address, HEX);
      Serial.print(" Data Written: 0x");
      Serial.print(data, HEX);
      Serial.print(" Data Read: 0x");
      Serial.println(readData, HEX);
    } else {
      Serial.print("Error at Address: 0x");
      Serial.print(address, HEX);
      Serial.print(" Expected: 0x");
      Serial.print(data, HEX);
      Serial.print(" Got: 0x");
      Serial.println(readData, HEX);
    }
  }
}

void loop() {
  // Il test viene eseguito nel setup, il loop può rimanere vuoto
}

Ha senso ?