Probando un DS1245Y con Arduino

Introducción:

El DS1245Y es una memoria RAM que incorpora una pequeña batería interna. Cuando se interrumpe la alimentación la batería puede conservar el contenido de la memoria durante 10 años.

El DS1245Y contiene 1024K de memoria direccionables a través de un bus paralelo de 17 bits. Para este ejercicio voy a utilizar únicamente los dos primeros bits (A0 y A1). El resto quedará conectado a GND.

Conexión:

Bus de direcciones:
Pin 2, 3, 4, 5, 6, 7, 8, 9, 23, 25, 26, 27, 28, 30 (A2-A16) -> GND
Pin 11 (A1) -> 8
Pin 12 (A0) -> 9

Bus de datos:
Pin 13,14,15,17,18,19,20,21 (DQ0 – DQ7) -> 10 – 17

Control:
~WE -> 7
~OE -> 6
~CE -> 5

 
ds1245y.h

#ifndef DS1245Y_H
#define DS1245Y_H

#include "Arduino.h"

class DS1245 {
public:
    DS1245();   //Constructor
    void setAddress (long address);
	void setData(unsigned char data);
    unsigned char read (long address);
    void write (long address, unsigned char data);    
};

#endif

ds1245y.cpp

#include "ds1245y.h"

// BUS DE DATOS
#define DQ0 10
#define DQ1 11
#define DQ2 12
#define DQ3 13
#define DQ4 14
#define DQ5 15
#define DQ6 16
#define DQ7 17

// address
#define A0 9
#define A1 8
// ...

// Control
#define WE 7
#define OE 6
#define CE 5


// Constructor
DS1245::DS1245() {  
    pinMode (A0, OUTPUT);
    pinMode (A1, OUTPUT);
    
    // Durante la inicialización pongo el DS1245 en 
    // modo lectura para evitar escrituras indeseadas
    pinMode (WE, OUTPUT); digitalWrite(WE, 1);
    pinMode (OE, OUTPUT); digitalWrite(OE, 0);
    pinMode (CE, OUTPUT); digitalWrite(CE, 0) ;
    pinMode (OE, OUTPUT); digitalWrite(OE, 1);
    pinMode (CE, OUTPUT); digitalWrite(CE, 1) ;
}


void DS1245::setAddress(long address){
	// Solo voy a direccionar los 4 primeros bytes
    digitalWrite (A0, ((address & 1) == 1) ? 1 : 0 );
    digitalWrite (A1, ((address & 2) == 2) ? 1 : 0 );
}

void DS1245::setData (unsigned char data) {
    digitalWrite (DQ0, (data & 1) == 1);
    digitalWrite (DQ1, (data & 2) == 2);
    digitalWrite (DQ2, (data & 4) == 4);
    digitalWrite (DQ3, (data & 8) == 8);
    digitalWrite (DQ4, (data & 16) == 16);
    digitalWrite (DQ5, (data & 32) == 32);
    digitalWrite (DQ6, (data & 64) == 64);
    digitalWrite (DQ7, (data & 128) == 128);
}


unsigned char DS1245::read (long address){
    unsigned char data;
    pinMode (DQ0, INPUT);
    pinMode (DQ1, INPUT);
    pinMode (DQ2, INPUT);
    pinMode (DQ3, INPUT);
    pinMode (DQ4, INPUT);
    pinMode (DQ5, INPUT);
    pinMode (DQ6, INPUT);
    pinMode (DQ7, INPUT);
  
    setAddress(address);
    
    digitalWrite(WE, HIGH);
    digitalWrite(CE, LOW);
    digitalWrite(OE, LOW);

    data = (digitalRead(DQ0) << 0);
    data += (digitalRead(DQ1) << 1);
    data += (digitalRead(DQ2) << 2);
    data += (digitalRead(DQ3) << 3);
    data += (digitalRead(DQ4) << 4);
    data += (digitalRead(DQ5) << 5);
    data += (digitalRead(DQ6) << 6);
	data += (digitalRead(DQ7) << 7);

    digitalWrite(CE, HIGH);
    digitalWrite(OE, HIGH);
    return data;
}


void DS1245::write (long address, unsigned char data){
    pinMode (DQ0, OUTPUT);
    pinMode (DQ1, OUTPUT);
    pinMode (DQ2, OUTPUT);
    pinMode (DQ3, OUTPUT);
    pinMode (DQ4, OUTPUT);
    pinMode (DQ5, OUTPUT);
    pinMode (DQ6, OUTPUT);
    pinMode (DQ7, OUTPUT);
    
    setAddress(address);

	digitalWrite(WE, LOW);
    digitalWrite(CE, LOW);
    digitalWrite(OE, HIGH);
    
    setData (data);
        
    digitalWrite(WE, HIGH);
    digitalWrite(CE, HIGH);
    digitalWrite(OE, HIGH);
}

sketch.ino

#include "ds1245y.h"

DS1245 memory;
unsigned char data[3];

void readMemory() {
    for (int i = 0; i < 4; i++) {
        Serial.print (memory.read(i));
        Serial.print (" ");
    }
    Serial.println("");   
}


void writeMemory () {
    for (int i=0; i<4; i++) {
        memory.write(i, data[i]);
    }
}


void setup()
{
   Serial.begin(9600);
    
    // Leyendo datos de la memoria
    readMemory();
    
    // Escribiendo valores
    data[0] = 10; data[1] = 20; data[2] = 30; data [3] = 40;
    writeMemory();
    
    // leyendo de nuevo
    readMemory();
    
    // Escribiendo nuevos valores
    data[0] = 50; data[1] = 60; data[2] = 70; data [3] = 80;
    writeMemory();
    
    // leyendo de nuevo
    readMemory();
}

void loop() {}

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Time limit is exhausted. Please reload CAPTCHA.