I'm testing some nec d43256c ram chips, but all I can ever read back is 1's from the data lines. I'm not sure what could be wrong with my code .... I've added some additional delays, etc to see if that helped, but nothing changes.
I'm addressing the 14 address lines through 2 shift registers. I tested that circuit, and it appears to be working correctly.
ram datasheet: UPD43256C-12L Datasheet pdf - 32768 x 8-bit static MIX-MOS RAM, 120ns, low power - NEC
// quick arduino sketch to test d43256c ram w/ shift registers
#define SERIAL 2
#define LATCH 3
#define CLOCK 4
#define DATA0 5
#define DATA1 6
#define DATA2 7
#define DATA3 8
#define DATA4 9
#define DATA5 10
#define DATA6 16
#define DATA7 14
#define WE 15
#define OE 18
void setup()
{
pinMode(SERIAL, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA0, OUTPUT);
pinMode(DATA1, OUTPUT);
pinMode(DATA2, OUTPUT);
pinMode(DATA3, OUTPUT);
pinMode(DATA4, OUTPUT);
pinMode(DATA5, OUTPUT);
pinMode(DATA6, OUTPUT);
pinMode(DATA7, OUTPUT);
pinMode(WE, OUTPUT);
pinMode(OE, OUTPUT);
Serial.begin(9600);
}
void sendData(unsigned data)
{
pinMode(DATA0, OUTPUT);
pinMode(DATA1, OUTPUT);
pinMode(DATA2, OUTPUT);
pinMode(DATA3, OUTPUT);
pinMode(DATA4, OUTPUT);
pinMode(DATA5, OUTPUT);
pinMode(DATA6, OUTPUT);
pinMode(DATA7, OUTPUT);
digitalWrite(OE, HIGH);
// 14 addr lines
for(unsigned addr = 0; addr <= 0b11111111111111; addr++)
{
//digitalWrite(WE, LOW);-- ORIG
digitalWrite(WE, HIGH);
// set address
digitalWrite(LATCH, LOW);
//shiftOut(SERIAL, CLOCK, LSBFIRST, addr);
//shiftOut(SERIAL, CLOCK, LSBFIRST, addr>>8);
shiftOut(SERIAL, CLOCK, MSBFIRST, addr>>8);
shiftOut(SERIAL, CLOCK, MSBFIRST, addr);
digitalWrite(LATCH, HIGH);
delayMicroseconds(120);
// set data. Sadly the pins arent all on a single port.
digitalWrite(DATA0, data | (1));
digitalWrite(DATA1, data | (1<<1));
digitalWrite(DATA2, data | (1<<2));
digitalWrite(DATA3, data | (1<<3));
digitalWrite(DATA4, data | (1<<4));
digitalWrite(DATA5, data | (1<<5));
digitalWrite(DATA6, data | (1<<6));
digitalWrite(DATA7, data | (1<<7));
// end the write cycle
//digitalWrite(WE, HIGH);
digitalWrite(WE, LOW);
// I think this is the right delay time...
delayMicroseconds(120);
}
}
void verifyData(unsigned data)
{
pinMode(DATA0, INPUT);
pinMode(DATA1, INPUT);
pinMode(DATA2, INPUT);
pinMode(DATA3, INPUT);
pinMode(DATA4, INPUT);
pinMode(DATA5, INPUT);
pinMode(DATA6, INPUT);
pinMode(DATA7, INPUT);
digitalWrite(OE, LOW);
digitalWrite(WE, HIGH);
// 14 addr lines
for(unsigned addr = 0; addr <= 0b11111111111111; addr++)
{
// set address
digitalWrite(LATCH, LOW);
//shiftOut(SERIAL, CLOCK, LSBFIRST, addr);
//shiftOut(SERIAL, CLOCK, LSBFIRST, addr>>8);
shiftOut(SERIAL, CLOCK, MSBFIRST, addr>>8);
shiftOut(SERIAL, CLOCK, MSBFIRST, addr);
digitalWrite(LATCH, HIGH);
// address access time
delayMicroseconds(120);
unsigned currentByte = digitalRead(DATA0) | (digitalRead(DATA1)<<1) |
(digitalRead(DATA2)<<2) | (digitalRead(DATA3)<<3) |
(digitalRead(DATA4)<<4) | (digitalRead(DATA5)<<5) |
(digitalRead(DATA6)<<6) | (digitalRead(DATA7)<<7);
if (currentByte != data)
{
Serial.print("Error found at addr: ");
Serial.print(addr, BIN);
Serial.print(" Read: ");
Serial.print(currentByte, BIN);
Serial.print(" Expected: ");
Serial.println(data, BIN);
}
}
}
void loop()
{
while (Serial.available() <= 0)
{
Serial.println("enter any text to start");
delay(50);
}
Serial.write("starting");
// write 4 different repeating values and read them back
Serial.println("Testing 0x00");
unsigned data = 0;
sendData(data);
verifyData(data);
data = 0xFF;
Serial.println("Testing 0xFF");
sendData(data);
verifyData(data);
Serial.println("Testing 0b10101010");
data = 0b10101010;
sendData(data);
verifyData(data);
Serial.println("Testing 0b01010101");
data = 0b01010101;
sendData(data);
verifyData(data);
Serial.println("Finished");
}