Serial EEPROM Solutions vs. Parallel Solutions - The cost break even point for serial I2C non-volitile memory from useing multiple 32kx8 EEPROMs to using parallel flash memory with an I2C controller is at about 128k as of late 1999.
Ian Chapman <pic@chapmip.demon.co.uk> says:
BTW, I've just spotted an interesting point in AN709 about I2C EEPROMs which can power up in an incorrect state. The following initialisation sequence after power-up is recommended to resolve this:
- START bit
- Clock in nine bits of '1'
- START bit
- STOP bit
I haven't seen this in any examples of I2C master code before, but AN709 gives a good explanation of why it is needed to avoid the possibility of an erroneous write to the EEPROM.
Extending lifetime and reliability in EEPROMs
See also:
See:
Code:
This code will write the EEPROM on the 16F628 in chunks.;; Written: 14-Apr-2002, Chuck McManis;; Uses the temporary variable EE_LEN, EE_SRC, and EE_DST; During write Source is RAM and Destination is EEPROM;; Note: Due to a bug in the 16F628 you can "overrun" the ability; of the chip to write the EEPROM if you just monitor the WR bit; in EECON1 (if you write immediately after it goes low the EEPROM; may not be written.;; Thus this macro assumes that when it starts there is not a write; currently in progress!;; Usage: EEWRITE <data bytes address (0-0xff)>, <eeprom address>, <len>;; On the 16F628, EE_LEN, EE_SRC, and EE_DST should be in the range; 0x70 - 0x7F (mirrored on all ram banks);;EEWRITE MACRO SRC_ADDR, DST_ADDR, LENLOCAL WLOOPMOVLW LEN ; Get lengthMOVWF EE_LEN ; Store it in countMOVLW SRC_ADDR ; Get the source addressMOVWF EE_SRC ; Store in the source addrMOVLW DST_ADDR ; EEPROM Destination addressMOVWF EE_DST ; Store it tooWLOOP:BCF PIR1, EEIF ; Clear this flag...MOVF EE_SRC,W ; Source AddressMOVWF FSR ; Store in FSRMOVF INDF,W ; Get a data byteBSF STATUS, RP0 ; Switch to Bank 1MOVWF EEDATA ; Store the data byte in EE DataMOVF EE_DST,W ; Get the destination addressMOVWF EEADR ; .. this byte goes hereBSF EECON1, WREN ; Enable Writes to EEPROM; BTFSS EECON1, WR ; This should work but doesn't (see; GOTO $-1 ; below) it only writes 2 of n bytes.BCF INTCON, GIE ; Interrupts off.MOVLW H'55' ; Magic Sequence (Sequence Start)MOVWF EECON2 ; ...MOVLW H'AA' ; ...MOVWF EECON2 ; ...BSF EECON1, WR ; and Write it! (Sequence End)BSF INTCON, GIE ; Interrupts are allowed again.BCF EECON1, WREN ; Disable future writes.BCF STATUS, RP0 ; back to bank 0BTFSS PIR1, EEIF ; Wait for it to finish, this slowsGOTO $-1 ; ... us down! (bug! see above)INCF EE_SRC, F ; Add 1 to source and destinationINCF EE_DST, F ; ... addresses (no overlap)DECFSZ EE_LEN,F ; Decrement the length and ...GOTO WLOOP ; ... loop if non-zero.ENDM
For another example of reading the EEPROM, see PIC 16F876 full initialization sample program /techref/microchip/16f877/snipp.htm .
Questions:
Comments: