- Pay attention to error return codes when writing values, and make sure that the data you wanted to write actually gets written. Read it back after the write and checking for a correct value.
- It takes a while to write to data. If your EEPROM supports a "finished" signal, use that instead of a fixed timeout that might or might not be long enough.
- Don't access the EEPROM with marginal voltage. It is common for an external EEPROM chip to need a higher minimum voltage than your microcontroller. That means the microcontroller can be running happily while the EEPROM doesn't have enough voltage to operate properly, causing corrupted writes. In other words, you might have to set your brownout protection at a higher voltage than normal to protect EEPROM operation.
- Have a plan for power loss during a write cycle. Will your hold-up cap keep things afloat long enough to finish the write? Do you re-initialize the EEPROM when the CPU powers up in case the EEPROM was left half-way through a write cycle when the CPU was reset?
- Don't use address zero of the EEPROM. It is common for corruption problems to hit address zero, which can be the default address pointed to in the EEPROM if that chip is reset or otherwise has a problem during a write cycle.
- Watch out for wearout. EEPROM can only be written a finite number of times. Make sure you stay well within the wearout rating for your EEPROM.
- Consider using error coding such as a CRC protection for critical data items or blocks of data items stored in the EEPROM. Make sure the CRC isn't re-written so often that it causes EEPROM wearout.
You might also be interested in my blog post on EEPROM and flash memory wearout.
Hi,
ReplyDeleteMy code for write data and read data to eeprom(AT24C64) is working as per requirements. But instead of AT24C64 i am using now MICROCHIP EEPROM(24LC64) with same code but it is not writing data to eeprom..i have gone through both eeprom data sheet but dont get any difference ,only one difference i got i.e write cycle time
for At24c64 -wr time 10 ms
for 24LC64 -wr time 5 ms
can you help me to solve this problem?
This blog is a bit higher level than that. Since I don't have those particular parts hanging around I can't give you a definite answer. Probably there is something different about them beyond just the timing.
ReplyDeleteI'd suggest checking or posting at a discussion board that covers such things. A quick web search revealed:
http://www.edaboard.com/thread219700.html
Write ahead logging/shadow paging should work well if enough EEPROM capacity is available.
ReplyDeleteA simple implementation could use two or more blocks, with each block containing a complete copy of data.
Each block has a CRC/checksum and a sequence number.
To load, all blocks are read and the block with the highest sequence number and a valid CRC check is used.
To write, the block with the lowest sequence is replaced, using the highest sequence number plus one as its sequence number.
If a failure happens in the middle of a write then that block will be discarded on the next load.
Hi Phil,
ReplyDeleteanother kind of issue may be EE unexpected wearout due to block writing internal process.
i.e. you are sure that you're writing a single cell but in fact you're writing an entire 64 bytes page. So writing cycles matter for all things stored in PAGE. It depends on the EEPROM architecture.
Greetings,
Daniele