|
|
@ -0,0 +1,98 @@ |
|
|
|
#define ADDR0 22
|
|
|
|
#define DATA0 2
|
|
|
|
#define DATA8 41
|
|
|
|
#define WE 10
|
|
|
|
#define OE 11
|
|
|
|
#define LWR_CE 12
|
|
|
|
#define UPR_CE 13
|
|
|
|
|
|
|
|
void setup() |
|
|
|
{ |
|
|
|
for(int i = 0; i <= 18; i++) |
|
|
|
{ |
|
|
|
pinMode(i + ADDR0, OUTPUT); |
|
|
|
} |
|
|
|
|
|
|
|
pinMode(WE, OUTPUT); |
|
|
|
pinMode(OE, OUTPUT); |
|
|
|
pinMode(LWR_CE, OUTPUT); |
|
|
|
pinMode(UPR_CE, OUTPUT); |
|
|
|
Serial.begin(57600); |
|
|
|
} |
|
|
|
|
|
|
|
bool writing = false; |
|
|
|
long numBytes = 0; |
|
|
|
long pos = 0; |
|
|
|
void loop() |
|
|
|
{ |
|
|
|
if(!writing && Serial.available() >= 2) |
|
|
|
{ |
|
|
|
//0xBEEF means we just started
|
|
|
|
byte in1 = Serial.read(); |
|
|
|
byte in2 = Serial.read(); |
|
|
|
if(in1 == 0xBE && in2 == 0xEF) |
|
|
|
{ |
|
|
|
writing = true; |
|
|
|
//Next thing received will be # bytes
|
|
|
|
numBytes = Serial.parseInt(); |
|
|
|
Serial.read(); //next byte is garbage, used as a separator
|
|
|
|
pos = 0; |
|
|
|
setData(OUTPUT); |
|
|
|
digitalWrite(OE, HIGH); |
|
|
|
digitalWrite(WE, HIGH); |
|
|
|
digitalWrite(LWR_CE, LOW); |
|
|
|
digitalWrite(UPR_CE, LOW); |
|
|
|
Serial.println("OK"); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(writing && Serial.available() >= 2) |
|
|
|
{ |
|
|
|
writeAddr(pos++); |
|
|
|
writeDataLwr(Serial.read()); |
|
|
|
writeDataUpr(Serial.read()); |
|
|
|
digitalWrite(WE, LOW); |
|
|
|
delay(5); |
|
|
|
digitalWrite(WE, HIGH); |
|
|
|
|
|
|
|
if(--numBytes == 0) //We're done
|
|
|
|
{ |
|
|
|
writing = false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void setData(int dir) |
|
|
|
{ |
|
|
|
for(int i = 0; i < 8; i++) |
|
|
|
{ |
|
|
|
pinMode(i + DATA0, dir); |
|
|
|
pinMode(i + DATA8, dir); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void writeAddr(long addr) |
|
|
|
{ |
|
|
|
for(int i = 0; i <= 18; i++) |
|
|
|
{ |
|
|
|
digitalWrite(ADDR0 + i, addr & 1); |
|
|
|
addr >>= 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void writeDataLwr(byte data) |
|
|
|
{ |
|
|
|
for(int i = 0; i < 8; i++) |
|
|
|
{ |
|
|
|
digitalWrite(DATA0 + i, data & 1); |
|
|
|
data >>= 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void writeDataUpr(byte data) |
|
|
|
{ |
|
|
|
for(int i = 0; i < 8; i++) |
|
|
|
{ |
|
|
|
digitalWrite(DATA8 + i, data & 1); |
|
|
|
data >>= 1; |
|
|
|
} |
|
|
|
} |