# HG changeset patch # User Paul Boddie # Date 1421627228 -3600 # Node ID 47737a873a56c0e1cbef146509f624d913c5b4b2 # Parent fd32e1d619ab7cac50cc07c54911c8db3e1c808e Renamed the source file to reflect the actual IC in use. diff -r fd32e1d619ab -r 47737a873a56 ArduinoAm29F010.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ArduinoAm29F010.cpp Mon Jan 19 01:27:08 2015 +0100 @@ -0,0 +1,198 @@ +const int CE = A5, OE = 2, WE = 3, + CS1 = 4, CS2 = 5, + DQ0 = 6, DQ1 = 7, DQ2 = 8, DQ3 = 9, + DQ4 = 10, DQ5 = 11, DQ6 = 12, DQ7 = 13; + +const int BUFSIZE = 8; +char buffer[BUFSIZE]; + +int fromHex(char c) +{ + if ((c >= 48) && (c <= 57)) + return c - 48; + if ((c >= 65) && (c <= 70)) + return c - 65 + 10; + if ((c >= 97) && (c <= 102)) + return c - 97 + 10; + return 0; +} + +void setDataOut() +{ + pinMode(DQ0, OUTPUT); + pinMode(DQ1, OUTPUT); + pinMode(DQ2, OUTPUT); + pinMode(DQ3, OUTPUT); + pinMode(DQ4, OUTPUT); + pinMode(DQ5, OUTPUT); + pinMode(DQ6, OUTPUT); + pinMode(DQ7, OUTPUT); +} + +void setDataIn() +{ + pinMode(DQ0, INPUT); + pinMode(DQ1, INPUT); + pinMode(DQ2, INPUT); + pinMode(DQ3, INPUT); + pinMode(DQ4, INPUT); + pinMode(DQ5, INPUT); + pinMode(DQ6, INPUT); + pinMode(DQ7, INPUT); +} + +int readData() +{ + int i = DQ7; + int data = 0; + + setDataIn(); + delay(10); + + while (1) + { + data += digitalRead(i); + if (i == DQ0) + break; + i--; + data <<= 1; + } + + setDataOut(); + return data; +} + +void writeData(int data) +{ + int i = DQ0; + + while (1) + { + digitalWrite(i, data % 2); + if (i == DQ7) + break; + i++; + data >>= 1; + } +} + +void setAddress(int high, int low) +{ + writeData(high); + delayMicroseconds(1); + digitalWrite(CS2, HIGH); + delayMicroseconds(1); + digitalWrite(CS2, LOW); + writeData(low); + delayMicroseconds(1); + digitalWrite(CS1, HIGH); + delayMicroseconds(1); + digitalWrite(CS1, LOW); +} + +int readOutput(int nread) +{ + int high, low, data; + + if (nread < 5) + return 0; + + high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2])); + low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4])); + + digitalWrite(CE, LOW); + setAddress(high, low); + delay(10); + digitalWrite(OE, LOW); + data = readData(); + delay(10); + digitalWrite(OE, HIGH); + digitalWrite(CE, HIGH); + + return data; +} + +bool writeOutput(int nread) +{ + int high, low, data; + + if (nread < 7) + return false; + + high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2])); + low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4])); + data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6])); + + digitalWrite(CE, LOW); + setAddress(high, low); + delay(10); + digitalWrite(WE, LOW); + writeData(data); + delay(10); + digitalWrite(WE, HIGH); + digitalWrite(CE, HIGH); + + return true; +} + +void setup() +{ + int nread = 0; + + Serial.begin(115200); + pinMode(CE, OUTPUT); + pinMode(OE, OUTPUT); + pinMode(WE, OUTPUT); + pinMode(CS1, OUTPUT); + pinMode(CS2, OUTPUT); + setDataOut(); + + // Initial state for the flash device. + + digitalWrite(CE, HIGH); + digitalWrite(OE, HIGH); + digitalWrite(WE, HIGH); + + // Initial state for the latches. + + digitalWrite(CS1, LOW); + digitalWrite(CS2, LOW); + + // Interface loop. + + Serial.println("?"); + Serial.setTimeout(3600000); // 1 hour + + while (nread = Serial.readBytesUntil('\n', buffer, BUFSIZE)) + { + switch (buffer[0]) + { + case 'R': + Serial.println(readOutput(nread), HEX); + break; + + case 'W': + if (writeOutput(nread)) + Serial.println("W"); + else + Serial.println("C"); + break; + + default: + Serial.println("?"); + break; + } + } + + Serial.println("Done."); +} + +void loop() +{ +} + +extern "C" void __cxa_pure_virtual(void) { + while(1); +} + +// tabstop=4 expandtab shiftwidth=4 diff -r fd32e1d619ab -r 47737a873a56 ArduinoAm29F010B.cpp --- a/ArduinoAm29F010B.cpp Mon Jan 19 01:26:38 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -const int CE = A5, OE = 2, WE = 3, - CS1 = 4, CS2 = 5, - DQ0 = 6, DQ1 = 7, DQ2 = 8, DQ3 = 9, - DQ4 = 10, DQ5 = 11, DQ6 = 12, DQ7 = 13; - -const int BUFSIZE = 8; -char buffer[BUFSIZE]; - -int fromHex(char c) -{ - if ((c >= 48) && (c <= 57)) - return c - 48; - if ((c >= 65) && (c <= 70)) - return c - 65 + 10; - if ((c >= 97) && (c <= 102)) - return c - 97 + 10; - return 0; -} - -void setDataOut() -{ - pinMode(DQ0, OUTPUT); - pinMode(DQ1, OUTPUT); - pinMode(DQ2, OUTPUT); - pinMode(DQ3, OUTPUT); - pinMode(DQ4, OUTPUT); - pinMode(DQ5, OUTPUT); - pinMode(DQ6, OUTPUT); - pinMode(DQ7, OUTPUT); -} - -void setDataIn() -{ - pinMode(DQ0, INPUT); - pinMode(DQ1, INPUT); - pinMode(DQ2, INPUT); - pinMode(DQ3, INPUT); - pinMode(DQ4, INPUT); - pinMode(DQ5, INPUT); - pinMode(DQ6, INPUT); - pinMode(DQ7, INPUT); -} - -int readData() -{ - int i = DQ7; - int data = 0; - - setDataIn(); - delay(10); - - while (1) - { - data += digitalRead(i); - if (i == DQ0) - break; - i--; - data <<= 1; - } - - setDataOut(); - return data; -} - -void writeData(int data) -{ - int i = DQ0; - - while (1) - { - digitalWrite(i, data % 2); - if (i == DQ7) - break; - i++; - data >>= 1; - } -} - -void setAddress(int high, int low) -{ - writeData(high); - delayMicroseconds(1); - digitalWrite(CS2, HIGH); - delayMicroseconds(1); - digitalWrite(CS2, LOW); - writeData(low); - delayMicroseconds(1); - digitalWrite(CS1, HIGH); - delayMicroseconds(1); - digitalWrite(CS1, LOW); -} - -int readOutput(int nread) -{ - int high, low, data; - - if (nread < 5) - return 0; - - high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2])); - low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4])); - - digitalWrite(CE, LOW); - setAddress(high, low); - delay(10); - digitalWrite(OE, LOW); - data = readData(); - delay(10); - digitalWrite(OE, HIGH); - digitalWrite(CE, HIGH); - - return data; -} - -bool writeOutput(int nread) -{ - int high, low, data; - - if (nread < 7) - return false; - - high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2])); - low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4])); - data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6])); - - digitalWrite(CE, LOW); - setAddress(high, low); - delay(10); - digitalWrite(WE, LOW); - writeData(data); - delay(10); - digitalWrite(WE, HIGH); - digitalWrite(CE, HIGH); - - return true; -} - -void setup() -{ - int nread = 0; - - Serial.begin(115200); - pinMode(CE, OUTPUT); - pinMode(OE, OUTPUT); - pinMode(WE, OUTPUT); - pinMode(CS1, OUTPUT); - pinMode(CS2, OUTPUT); - setDataOut(); - - // Initial state for the flash device. - - digitalWrite(CE, HIGH); - digitalWrite(OE, HIGH); - digitalWrite(WE, HIGH); - - // Initial state for the latches. - - digitalWrite(CS1, LOW); - digitalWrite(CS2, LOW); - - // Interface loop. - - Serial.println("?"); - Serial.setTimeout(3600000); // 1 hour - - while (nread = Serial.readBytesUntil('\n', buffer, BUFSIZE)) - { - switch (buffer[0]) - { - case 'R': - Serial.println(readOutput(nread), HEX); - break; - - case 'W': - if (writeOutput(nread)) - Serial.println("W"); - else - Serial.println("C"); - break; - - default: - Serial.println("?"); - break; - } - } - - Serial.println("Done."); -} - -void loop() -{ -} - -extern "C" void __cxa_pure_virtual(void) { - while(1); -} - -// tabstop=4 expandtab shiftwidth=4