Don't like reading docs, why not just Skip Down to the Code?
To you, the 8051 system designer, these little chips offer a nifty way to store a small amount of data in non-volatile memory, using only a few of the port pins, and without raising the system's cost much. They are usually specified to retain the data for 10 years and to endure 100,000 write operations before failure. They only require a 5 volt power supply (some 3V only versions exist too).
Because these chips use a serial interface, they can not
be read quickly enough to serve as conventional memory. In addition,
a considerable length of time (milliseconds) is required to perform
a write operation. They typically hold less than 1024 bytes of
memory. However, they usually cost less than $1.00 (US) for
single piece quantities, making them pretty desirable memory
devices for storing configuration parameters or other bits of
information that should be retained when the power is lost.
Types of Serial EEPROM Chips
There are several types of Serial EEPROMs, but most of them fall into
either a 2-wire or 3-wire interface category. Usually, the 3-wire
devices require an addition wire (beyond the 3 for data transfer) for
each chip to be used. The 2-wire interface, called I2C
or IIC or "I squared C" uses only two wires, regardless of how many
chips are attached. I2C is a trademard of
Philips. The
three wire interfaces include SPI and Microwire, which is a trademark
of National Semiconductor.
As the pressure on engineers to make products smaller has grown, semiconductor manufacturers have introduced several new interfaces, usually aimed at lower a product's size and cost... and undoubtedly many more will appear in the future.
As a practical matter, the code offered below only works with
the Microwire 3 Wire interface, and is specifically intended to
work with the 93C46, which is a standard part available from a
variety of distributors.
Where to get a Serial EEPROM?
The code below works with the 93CS46 Serial EEPROM. It can be used
without much difficulty with a 93C46, by avoiding calls to the
routines that manipulate the extended features of the 93CS46.
Manufacturers
Atmel has data sheets on-line for
most of their EEPROM and microcontroller products. They have also added
example 8051 code similar to the code below, as well as for I2C
parts they offer.
National Semiconductor has lots of data sheets on-line. I used their 93CS46 data sheet to write the code. Their literature number is 800-272-9959... or at least is was some time ago when I put their sticker on my phone.
MicroChip now has data sheets on-line for most of their products. They offer the 93C46, as well as a variety of other EEPROMs.
SGS Thompson made the chips I used when I wrote this code. I used the National datasheet to write the code, but the SGS Thompson parts worked flawlessly. They offer quite a few different types of serial eeproms, including of course the 93CS46 and 93C46.
Xicor offers 2-Wire interface and SPI interface serial EEPROMs, but apparantly nothing which will work with the code offered below. They offer a proprietary interface called MPS, which supposedly requires ever fewer I/O lines. Xicor has quite a bit of example code on-line, including code for the 8051 family.
pe
" and "pre
"
symbols. A simpler approach may be
to set the bit addresses of these bits in the .equ statements to
a bit within the 16 byte bit-addressable space, or perhaps one of
the general purpose flag bits in the PSW, if you're not using it.
It's up to you.
I might make another version of the code specifically for the
plain 93C46, if anyone wants it enough to
let me know. Please explain
the difficulty you have using the code with a 93C46 (or the trouble
you think you may have).
Early versions of this code worked with the 93C56 and 93C57, which have more memory. Unfortunately, these chips use an 8 bit address field, whereas the 93C46 uses only 6. The code can be adapted to work with these larger chips... good luck. The early versions are long since gone.. they were buggy anyways.
The code is basically designed to manipulate a single 93CS46 chip, connected to six of the port pins. Two versions of the code are available, one with a little menu driven user interface (via a terminal connected to the UART) and the other with only the routines to include in your existing program. The user interface is simple and shouldn't need documentation. The routines available for your code are:
READ
R0
. Data is returned in R2
(LSB) and R3
(MSB). This
routine should always work regardless of calls to
WEN
and
WDS
, but it should not be called
immediately following a call
to PREN
. Valid address range for
R0
is 0 to 63.
WEN
PREN
below, writing should
remain enabled until a WDS
is called.
WRITE
R2
(LSB) and
R3
(MSB) to
the location pointed to by R0
. Writing must have been
enabled using WEN
. For the 93CS46, if this
location is "protected", no data will be written, regardless
of calls to WEN
and WDS
.
Writing takes a considerable
length of time (milliseconds). This routine just waits for
it to finish before returning... hope you don't have any
polled I/O you wanted to keep doing!
WDS
PREN
PRCLEAR
, PRWRITE
,
or PRDS
. In addition,
WEN
may have to have been called, check your
data sheet (or
just do it to be on the safe side). PREN
should
only enable use of the protection register for the next access,
so it should be called before every protection register access.
PRCLEAR
WEN
must still
be called before writing.
PRWRITE
R0
will become write protected. As with READ
and
WRITE
, the address in RO
refers to
a 16 bit memory location, valid range is 0 to 63. Unprotected
memory locations are still subject to WEN
and
WDS
, but protected locations are unwritable
unless the protection register is changed or cleared.
PRDS
WEN
and WDS
.
The fact that you have frozen the protection register is
stored in the non-volatile memory (10 year min retention).
There is no way to undo this operation... all future
PRCLEAR
and PRWRITE
operations will have no effect.
It is not necessary to erase memory locations before writing. The
erase functions provided in the 93C46 are unnecessary (for the chips
I've used, double check your data sheet). The erase functions are
not implemented here.
Of course, I, Paul Stoffregen, give no warranty, expressed or implied
for the software and/or documentation provided, including, without
limitation, warranty of merchantability and fitness for a
particular purpose.
On a lighter note, I have tried to provide you with a ready-to-run
93CS46 interface library, which I hope you will find useful as a
design component in your own 8051 based projects/products. This
code library is in the public domain. You are free to use it within
your projects/products. You may use it within commercial for-profit
products, without concern of licensing restrictions, copyright, royalties, etc.
If you do use it, I hope that you'll
give me some feedback.
Disclaimer
These 93C46 Serial EEPROM devices are used in many commercial products
where the data contained within the chip, though only 128 bytes,
is considered confidential and proprietary. This code library may
not be used to "break into" the data stored within devices in
commerical products. Use of this code library to modify the behavior
of commercial products, without the expressed written authorization of
the manufacturer, is also prohibited. (e.g. modifing ethernet card
hardware addresses, etc)
Files to Download
Paul's 8051 Code Library, Paul Stoffregen
http://www.ece.orst.edu/~paul/8051-goodies/serial-eeprom.html
Last updated: Tuesday, 03 September 1996
Status: complete
Suggestions, comments, criticisms:
<paul@ece.orst.edu>
Return to Paul's 8051 Goodies Index