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
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 ?