1.1 --- a/ArduinoAm29F010.cpp Sat Aug 29 18:00:34 2015 +0200
1.2 +++ b/ArduinoAm29F010.cpp Tue Sep 27 00:36:33 2016 +0200
1.3 @@ -1,7 +1,7 @@
1.4 /*
1.5 Interfacing the Arduino Duemilanove to Am29F010 devices.
1.6
1.7 -Copyright (C) 2015 Paul Boddie <paul@boddie.org.uk>
1.8 +Copyright (C) 2015, 2016 Paul Boddie <paul@boddie.org.uk>
1.9
1.10 This program is free software; you can redistribute it and/or modify it under
1.11 the terms of the GNU General Public License as published by the Free Software
1.12 @@ -17,7 +17,13 @@
1.13 */
1.14
1.15 const int CE = A5, OE = A4, WE = A3, A16 = A2,
1.16 - CS1 = 2, CS2 = 3,
1.17 +#ifdef CIRCUIT_74HC273
1.18 + CS1 = 2, CS2 = 3, /* using 74HC273 */
1.19 +#endif
1.20 +#ifdef CIRCUIT_74HC595
1.21 + SHIFT_SCK = 2, SHIFT_RCK = 3, /* using 74HC595 */
1.22 + SHIFT_SI = 12,
1.23 +#endif
1.24 DQ0 = 7, DQ1 = 6, DQ2 = 5, DQ3 = 4,
1.25 DQ4 = 8, DQ5 = 9, DQ6 = 10, DQ7 = 11;
1.26
1.27 @@ -109,6 +115,7 @@
1.28 }
1.29 }
1.30
1.31 +#ifdef CIRCUIT_74HC273
1.32 void setAddress(int high, int low)
1.33 {
1.34 /* The top bit is sent directly. */
1.35 @@ -131,6 +138,51 @@
1.36 delayMicroseconds(1);
1.37 digitalWrite(CS1, LOW);
1.38 }
1.39 +#endif
1.40 +
1.41 +#ifdef CIRCUIT_74HC595
1.42 +void writeAddress(int v)
1.43 +{
1.44 + int mask;
1.45 +
1.46 + for (mask = 0x80; mask; mask >>= 1)
1.47 + {
1.48 + if (v & mask)
1.49 + {
1.50 + digitalWrite(SHIFT_SI, HIGH);
1.51 + }
1.52 + else
1.53 + {
1.54 + digitalWrite(SHIFT_SI, LOW);
1.55 + }
1.56 +
1.57 + delayMicroseconds(1);
1.58 + digitalWrite(SHIFT_SCK, HIGH);
1.59 + delayMicroseconds(1);
1.60 + digitalWrite(SHIFT_SCK, LOW);
1.61 + }
1.62 +
1.63 + delayMicroseconds(1);
1.64 + digitalWrite(SHIFT_RCK, HIGH);
1.65 + delayMicroseconds(1);
1.66 + digitalWrite(SHIFT_RCK, LOW);
1.67 +}
1.68 +
1.69 +void setAddress(int high, int low)
1.70 +{
1.71 + /* The top bit is sent directly. */
1.72 +
1.73 + if (high & 0x100)
1.74 + digitalWrite(A16, HIGH);
1.75 + else
1.76 + digitalWrite(A16, LOW);
1.77 +
1.78 + /* The lower 16 bits are sent via the shift registers. */
1.79 +
1.80 + writeAddress(high);
1.81 + writeAddress(low);
1.82 +}
1.83 +#endif
1.84
1.85 int readOp(int high, int low)
1.86 {
1.87 @@ -282,8 +334,18 @@
1.88 pinMode(OE, OUTPUT);
1.89 pinMode(WE, OUTPUT);
1.90 pinMode(A16, OUTPUT);
1.91 +
1.92 +#ifdef CIRCUIT_74HC273
1.93 pinMode(CS1, OUTPUT);
1.94 pinMode(CS2, OUTPUT);
1.95 +#endif
1.96 +
1.97 +#ifdef CIRCUIT_74HC595
1.98 + pinMode(SHIFT_SCK, OUTPUT);
1.99 + pinMode(SHIFT_RCK, OUTPUT);
1.100 + pinMode(SHIFT_SI, OUTPUT);
1.101 +#endif
1.102 +
1.103 setDataOut();
1.104
1.105 // Initial state for the flash device.
1.106 @@ -295,8 +357,15 @@
1.107
1.108 // Initial state for the latches.
1.109
1.110 +#ifdef CIRCUIT_74HC273
1.111 digitalWrite(CS1, LOW);
1.112 digitalWrite(CS2, LOW);
1.113 +#endif
1.114 +
1.115 +#ifdef CIRCUIT_74HC595
1.116 + digitalWrite(SHIFT_SCK, LOW);
1.117 + digitalWrite(SHIFT_RCK, LOW);
1.118 +#endif
1.119
1.120 // Interface loop.
1.121