I'm learning parallel interfacing and I'm using an 8Kx8 SRAM from Cypress (CY7C185) in DIP28 format.
I use 3 74HC595 S/P shift registers, 1 74HC165 P/S shift register and an Arduino Uno.
I used 2 of the 74HC595 s/r to translate the address from serial to parallel, the other 74HC595 to read/write the data through the I/O bus of the RAM and the 74HC165 P/S s/r to convert the read data from parallel to serial.
In attachment you'll find the schematic of my project. The pins on the left are the Arduino pins.
This is my code. It simply tries to write some data into the SRAM and them tries to write the values into the EEPROM of the uC for a further check.
/* CONNECTION TEST TO A SRAM CHIP OF 8Kx8
USING 2 74595 SHIFT REGISTERS TO MANAGE THE ADDRESS,
1 74595 TO MANAGE THE DATA TO BE READ/WRITTEN INTO THE RAM
AND 1 74165 P/S SHIFT REG. TO READ DATA FROM RAM
*/
#include <EEPROM.h>
// Connecting the pins
//1st and 2nd 595
#define data1pin 0 //pin DS
#define latch1pin 1 //pin ST_CP
#define clock1pin 2 //pin SH_CP
//3rd chip 595
#define data2pin 8 //pin DS
#define latch2pin 9 //pin ST_CP
#define clock2pin 10 //pin SH_CP
//this is common for all the 3 595s
#define master_reset 3 //pin MR/ of the 3 chips
//SRAM Chip
#define ram_we 4 //pin WE/
#define ram_ce2 5 //pin CE2
#define ram_oe 6 //pin OE/
#define ram_ce1 7 //pin CE1/
//chip 165
#define clock3pin 11 //pin CP
#define set_load 12 //pin PL/
#define load_data 13 //pin Q7
/* SRAM
TO WRITE:
CE1/ -> LOW
WE/ -> LOW
CE2 -> HIGH
OE/ -> LOW
TO READ:
WE/ -> HIGH
CE1/ -> LOW
OE/ -> LOW
CE2 -> HIGH
*/
#define READ 2 //RAM status: prepare it for reading
#define WRITE 1 //RAM status: prepare it for writing
#define DISABLE 0 //RAM status: disable it
void clear_shift_registers() {
//cleans the internal registers of the 595 s/r
//avoiding old datas to be read instead of new ones
digitalWrite(master_reset, LOW);
delay(50);
digitalWrite(master_reset, HIGH);
}
void set_ram(byte stato) {
switch (stato) {
case DISABLE:
digitalWrite(ram_ce1, HIGH);
digitalWrite(ram_oe, HIGH);
digitalWrite(ram_ce2, LOW);
digitalWrite(ram_we, HIGH);
break;
case WRITE:
digitalWrite(ram_ce1, LOW);
digitalWrite(ram_ce2, HIGH);
digitalWrite(ram_we, LOW);
digitalWrite(ram_oe, LOW);
break;
case READ:
digitalWrite(ram_ce1, LOW);
digitalWrite(ram_ce2, HIGH);
digitalWrite(ram_oe, LOW);
digitalWrite(ram_we, HIGH);
break;
}
}
void setup() {
//initial pin setup
//
pinMode(master_reset, OUTPUT);
//pin of the shift registers 1, 2 and 3: OUTPUT
pinMode(latch1pin, OUTPUT);
pinMode(clock1pin, OUTPUT);
pinMode(data1pin, OUTPUT);
pinMode(data2pin, OUTPUT);
pinMode(clock2pin, OUTPUT);
pinMode(latch2pin, OUTPUT);
//RAM pins: OUTPUT
pinMode(ram_we, OUTPUT);
pinMode(ram_ce1, OUTPUT);
pinMode(ram_ce2, OUTPUT);
pinMode(ram_oe, OUTPUT);
//S/r 165
pinMode(clock3pin, OUTPUT);
pinMode(set_load, OUTPUT);
pinMode(load_data, INPUT);
//initialize
clear_shift_registers();
}
void loop() {
unsigned int indirizzo; //the address to be used
byte valore = 0; //the value to be used
int eeprom_pointer = 0; //pointer to EEPROM location
// clear 10 locations in the SRAM and then write a sequence of numbers
for (indirizzo = 0; indirizzo <10; indirizzo++) {
scrivi_ram(indirizzo,valore);
valore += 3;
EEPROM.write(eeprom_pointer, valore);
eeprom_pointer++;
delay(10);
}
delay(1000);
//read the first 10 bytes and then write them into the uC EEPROM
for (indirizzo = 10; indirizzo < 20; indirizzo++) {
valore = leggi_ram(indirizzo);
EEPROM.write(eeprom_pointer, valore);
delay(10);
}
delay(5000);
//delay
}
void scrivi_ram(unsigned int indirizzo, byte valore) {
byte hbyte, lbyte;
//write the address into the shift registers 1 and 2
clear_shift_registers();
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
hbyte = highByte(indirizzo);
lbyte = lowByte(indirizzo);
shiftOut(data1pin, clock1pin, MSBFIRST, hbyte);
shiftOut(data1pin, clock1pin, MSBFIRST, lbyte);
//write the value into the 3rd s/r
shiftOut(data2pin, clock2pin, MSBFIRST, valore);
//write the value into the RAM
set_ram(WRITE);
digitalWrite(latch1pin, HIGH);
digitalWrite(latch2pin, HIGH);
delay(10);
//disable all the chips
set_ram(DISABLE);
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
}
byte leggi_ram(unsigned int indirizzo) {
byte valore, hbyte, lbyte;
//read the content of the byte "indirizzo"
//write the address
clear_shift_registers();
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
hbyte = highByte(indirizzo);
lbyte = lowByte(indirizzo);
shiftOut(data1pin, clock1pin, MSBFIRST, hbyte);
shiftOut(data1pin, clock1pin, MSBFIRST, lbyte);
//wake up the SRAM and set it for reading
digitalWrite(latch1pin, HIGH);
digitalWrite(latch2pin, HIGH);
set_ram(READ);
digitalWrite(clock3pin, HIGH);
digitalWrite(set_load, LOW);
delayMicroseconds(5);
digitalWrite(set_load, HIGH);
set_ram(DISABLE);
shiftIn(load_data, clock3pin, valore);
digitalWrite(latch1pin, LOW);
digitalWrite(latch2pin, LOW);
return valore;
}
But reading the EEPROM I only get the values written in the first 10 bytes during the first pass, when my code tries to write to the SRAM, but I don't find any value in the last 10 bytes (I only find the default values, $FF).
I cannot understand how to pilot this device.
EDIT: I uploaded an english version of the code, to better understand my ideas