1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/ArduinoAm29F010B.cpp Sun Jan 18 19:48:44 2015 +0100
1.3 @@ -0,0 +1,191 @@
1.4 +const int CE = 1, OE = 2, WE = 3,
1.5 + CS1 = 4, CS2 = 5,
1.6 + DQ0 = 6, DQ1 = 7, DQ2 = 8, DQ3 = 9,
1.7 + DQ4 = 10, DQ5 = 11, DQ6 = 12, DQ7 = 13;
1.8 +
1.9 +const int BUFSIZE = 8;
1.10 +char buffer[BUFSIZE];
1.11 +
1.12 +int fromHex(char c)
1.13 +{
1.14 + if ((c >= 48) && (c <= 57))
1.15 + return c - 48;
1.16 + if ((c >= 65) && (c <= 70))
1.17 + return c - 65 + 10;
1.18 + if ((c >= 97) && (c <= 102))
1.19 + return c - 97 + 10;
1.20 + return 0;
1.21 +}
1.22 +
1.23 +void setDataOut()
1.24 +{
1.25 + pinMode(DQ0, OUTPUT);
1.26 + pinMode(DQ1, OUTPUT);
1.27 + pinMode(DQ2, OUTPUT);
1.28 + pinMode(DQ3, OUTPUT);
1.29 + pinMode(DQ4, OUTPUT);
1.30 + pinMode(DQ5, OUTPUT);
1.31 + pinMode(DQ6, OUTPUT);
1.32 + pinMode(DQ7, OUTPUT);
1.33 +}
1.34 +
1.35 +void setDataIn()
1.36 +{
1.37 + pinMode(DQ0, INPUT);
1.38 + pinMode(DQ1, INPUT);
1.39 + pinMode(DQ2, INPUT);
1.40 + pinMode(DQ3, INPUT);
1.41 + pinMode(DQ4, INPUT);
1.42 + pinMode(DQ5, INPUT);
1.43 + pinMode(DQ6, INPUT);
1.44 + pinMode(DQ7, INPUT);
1.45 +}
1.46 +
1.47 +int readData()
1.48 +{
1.49 + int i = DQ7;
1.50 + int data = 0;
1.51 +
1.52 + setDataIn();
1.53 + delayMicroseconds(1);
1.54 +
1.55 + while (1)
1.56 + {
1.57 + data += digitalRead(i);
1.58 + if (i == DQ0)
1.59 + break;
1.60 + i--;
1.61 + data <<= 1;
1.62 + }
1.63 +
1.64 + setDataOut();
1.65 + return data;
1.66 +}
1.67 +
1.68 +void writeData(int data)
1.69 +{
1.70 + int i = DQ0;
1.71 +
1.72 + while (1)
1.73 + {
1.74 + digitalWrite(i, data % 2);
1.75 + if (i == DQ7)
1.76 + break;
1.77 + i++;
1.78 + data >>= 1;
1.79 + }
1.80 +}
1.81 +
1.82 +void setAddress(int high, int low)
1.83 +{
1.84 + writeData(high);
1.85 + delayMicroseconds(1);
1.86 + digitalWrite(CS2, HIGH);
1.87 + delayMicroseconds(1);
1.88 + digitalWrite(CS2, LOW);
1.89 + writeData(low);
1.90 + delayMicroseconds(1);
1.91 + digitalWrite(CS1, HIGH);
1.92 + delayMicroseconds(1);
1.93 + digitalWrite(CS1, LOW);
1.94 +}
1.95 +
1.96 +int readOutput(int nread)
1.97 +{
1.98 + int high, low, data;
1.99 +
1.100 + if (nread < 5)
1.101 + return 0;
1.102 +
1.103 + high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.104 + low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.105 +
1.106 + setAddress(high, low);
1.107 + digitalWrite(OE, LOW);
1.108 + data = readData();
1.109 + digitalWrite(OE, HIGH);
1.110 +
1.111 + return data;
1.112 +}
1.113 +
1.114 +bool writeOutput(int nread)
1.115 +{
1.116 + int high, low, data;
1.117 +
1.118 + if (nread < 7)
1.119 + return false;
1.120 +
1.121 + high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.122 + low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.123 + data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6]));
1.124 +
1.125 + setAddress(high, low);
1.126 + digitalWrite(WE, LOW);
1.127 + writeData(data);
1.128 + digitalWrite(WE, HIGH);
1.129 +
1.130 + return true;
1.131 +}
1.132 +
1.133 +void setup()
1.134 +{
1.135 + int nread = 0;
1.136 +
1.137 + Serial.begin(115200);
1.138 + pinMode(CE, OUTPUT);
1.139 + pinMode(OE, OUTPUT);
1.140 + pinMode(WE, OUTPUT);
1.141 + pinMode(CS1, OUTPUT);
1.142 + pinMode(CS2, OUTPUT);
1.143 + setDataOut();
1.144 +
1.145 + // Initial state for the flash device.
1.146 +
1.147 + digitalWrite(CE, HIGH);
1.148 + digitalWrite(OE, HIGH);
1.149 + digitalWrite(WE, HIGH);
1.150 +
1.151 + // Initial state for the latches.
1.152 +
1.153 + digitalWrite(CS1, LOW);
1.154 + digitalWrite(CS2, LOW);
1.155 +
1.156 + // Interface loop.
1.157 +
1.158 + Serial.print("? ");
1.159 + Serial.setTimeout(3600000); // 1 hour
1.160 +
1.161 + while (nread = Serial.readBytesUntil('\n', buffer, BUFSIZE))
1.162 + {
1.163 + switch (buffer[0])
1.164 + {
1.165 + case 'R':
1.166 + Serial.println(readOutput(nread), HEX);
1.167 + break;
1.168 +
1.169 + case 'W':
1.170 + if (writeOutput(nread))
1.171 + Serial.println("Written.");
1.172 + else
1.173 + Serial.println("Command?");
1.174 + break;
1.175 +
1.176 + default:
1.177 + break;
1.178 + }
1.179 +
1.180 + Serial.print("? ");
1.181 + }
1.182 +
1.183 + Serial.println("Done.");
1.184 +}
1.185 +
1.186 +void loop()
1.187 +{
1.188 +}
1.189 +
1.190 +extern "C" void __cxa_pure_virtual(void) {
1.191 + while(1);
1.192 +}
1.193 +
1.194 +// tabstop=4 expandtab shiftwidth=4