ArduinoAm29F010

ArduinoAm29F010.cpp

4:47737a873a56
2015-01-19 Paul Boddie Renamed the source file to reflect the actual IC in use.
     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