1 const int CE = A5, OE = 2, WE = 3, 2 CS1 = 4, CS2 = 5, 3 DQ0 = 6, DQ1 = 7, DQ2 = 8, DQ3 = 9, 4 DQ4 = 10, DQ5 = 11, DQ6 = 12, DQ7 = 13; 5 6 const int BUFSIZE = 8; 7 char buffer[BUFSIZE]; 8 9 int fromHex(char c) 10 { 11 if ((c >= 48) && (c <= 57)) 12 return c - 48; 13 if ((c >= 65) && (c <= 70)) 14 return c - 65 + 10; 15 if ((c >= 97) && (c <= 102)) 16 return c - 97 + 10; 17 return 0; 18 } 19 20 void setDataOut() 21 { 22 pinMode(DQ0, OUTPUT); 23 pinMode(DQ1, OUTPUT); 24 pinMode(DQ2, OUTPUT); 25 pinMode(DQ3, OUTPUT); 26 pinMode(DQ4, OUTPUT); 27 pinMode(DQ5, OUTPUT); 28 pinMode(DQ6, OUTPUT); 29 pinMode(DQ7, OUTPUT); 30 } 31 32 void setDataIn() 33 { 34 pinMode(DQ0, INPUT); 35 pinMode(DQ1, INPUT); 36 pinMode(DQ2, INPUT); 37 pinMode(DQ3, INPUT); 38 pinMode(DQ4, INPUT); 39 pinMode(DQ5, INPUT); 40 pinMode(DQ6, INPUT); 41 pinMode(DQ7, INPUT); 42 } 43 44 int readData() 45 { 46 int i = DQ7; 47 int data = 0; 48 49 setDataIn(); 50 delay(10); 51 52 while (1) 53 { 54 data += digitalRead(i); 55 if (i == DQ0) 56 break; 57 i--; 58 data <<= 1; 59 } 60 61 setDataOut(); 62 return data; 63 } 64 65 void writeData(int data) 66 { 67 int i = DQ0; 68 69 while (1) 70 { 71 digitalWrite(i, data % 2); 72 if (i == DQ7) 73 break; 74 i++; 75 data >>= 1; 76 } 77 } 78 79 void setAddress(int high, int low) 80 { 81 writeData(high); 82 delayMicroseconds(1); 83 digitalWrite(CS2, HIGH); 84 delayMicroseconds(1); 85 digitalWrite(CS2, LOW); 86 writeData(low); 87 delayMicroseconds(1); 88 digitalWrite(CS1, HIGH); 89 delayMicroseconds(1); 90 digitalWrite(CS1, LOW); 91 } 92 93 int readOutput(int nread) 94 { 95 int high, low, data; 96 97 if (nread < 5) 98 return 0; 99 100 high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2])); 101 low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4])); 102 103 digitalWrite(CE, LOW); 104 setAddress(high, low); 105 delay(10); 106 digitalWrite(OE, LOW); 107 data = readData(); 108 delay(10); 109 digitalWrite(OE, HIGH); 110 digitalWrite(CE, HIGH); 111 112 return data; 113 } 114 115 bool writeOutput(int nread) 116 { 117 int high, low, data; 118 119 if (nread < 7) 120 return false; 121 122 high = (fromHex(buffer[1]) << 4) + (fromHex(buffer[2])); 123 low = (fromHex(buffer[3]) << 4) + (fromHex(buffer[4])); 124 data = (fromHex(buffer[5]) << 4) + (fromHex(buffer[6])); 125 126 digitalWrite(CE, LOW); 127 setAddress(high, low); 128 delay(10); 129 digitalWrite(WE, LOW); 130 writeData(data); 131 delay(10); 132 digitalWrite(WE, HIGH); 133 digitalWrite(CE, HIGH); 134 135 return true; 136 } 137 138 void setup() 139 { 140 int nread = 0; 141 142 Serial.begin(115200); 143 pinMode(CE, OUTPUT); 144 pinMode(OE, OUTPUT); 145 pinMode(WE, OUTPUT); 146 pinMode(CS1, OUTPUT); 147 pinMode(CS2, OUTPUT); 148 setDataOut(); 149 150 // Initial state for the flash device. 151 152 digitalWrite(CE, HIGH); 153 digitalWrite(OE, HIGH); 154 digitalWrite(WE, HIGH); 155 156 // Initial state for the latches. 157 158 digitalWrite(CS1, LOW); 159 digitalWrite(CS2, LOW); 160 161 // Interface loop. 162 163 Serial.println("?"); 164 Serial.setTimeout(3600000); // 1 hour 165 166 while (nread = Serial.readBytesUntil('\n', buffer, BUFSIZE)) 167 { 168 switch (buffer[0]) 169 { 170 case 'R': 171 Serial.println(readOutput(nread), HEX); 172 break; 173 174 case 'W': 175 if (writeOutput(nread)) 176 Serial.println("W"); 177 else 178 Serial.println("C"); 179 break; 180 181 default: 182 Serial.println("?"); 183 break; 184 } 185 } 186 187 Serial.println("Done."); 188 } 189 190 void loop() 191 { 192 } 193 194 extern "C" void __cxa_pure_virtual(void) { 195 while(1); 196 } 197 198 // tabstop=4 expandtab shiftwidth=4