1.1 --- a/ArduinoAm29F010.cpp Tue Jan 20 19:33:23 2015 +0100
1.2 +++ b/ArduinoAm29F010.cpp Tue Jan 20 22:23:13 2015 +0100
1.3 @@ -1,10 +1,11 @@
1.4 -const int CE = A5, 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 +const int CE = A5, OE = A4, WE = A3,
1.9 + CS1 = 2, CS2 = 3,
1.10 + DQ0 = 4, DQ1 = 5, DQ2 = 6, DQ3 = 7,
1.11 + DQ4 = 8, DQ5 = 9, DQ6 = 10, DQ7 = 11;
1.12
1.13 const int BUFSIZE = 8;
1.14 char inbuffer[BUFSIZE];
1.15 +int nread = 0;
1.16
1.17 const char ERASE[][8] = {
1.18 "W5555AA", "W2AAA55", "W555580", "W5555AA", "W2AAA55"
1.19 @@ -132,26 +133,20 @@
1.20 digitalWrite(CE, HIGH);
1.21 }
1.22
1.23 -int readCommand(int nread, const char buffer[])
1.24 +int readCommand(const char buffer[])
1.25 {
1.26 int high, low;
1.27
1.28 - if (nread < 5)
1.29 - return 0;
1.30 -
1.31 high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.32 low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.33
1.34 return readOp(high, low);
1.35 }
1.36
1.37 -bool writeCommand(int nread, const char buffer[])
1.38 +bool writeCommand(const char buffer[])
1.39 {
1.40 int high, low, data;
1.41
1.42 - if (nread < 7)
1.43 - return false;
1.44 -
1.45 high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.46 low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.47 data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6]));
1.48 @@ -190,19 +185,16 @@
1.49 {
1.50 for (int i = 0; i < 5; i++)
1.51 {
1.52 - writeCommand(7, ERASE[i]);
1.53 + writeCommand(ERASE[i]);
1.54 }
1.55 writeOp(0x55, 0x55, 0x30);
1.56 return waitForCompletion(0, 0, 0xff);
1.57 }
1.58
1.59 -bool sectorErase(int nread, const char buffer[])
1.60 +bool sectorErase(const char buffer[])
1.61 {
1.62 int high;
1.63
1.64 - if (nread < 2)
1.65 - return false;
1.66 -
1.67 // 3-bit number shifted to A16...A14 with A16 discarded.
1.68 // Thus, only sectors from 0 to 3 are supported.
1.69
1.70 @@ -210,7 +202,7 @@
1.71
1.72 for (int i = 0; i < 5; i++)
1.73 {
1.74 - writeCommand(7, ERASE[i]);
1.75 + writeCommand(ERASE[i]);
1.76 }
1.77 writeOp(high, 0, 0x30);
1.78
1.79 @@ -219,20 +211,17 @@
1.80 return waitForCompletion(high, 0, 0xff);
1.81 }
1.82
1.83 -bool program(int nread, const char buffer[])
1.84 +bool program(const char buffer[])
1.85 {
1.86 int high, low, data;
1.87
1.88 - if (nread < 7)
1.89 - return false;
1.90 -
1.91 high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2]));
1.92 low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4]));
1.93 data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6]));
1.94
1.95 for (int i = 0; i < 3; i++)
1.96 {
1.97 - writeCommand(7, PROGRAM[i]);
1.98 + writeCommand(PROGRAM[i]);
1.99 }
1.100 writeOp(high, low, data);
1.101
1.102 @@ -263,26 +252,31 @@
1.103 // Interface loop.
1.104
1.105 Serial.println("?");
1.106 - Serial.setTimeout(3600000); // 1 hour
1.107 }
1.108
1.109 void loop()
1.110 {
1.111 - int nread = 0;
1.112 -
1.113 - if (nread = Serial.readBytesUntil('\n', inbuffer, BUFSIZE))
1.114 + if (nread += Serial.readBytesUntil('\n', inbuffer + nread, BUFSIZE - nread))
1.115 {
1.116 switch (inbuffer[0])
1.117 {
1.118 case 'R':
1.119 - Serial.println(readCommand(nread, inbuffer), HEX);
1.120 + if (nread >= 5)
1.121 + {
1.122 + Serial.println(readCommand(inbuffer), HEX);
1.123 + nread = 0;
1.124 + }
1.125 break;
1.126
1.127 case 'W':
1.128 - if (writeCommand(nread, inbuffer))
1.129 - Serial.println("W");
1.130 - else
1.131 - Serial.println("C");
1.132 + if (nread >= 7)
1.133 + {
1.134 + if (writeCommand(inbuffer))
1.135 + Serial.println("W");
1.136 + else
1.137 + Serial.println("C");
1.138 + nread = 0;
1.139 + }
1.140 break;
1.141
1.142 case 'E':
1.143 @@ -290,24 +284,34 @@
1.144 Serial.println("E");
1.145 else
1.146 Serial.println("C");
1.147 + nread = 0;
1.148 break;
1.149
1.150 case 'S':
1.151 - if (sectorErase(nread, inbuffer))
1.152 - Serial.println("S");
1.153 - else
1.154 - Serial.println("C");
1.155 + if (nread >= 2)
1.156 + {
1.157 + if (sectorErase(inbuffer))
1.158 + Serial.println("S");
1.159 + else
1.160 + Serial.println("C");
1.161 + nread = 0;
1.162 + }
1.163 break;
1.164
1.165 case 'P':
1.166 - if (program(nread, inbuffer))
1.167 - Serial.println("P");
1.168 - else
1.169 - Serial.println("C");
1.170 + if (nread >= 7)
1.171 + {
1.172 + if (program(inbuffer))
1.173 + Serial.println("P");
1.174 + else
1.175 + Serial.println("C");
1.176 + nread = 0;
1.177 + }
1.178 break;
1.179
1.180 default:
1.181 Serial.println(inbuffer[0]);
1.182 + nread = 0;
1.183 break;
1.184 }
1.185