mirror of
https://github.com/TomNisbet/TommyPROM.git
synced 2024-12-22 09:29:38 +00:00
add support for M27C256
This commit is contained in:
parent
69508f5d95
commit
8ec224cb61
@ -35,6 +35,7 @@ class PromDevice
|
|||||||
virtual ERET disableSoftwareWriteProtect() { return RET_NOT_SUPPORT; }
|
virtual ERET disableSoftwareWriteProtect() { return RET_NOT_SUPPORT; }
|
||||||
virtual ERET enableSoftwareWriteProtect() { return RET_NOT_SUPPORT; }
|
virtual ERET enableSoftwareWriteProtect() { return RET_NOT_SUPPORT; }
|
||||||
virtual ERET erase(uint32_t start, uint32_t end) { return RET_NOT_SUPPORT; }
|
virtual ERET erase(uint32_t start, uint32_t end) { return RET_NOT_SUPPORT; }
|
||||||
|
virtual bool is_readback_safe() { return true; }
|
||||||
|
|
||||||
uint32_t debugBlockWrites; // Number of block write operations
|
uint32_t debugBlockWrites; // Number of block write operations
|
||||||
uint32_t debugLastAddress; // Last address with an issue
|
uint32_t debugLastAddress; // Last address with an issue
|
||||||
|
@ -17,10 +17,11 @@
|
|||||||
* 27 or 27C series parallel EPROM using the Arduino. Supported chips
|
* 27 or 27C series parallel EPROM using the Arduino. Supported chips
|
||||||
* include 2716, 2732, 2764, 27C040, and 27C2001.
|
* include 2716, 2732, 2764, 27C040, and 27C2001.
|
||||||
*
|
*
|
||||||
* Intelligent programming algorithms, like TurboProgram, are supported.
|
* Intelligent programming algorithms, like TurboProgram and Presto II, are supported.
|
||||||
* These allow a variable number of shorter program pulses until the byte
|
* These allow a variable number of shorter program pulses until the byte verifies. This
|
||||||
* verifies. This is optionally followed by an overprogram pulse that is
|
* is optionally followed by an overprogram pulse that is a multiple of the number of
|
||||||
* a multiple of the number of program pulses that were written.
|
* program pulses that were written.
|
||||||
|
*
|
||||||
*
|
*
|
||||||
* See the constructor definition for an explanation of the parameters that
|
* See the constructor definition for an explanation of the parameters that
|
||||||
* control programming.
|
* control programming.
|
||||||
@ -40,6 +41,7 @@ class PromDevice27 : public PromDevice
|
|||||||
void begin();
|
void begin();
|
||||||
const char * getName() { return "27 series EPROM"; }
|
const char * getName() { return "27 series EPROM"; }
|
||||||
ERET erase(uint32_t start, uint32_t end);
|
ERET erase(uint32_t start, uint32_t end);
|
||||||
|
bool is_readback_safe() { return mPgmType != E27C_PGM_CE; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setAddress(uint32_t address);
|
void setAddress(uint32_t address);
|
||||||
|
@ -47,11 +47,12 @@ PromDevice28C prom(32 * 1024L, 64, 10, true);
|
|||||||
// (true) verify data byte after writing
|
// (true) verify data byte after writing
|
||||||
//PromDevice27 prom(8 * 1024L, E27C_PGM_WE, 1000L, 15, 4); // 2764 with SEEQ intelligent programming
|
//PromDevice27 prom(8 * 1024L, E27C_PGM_WE, 1000L, 15, 4); // 2764 with SEEQ intelligent programming
|
||||||
//PromDevice27 prom(32 * 1024L, E27C_PGM_WE, 1000L, 25, 3); // 27C256 with SEEQ intelligent programming
|
//PromDevice27 prom(32 * 1024L, E27C_PGM_WE, 1000L, 25, 3); // 27C256 with SEEQ intelligent programming
|
||||||
|
PromDevice27 prom(32 * 1024L, E27C_PGM_CE, 100L, 25, 0); // M27C256 with Presto II intelligent programming
|
||||||
//PromDevice27 prom(2 * 1024L, E27C_PGM_WE, 50000L, 1, 0); // 2716 with single 50ms write
|
//PromDevice27 prom(2 * 1024L, E27C_PGM_WE, 50000L, 1, 0); // 2716 with single 50ms write
|
||||||
//PromDevice27 prom(512 * 1024L, E27C_PGM_CE, 100L, 11, 0); // 27C040 with Atmel rapid programming, CE connected to CE#/PGM#
|
//PromDevice27 prom(512 * 1024L, E27C_PGM_CE, 100L, 11, 0); // 27C040 with Atmel rapid programming, CE connected to CE#/PGM#
|
||||||
//PromDevice27 prom(32 * 1024L, E27C_PGM_CE, 100L, 25, 0); // W27C257/W27E257 with 100uS program pulse on CE
|
//PromDevice27 prom(32 * 1024L, E27C_PGM_CE, 100L, 25, 0); // W27C257/W27E257 with 100uS program pulse on CE
|
||||||
//PromDevice27 prom(64 * 1024L, E27C_PGM_CE, 100L, 1, 0, false); // W27C512 with single 100uS program pulse on CE, no verify
|
//PromDevice27 prom(64 * 1024L, E27C_PGM_CE, 100L, 1, 0, false); // W27C512 with single 100uS program pulse on CE, no verify
|
||||||
PromDevice27 prom(256 * 1024L, E27C_PGM_WE, 20L, 1, 0, false); // SST27SF020 with single 20us write, no verify
|
//PromDevice27 prom(256 * 1024L, E27C_PGM_WE, 20L, 1, 0, false); // SST27SF020 with single 20us write, no verify
|
||||||
|
|
||||||
#elif defined(PROM_IS_SST39SF)
|
#elif defined(PROM_IS_SST39SF)
|
||||||
// Define a device for anSST39SF Flash with the following parameters:
|
// Define a device for anSST39SF Flash with the following parameters:
|
||||||
@ -491,6 +492,13 @@ void pokeBytes(char * pCursor)
|
|||||||
}
|
}
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
|
if (!prom.is_readback_safe()) {
|
||||||
|
// This chip uses the CE line for write control, so don't do the read because it
|
||||||
|
// could cause a write operation that would corrupt the data.
|
||||||
|
cmdStatus.info("Poke complete");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned ix = 0; ix < byteCtr ; ix++)
|
for (unsigned ix = 0; ix < byteCtr ; ix++)
|
||||||
{
|
{
|
||||||
byte val = prom.readData(start + ix);
|
byte val = prom.readData(start + ix);
|
||||||
@ -621,6 +629,14 @@ void zapTest(uint32_t start)
|
|||||||
}
|
}
|
||||||
|
|
||||||
delay(100);
|
delay(100);
|
||||||
|
|
||||||
|
if (!prom.is_readback_safe()) {
|
||||||
|
// This chip uses the CE line for write control, so don't do the read because it
|
||||||
|
// could cause a write operation that would corrupt the data.
|
||||||
|
cmdStatus.info("Write test complete");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned ix = 0; ix < sizeof(testData); ix++)
|
for (unsigned ix = 0; ix < sizeof(testData); ix++)
|
||||||
{
|
{
|
||||||
byte val = prom.readData(start + ix);
|
byte val = prom.readData(start + ix);
|
||||||
|
@ -37,8 +37,9 @@ different chip technologies.
|
|||||||
|AT29C010 |Atmel |Flash |28C |Only with 128 byte or less sector size|
|
|AT29C010 |Atmel |Flash |28C |Only with 128 byte or less sector size|
|
||||||
|SST39SF040|Microchip |Flash |SST39SF|All SST39SF0x0 supported|
|
|SST39SF040|Microchip |Flash |SST39SF|All SST39SF0x0 supported|
|
||||||
|SST28SF040|SST |Flash |SST28SF|All SST28SF0x0 supported|
|
|SST28SF040|SST |Flash |SST28SF|All SST28SF0x0 supported|
|
||||||
|SST27SF020|SST |Flash |27 |12V continuous for pgm/erase|
|
|M27C256 |ST Micro |EPROM | |VCC=6.5V, VPP=12.75V to pgm|
|
||||||
|W27C257 |Winbond |EEPROM |27 |Continuous 12V or 14V for program/erase|
|
|W27C257 |Winbond |EEPROM |27 |Continuous 12V or 14V for program/erase|
|
||||||
|
|SST27SF020|SST |Flash |27 |12V continuous for pgm/erase|
|
||||||
|8755A |Intel |EPROM |8755A |Requires 25V pulses to program|
|
|8755A |Intel |EPROM |8755A |Requires 25V pulses to program|
|
||||||
|
|
||||||
|
|
||||||
@ -101,7 +102,8 @@ hardware](pcb#TommyPROM32) for a diode circuit that allows the programming volta
|
|||||||
switched between Vcc and a higher voltage.
|
switched between Vcc and a higher voltage.
|
||||||
|
|
||||||
Check the [Chip Details](#27c-and-27e-series-eproms-and-flash) for the high voltage
|
Check the [Chip Details](#27c-and-27e-series-eproms-and-flash) for the high voltage
|
||||||
connections for a particular chip or consult your data sheet.
|
connections for a particular chip or consult your data sheet. Also note the warning in
|
||||||
|
that section about issuing other commands while the programming voltage is asserted.
|
||||||
|
|
||||||
Chips that use high voltage pulses for each byte are not supported. For those chips, some
|
Chips that use high voltage pulses for each byte are not supported. For those chips, some
|
||||||
elements of the [8755A hardware](8755A-hardware) may be leveraged to build a version of
|
elements of the [8755A hardware](8755A-hardware) may be leveraged to build a version of
|
||||||
@ -119,7 +121,8 @@ contains a 2KB EPROM plus two general-purpose I/O ports. The 8355 is a one-time
|
|||||||
programmable version of the 8755. The 8755 requires a 25V programming pulse for each byte
|
programmable version of the 8755. The 8755 requires a 25V programming pulse for each byte
|
||||||
to be written.
|
to be written.
|
||||||
|
|
||||||
A new hardware build was created to support the 8755 chips. Because the 8755 has a multiplexed data and address bus, the usual shift registers are not used for addressing.
|
A new hardware build was created to support the 8755 chips. Because the 8755 has a
|
||||||
|
multiplexed data and address bus, the usual shift registers are not used for addressing.
|
||||||
The chip only needs 8 connects that are shared for address and data, plus three dedicated
|
The chip only needs 8 connects that are shared for address and data, plus three dedicated
|
||||||
address lines. The Arduino has enough pins to drive all of these directly, without the
|
address lines. The Arduino has enough pins to drive all of these directly, without the
|
||||||
need for shift registers to create address lines.
|
need for shift registers to create address lines.
|
||||||
@ -160,6 +163,32 @@ used to enable and disable SDP from the command line.
|
|||||||
|
|
||||||
## 27C and 27E Series EPROMs and Flash
|
## 27C and 27E Series EPROMs and Flash
|
||||||
|
|
||||||
|
*WARNING*: Some chips in this series use the _CE_ and _OE_ pins in non-standard ways when
|
||||||
|
the high voltage is asserted on _VPP_. Because the programming voltage is switched
|
||||||
|
manually, care needs to be taken when using chips that pulse the _CE_ pin for
|
||||||
|
programming. The programming code itself knows how to manage this, but other commands,
|
||||||
|
like the DUMP command, will also toggle _CE_. If the programming voltage is asserted,
|
||||||
|
these other commands can inadvertently cause a write operation. Be sure to assert the
|
||||||
|
programming voltage, issue the needed write commands, and then remove the high voltage
|
||||||
|
before issuing and additional commands that may corrupt the data.
|
||||||
|
|
||||||
|
### M27C256
|
||||||
|
|
||||||
|
The M27C256 is a 32Kx8 byte UV-erasable EPROM. It needs two special voltages for
|
||||||
|
programming. _VPP_ must be raised to 12.75V and _VCC_ must be raised to 6.25V. Be sure
|
||||||
|
to isolate the chip's _VCC_ pin from other Vcc connections so that the 6.25V is not fed
|
||||||
|
back into the Adbuino or into the shift registers.
|
||||||
|
|
||||||
|
This chip does not have a dedicated _PGM_ or _WE_ pin, so programming and verify are
|
||||||
|
controlled by the _E_ (Chip Enable) and _G_ (Output Enable) pins. The _CE_ pin is pulsed
|
||||||
|
to program bytes into a location. To verify, the _OE_ pin is asserted, but the _CE_ pin
|
||||||
|
is not.
|
||||||
|
|
||||||
|
Note the warning in the section above about data corruption from issuing other commands
|
||||||
|
while the programming voltages are present.
|
||||||
|
|
||||||
|
This chip can only be erased with UV light, so the erase command is not supported.
|
||||||
|
|
||||||
### W27C257 and W27C512
|
### W27C257 and W27C512
|
||||||
|
|
||||||
The Winbond W27C257 and W27E257 appear to be identical 32Kx8 EEPROMs. The 27C version
|
The Winbond W27C257 and W27E257 appear to be identical 32Kx8 EEPROMs. The 27C version
|
||||||
@ -168,11 +197,12 @@ has been tested. The Winbond W27C512 is a 64Kx8 EEPROM with no dedicated _VPP_
|
|||||||
The 257 EEPROMs have a _VPP_ pin that needs a constant 12V during programming. Unlike the
|
The 257 EEPROMs have a _VPP_ pin that needs a constant 12V during programming. Unlike the
|
||||||
newer 28C EEPROMs, these chips do not automatically erase before writing to a location.
|
newer 28C EEPROMs, these chips do not automatically erase before writing to a location.
|
||||||
Instead, the entire chip is erased by applying 14V to _VPP_ and _A9_ and then pulsing
|
Instead, the entire chip is erased by applying 14V to _VPP_ and _A9_ and then pulsing
|
||||||
_CE_.
|
_CE_. To erase the chip, assert the voltages on _VPP_ and _A9_ and then issue the
|
||||||
|
_Erase_ command from the terminal.
|
||||||
|
|
||||||
Unlike the 257 chips, the W27C512 does not have a dedicated pin for the programming
|
Unlike the 257 chips, the W27C512 does not have a dedicated pin for the programming
|
||||||
voltage and instead uses the OE pin to place the chip in programming mode. The verify
|
voltage and instead uses the _OE_ pin to place the chip in programming mode. The verify
|
||||||
operation requires that the OE pin be switched to _LOW_ and there is no hardware support
|
operation requires that the _OE_ pin be switched to _LOW_ and there is no hardware support
|
||||||
for this, so the current code supports the 512 chip by doing a single write cycle with no
|
for this, so the current code supports the 512 chip by doing a single write cycle with no
|
||||||
verify.
|
verify.
|
||||||
|
|
||||||
@ -257,8 +287,9 @@ pulsing _WE_.
|
|||||||
|AMS - Advanced Memory Systems|AMS |Merged with Intersil|
|
|AMS - Advanced Memory Systems|AMS |Merged with Intersil|
|
||||||
|AMD - Advanced Micro Devices |AM ||
|
|AMD - Advanced Micro Devices |AM ||
|
||||||
|Atmel |AT |Aquired by Microchip|
|
|Atmel |AT |Aquired by Microchip|
|
||||||
|CSI - Catalyst Semiconductor |CAT |Purchased by ON Semiconductor|
|
|CSI - Catalyst Semiconductor |CAT |Aquired by ON Semiconductor|
|
||||||
|Intel |i ||
|
|Intel |i ||
|
||||||
|
|Seeq Technology | |Aquired by LSI Logic|
|
||||||
|SST - Silicon Storage Tech |ST |Aquired by Microchip|
|
|SST - Silicon Storage Tech |ST |Aquired by Microchip|
|
||||||
|ST Microelectronics |M ||
|
|ST Microelectronics |M ||
|
||||||
|Winbond |W ||
|
|Winbond |W ||
|
||||||
|
Loading…
Reference in New Issue
Block a user