Scrittura frequente su memoria non volatile


10

Sto progettando un dispositivo che regola automaticamente la sua posizione fisica al variare della temperatura. Se il dispositivo si spegne o l'alimentazione viene disconnessa, il dispositivo deve ricordare la sua ultima temperatura e posizione. Ho la possibilità di memorizzare questi valori in EEPROM ma il problema è che la posizione e la temperatura potrebbero cambiare molto rapidamente. Se dovessi scrivere la temperatura e pos su EEPROM dopo ogni modifica, ciò (1) rallenterebbe un po 'il firmware e (2) probabilmente ucciderebbe la EEPROM dopo un anno o due. Per come la vedo io le mie opzioni sono le seguenti ...

1) utilizzare un condensatore / batteria per mantenere il dispositivo alimentato per un breve periodo dopo l'interruzione dell'alimentazione in modo da poter scrivere i valori su EEPROM solo in quel momento. Non mi piace perché la tavola ha un po 'di fame e questo richiederebbe un grosso vantaggio. E non ho un sacco di spazio libero. E non voglio il costo aggiuntivo di una batteria e di un portabatteria / o di un tappo grande.

2) utilizzare F-RAM invece di EEPROM in modo che io possa scrivergli migliaia di miliardi di volte senza logorarlo. Non mi piace questa opzione perché FRAM è un po 'più costosa di EEPROM e questo è per un prodotto di produzione (non solo uno).

3) Scrivi solo la posizione e la temperatura ogni 5 minuti circa. In questo modo ho sempre registrato una posizione / temperatura abbastanza recente ma non scrivo ogni secondo, quindi il mio programma non viene rallentato e la EEPROM non morirà così velocemente. Questa sembra la mia migliore opzione.

Qualcun altro ha qualche suggerimento a cui non sto pensando?


5
Solo una domanda. Se il dispositivo regola automaticamente la sua posizione fisica, perché è necessario ricordare l'ultima temperatura? Quando si riaccende il dispositivo, non aggiorna la temperatura e ne regola la posizione?
Daniel Grillo,

1
Sono d'accordo con Daniel. Cosa succede se si spegne e la temperatura ambiente cambia drasticamente? All'accensione, se avessi usato l'ultima temperatura / posizione salvata, saresti comunque nel posto sbagliato e il dispositivo finirà per muoversi indipendentemente. C'è un altro requisito che non è elencato nella tua domanda?
Dave,

Qual è la specifica EEPROM - quanti cicli di scrittura?
Jason S,

Risposte:


10

Ciò di cui hai bisogno è una tecnica chiamata livellamento dell'usura . Non scrive i tuoi dati ogni volta nella stessa posizione nella EEPROM, ma utilizza alcuni algoritmi per utilizzare posizioni diverse. Ho letto di algoritmi di livellamento dell'usura complessi, ma non saprei perché il seguente metodo semplice non funzionerebbe.

Aggiungi ai tuoi dati un contatore a 24 bit, in modo che il tuo blocco dati sia lungo ad esempio 8 byte. Le pagine su 24AA64 sono lunghe 32 byte, quindi una EEPROM da 64kb contiene 256 pagine. Dal foglio dati:

"Quando si esegue una scrittura di meno di 32 byte, i dati nel resto della pagina vengono aggiornati insieme ai byte di dati in fase di scrittura. Ciò costringerà l'intera pagina a sopportare un ciclo di scrittura, per questo motivo viene specificata la resistenza per pagina."

quindi non ha senso usare blocchi di dati più piccoli di una pagina di 32 byte.

Guarda il contatore della prima pagina. Se è zero hai usato il numero massimo di cicli di scrittura per quella pagina, quindi vai alla pagina successiva e controlla quel contatore. Ripeti finché non trovi un contatore> zero. Questa è la pagina che stai attualmente utilizzando. Le EEPROM di Microchip hanno una durata di 1 milione di cicli, che è possibile aumentare a 256 milioni con l'esempio dato di massimo 32 byte per blocco in una EEPROM da 64kb. Dovrebbe bastare per sopravvivere al tuo prodotto: 40 anni se scrivi una volta ogni 5 secondi (!).

Ti consigliamo di inizializzare la tua EEPROM al primo utilizzo. Come fai a sapere quando è così. Utilizzare l'ultima pagina per scrivere una firma univoca al momento dell'inizializzazione. Controlla ad ogni accensione se c'è la firma. In caso contrario, il dispositivo deve essere inizializzato. È possibile preimpostare il contatore in ciascuna pagina con 0xF4240 (per 1 milione) o cancellare tutto su 0xFF e scrivere 0xF4240 quando si utilizza la pagina per la prima volta.
L'inizializzazione di una EEPROM è necessaria perché a volte un certo modello viene scritto nel processo di produzione / test.

modifica
Il livellamento dell'usura dovrebbe risolvere i tuoi problemi, ma voglio ancora commentare la soluzione del condensatore. Dici che la scheda è piuttosto assetata di energia, ma forse puoi isolare il microcontrollore / la potenza della EEPROM dal resto della scheda con un diodo. Quindi probabilmente avrai bisogno solo di pochi mA quando l'alimentazione principale è sparita. Il 24AA64 scrive una pagina in meno di 5 ms, quindi a 10 mA e una caduta di tensione consentita di 100 mV è necessario

C=iotΔV=10mUN5mS100mV=500μF

Facile con un piccolo supercap.

ulteriore lettura della
scheda tecnica 24AA64
EEPROM Endurance


La resistenza della EEPROM è data per pagina (almeno per 24AA64 e altre EEPROM che ho usato). 24AA64 specifica una pagina a 32 byte, quindi il conteggio dovrebbe essere per pagina e non per blocco.
Saad,

@Saad - Corretto. Risolto nella mia risposta.
Stevenvh,

4

1) Dopo aver avviato il processo di scrittura, devi solo alimentare l'MCU / EEPROM e assicurarti che le linee di controllo non si guastino - I2C probabilmente preferisce SPI per questo. Bastano pochi mA per pochi millisecondi, quindi non dovrebbe essere un grosso limite, e potresti mettere in pausa l'MCU una volta avviata la scrittura. 3) probabilmente puoi applicare un po 'di intelligenza, ad esempio un holdoff - una volta scritto tiene sempre un certo tempo prima che possa accadere un'altra scrittura. Oppure attendere che il valore sia stabile per un po 'prima di scrivere.
È inoltre possibile aumentare la resistenza diffondendo i dati su un numero di posizioni. Microchip ha alcuni strumenti e note per calcolare la resistenza per le loro eeprom, che possono essere utili.


4
Nota sull'app Microchip sulla resistenza: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Dall'Appnote , è anche possibile aumentare la resistenza di circa 2x diminuendo la tensione operativa da 5v a 3,5v.
vandee,

1
Se si utilizza il primo metodo, assicurarsi che la scrittura nella memoria non volatile abbia la massima priorità nel sistema una volta avviato, ad es. che gli interrupt non possono far cambiare i valori a metà scrittura o che il micro avvii qualche altra elaborazione che ti fa perdere il tempo. È molto importante non scrivere valori corrotti durante lo spegnimento. Inoltre, un CRC sui valori ti aiuterebbe a confermare che la corruzione non si è verificata, ma dovresti decidere cosa fare in caso affermativo, come l'utilizzo dei valori predefiniti.
Martin,

3

Suggerirei di utilizzare un dispositivo flash orientato ai blocchi e di utilizzare un byte da ciascun blocco come flag di modalità. Mantenere come invariante che verranno programmati quasi tutti i flag di modalità; ci sarà solo un blocco in cui il flag di modalità non è programmato ma il blocco precedente (avvolgimento se necessario) è. Quel blocco sarà quello con i dati più recenti. Quando quel blocco si riempie, cancella il seguente blocco (nota che il blocco che si sta cancellando potrebbe contenere qualsiasi combinazione di dati durante il ciclo di cancellazione e che l'invariante rimarrebbe comunque), quindi una volta effettuata la cancellazione programmare il flag di modalità su quello che era solito essere l'ultimo blocco.

Sarà necessario proteggere la fornitura del flash abbastanza bene da garantire che qualsiasi tentativo di programmare un byte abbia successo o fallisca nella sua interezza, ma non importa se un ciclo di cancellazione viene interrotto lasciando un blocco pieno di dati arbitrari, poiché il prossimo tentativo di scrivere una voce di dati cancellerà quel blocco.

Se i tuoi dati sono a 16 bit, un chip 64Kx8 conterrà oltre 32.000 voci. Scrivere una voce al secondo riempirebbe il chip circa 2,7 volte. Persino un chip con una durata di "solo" cicli di cancellazione di 10K durerebbe oltre 10 anni. L'uso di un chip più grande, o uno con una resistenza di 100K, aumenterebbe proporzionalmente la vita utile.


2

1) Probabilmente l'opzione più semplice, anche se potrebbe richiedere modifiche hardware. Ho raggiunto questo obiettivo senza modifiche PBC semplicemente aumentando i tappi di disaccoppiamento e interrompendo il brown-out.

2) Come hai sottolineato, il problema con FRAM è il prezzo!

3) A seconda della volatilità dei dati di temperatura e posizione, aumenterai la resistenza scrivendo solo se il valore è cambiato. Potresti campionare la temperatura una volta al secondo, ma se cambia solo ogni 5 minuti, il problema è risolto.


1

Ecco come ho risolto questo problema nel mio progetto:

Riserva 1 settore di flash per contenere una maschera di bit di slot non utilizzati e un numero di slot per il valore.

La maschera di bit che ho usato era lunga 16 byte, quindi avevo 128 slot per mettere i valori.

La maschera di bit è inizializzata su tutti, che in termini flash è lo stato cancellato.

Quando vuoi scrivere un nuovo valore, leggi nella maschera di bit e trova il primo bit che è uno. Questo è il numero di slot in cui scrivere il valore. Cambia quel bit in uno zero per contrassegnarlo come usato e riscrivi la maschera di bit in flash senza prima cancellarla. Quindi, scrivi il valore nello slot dopo la maschera di bit anche senza cancellare il flash.

In questo modo, estendi i cicli di scrittura flash di 128 volte scrivendo la nuova maschera di bit con solo una variazione da uno a uno zero.

Se l'intera maschera di bit è 0, cancella il settore flash e ricomincia da capo.


3
Potrei deluderti, ma quando lampeggi un po ', l'intero settore viene sovrascritto. La tua soluzione renderà molto presto morto il settore della "maschera di bit".
Andrejs Cainikovs,

1
Se non si cancella il flash, non si utilizza uno dei cicli di cancellazione 10K per il settore. Se hai il valore 0x7F e scrivi il valore 0x3F, il risultato sarà 0x3F. Ciò mantiene la maschera di bit aggiornata, ma non cancella il flash. La cancellazione avviene solo quando l'intera maschera di bit è 0.
Robert,

Se sbaglio, discutiamo. Non voglio cattive risposte qui e davvero non voglio un cattivo design nel mio progetto.
Robert,

Penso che Robert abbia ragione. Sul mio microcontrollore, è possibile scrivere solo 4 byte alla volta, ma i bit richiesti sono impostati su zero. L'unico modo per riportarli a 1 è quello di cancellare il blocco 1k. Sono solo i cicli di cancellazione che indossano il flash ...
Tim

Potrebbe essere diverso per ogni tipo di memoria e forse anche per il fornitore della memoria. Ho visto che le EEPROM devono cancellare la pagina e riscriverla per ogni scrittura. Ho visto memoria flash puoi scrivere bit che sono ancora 1 senza cancellare la pagina.
mjh2007,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.