1.1 --- a/ArduinoAm29F010.cpp Mon Jan 19 12:27:44 2015 +0100
1.2 +++ b/ArduinoAm29F010.cpp Mon Jan 19 20:43:36 2015 +0100
1.3 @@ -4,7 +4,11 @@
1.4 DQ4 = 10, DQ5 = 11, DQ6 = 12, DQ7 = 13;
1.5
1.6 const int BUFSIZE = 8;
1.7 -char buffer[BUFSIZE];
1.8 +char inbuffer[BUFSIZE];
1.9 +
1.10 +const char CHIP_ERASE[] = "W5555AA\nW2AAA55\nW555580\nW5555AA\nW2AAA55\nW555510\n";
1.11 +const char SECTOR_ERASE[] = "W5555AA\nW2AAA55\nW555580\nW5555AA\nW2AAA55\n";
1.12 +const char PROGRAM[] = "W5555AA\nW2AAA55\nW5555A0\n";
1.13
1.14 int fromHex(char c)
1.15 {
1.16 @@ -41,14 +45,11 @@
1.17 pinMode(DQ7, INPUT);
1.18 }
1.19
1.20 -int readData()
1.21 +int sampleData()
1.22 {
1.23 int i = DQ7;
1.24 int data = 0;
1.25
1.26 - setDataIn();
1.27 - delay(10);
1.28 -
1.29 while (1)
1.30 {
1.31 data += digitalRead(i);
1.32 @@ -58,6 +59,16 @@
1.33 data <<= 1;
1.34 }
1.35
1.36 + return data;
1.37 +}
1.38 +
1.39 +int readData()
1.40 +{
1.41 + int data = 0;
1.42 +
1.43 + setDataIn();
1.44 + delay(10);
1.45 + data = sampleData();
1.46 setDataOut();
1.47 return data;
1.48 }
1.49 @@ -90,15 +101,9 @@
1.50 digitalWrite(CS1, LOW);
1.51 }
1.52
1.53 -int readOutput(int nread)
1.54 +int readOp(int high, int low)
1.55 {
1.56 - int high, low, data;
1.57 -
1.58 - if (nread < 5)
1.59 - return 0;
1.60 -
1.61 - high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.62 - low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.63 + int data;
1.64
1.65 digitalWrite(CE, LOW);
1.66 setAddress(high, low);
1.67 @@ -112,7 +117,32 @@
1.68 return data;
1.69 }
1.70
1.71 -bool writeOutput(int nread)
1.72 +void writeOp(int high, int low, int data)
1.73 +{
1.74 + digitalWrite(CE, LOW);
1.75 + setAddress(high, low);
1.76 + delay(10);
1.77 + digitalWrite(WE, LOW);
1.78 + writeData(data);
1.79 + delay(10);
1.80 + digitalWrite(WE, HIGH);
1.81 + digitalWrite(CE, HIGH);
1.82 +}
1.83 +
1.84 +int readCommand(int nread, const char buffer[])
1.85 +{
1.86 + int high, low;
1.87 +
1.88 + if (nread < 5)
1.89 + return 0;
1.90 +
1.91 + high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.92 + low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.93 +
1.94 + return readOp(high, low);
1.95 +}
1.96 +
1.97 +bool writeCommand(int nread, const char buffer[])
1.98 {
1.99 int high, low, data;
1.100
1.101 @@ -123,22 +153,86 @@
1.102 low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.103 data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6]));
1.104
1.105 - digitalWrite(CE, LOW);
1.106 - setAddress(high, low);
1.107 - delay(10);
1.108 - digitalWrite(WE, LOW);
1.109 - writeData(data);
1.110 - delay(10);
1.111 - digitalWrite(WE, HIGH);
1.112 - digitalWrite(CE, HIGH);
1.113 + writeOp(high, low, data);
1.114
1.115 return true;
1.116 }
1.117
1.118 +bool waitForCompletion(int high, int low, int written)
1.119 +{
1.120 + int data;
1.121 +
1.122 + setDataIn();
1.123 + digitalWrite(CE, LOW);
1.124 +
1.125 + do
1.126 + {
1.127 + delay(10);
1.128 + digitalWrite(OE, LOW);
1.129 + delay(10);
1.130 + data = sampleData();
1.131 + delay(10);
1.132 + digitalWrite(OE, HIGH);
1.133 + Serial.println(data, BIN);
1.134 + } while (
1.135 + ((data & 0x80) != (written & 0x80)) &&
1.136 + ((data & 0x20) == 0)
1.137 + );
1.138 +
1.139 + digitalWrite(CE, HIGH);
1.140 + setDataOut();
1.141 +
1.142 + return ((data & 0x20) == 0);
1.143 +}
1.144 +
1.145 +bool chipErase()
1.146 +{
1.147 + writeCommand(sizeof(CHIP_ERASE), CHIP_ERASE);
1.148 + return waitForCompletion(0, 0, 0xff);
1.149 +}
1.150 +
1.151 +bool sectorErase(int nread, const char buffer[])
1.152 +{
1.153 + int high;
1.154 +
1.155 + if (nread < 2)
1.156 + return false;
1.157 +
1.158 + // 3-bit number shifted to A16...A14 with A16 discarded.
1.159 + // Thus, only sectors from 0 to 3 are supported.
1.160 +
1.161 + high = (fromHex(buffer[1]) << 6) & 0xff;
1.162 +
1.163 + writeCommand(sizeof(SECTOR_ERASE), SECTOR_ERASE);
1.164 + writeOp(high, 0, 0x30);
1.165 +
1.166 + // Result of erase if 0xff written to all locations.
1.167 +
1.168 + return waitForCompletion(high, 0, 0xff);
1.169 +}
1.170 +
1.171 +bool program(int nread, const char buffer[])
1.172 +{
1.173 + int high, low, data;
1.174 +
1.175 + if (nread < 7)
1.176 + return false;
1.177 +
1.178 + // 3-bit number shifted to A16...A14 with A16 discarded.
1.179 + // Thus, only sectors from 0 to 3 are supported.
1.180 +
1.181 + high = (fromHex(buffer[1]) << 6) & 0xff;
1.182 + low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.183 + data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6]));
1.184 +
1.185 + writeCommand(sizeof(PROGRAM), PROGRAM);
1.186 + writeOp(high, low, data);
1.187 +
1.188 + return waitForCompletion(high, low, data);
1.189 +}
1.190 +
1.191 void setup()
1.192 {
1.193 - int nread = 0;
1.194 -
1.195 Serial.begin(115200);
1.196 pinMode(CE, OUTPUT);
1.197 pinMode(OE, OUTPUT);
1.198 @@ -162,33 +256,53 @@
1.199
1.200 Serial.println("?");
1.201 Serial.setTimeout(3600000); // 1 hour
1.202 +}
1.203
1.204 - while (nread = Serial.readBytesUntil('\n', buffer, BUFSIZE))
1.205 +void loop()
1.206 +{
1.207 + int nread = 0;
1.208 +
1.209 + if (nread = Serial.readBytesUntil('\n', inbuffer, BUFSIZE))
1.210 {
1.211 - switch (buffer[0])
1.212 + switch (inbuffer[0])
1.213 {
1.214 case 'R':
1.215 - Serial.println(readOutput(nread), HEX);
1.216 + Serial.println(readCommand(nread, inbuffer), HEX);
1.217 break;
1.218
1.219 case 'W':
1.220 - if (writeOutput(nread))
1.221 + if (writeCommand(nread, inbuffer))
1.222 Serial.println("W");
1.223 else
1.224 Serial.println("C");
1.225 break;
1.226
1.227 + case 'E':
1.228 + if (chipErase())
1.229 + Serial.println("E");
1.230 + else
1.231 + Serial.println("C");
1.232 + break;
1.233 +
1.234 + case 'S':
1.235 + if (sectorErase(nread, inbuffer))
1.236 + Serial.println("S");
1.237 + else
1.238 + Serial.println("C");
1.239 + break;
1.240 +
1.241 + case 'P':
1.242 + if (program(nread, inbuffer))
1.243 + Serial.println("P");
1.244 + else
1.245 + Serial.println("C");
1.246 + break;
1.247 +
1.248 default:
1.249 Serial.println("?");
1.250 break;
1.251 }
1.252 }
1.253 -
1.254 - Serial.println("Done.");
1.255 -}
1.256 -
1.257 -void loop()
1.258 -{
1.259 }
1.260
1.261 extern "C" void __cxa_pure_virtual(void) {