Go Down

Topic: Attesa tempo scrittura flash dopo cancellazione (Read 711 times) previous topic - next topic

gpb01

Non Ti é sfuggito; non l' aveva scritto.
... vedo che è sfuggito anche a te Uwe ... :D :D :D

Sto utilizzando una memoria winbond con arduino due
Guglielmo
Search is Your friend ... or I am Your enemy !

thedrifter

Ciao a tutti,
mi fate morire con quella DUE  :D , è sfuggito a tutti, un po' perchè poco usata, un po' perchè l'ho scritto in minuscolo e non ci si fa caso...

Rispondo a DOCDOC, è tutto su un display, faccio presto a vedere... Cancello la flash, aspetto 2 minuti, scrivo il valore, tutto ok, lo vado a rileggere è sempre quello scritto (mettiamo decimale 995); cambio il valore a 980, lo vado a scrivere, quando lo rileggo trovo 960, se riscrivo 980, rimane sempre 960; cambio valore, vado a scrivere 970, se rileggo rimane sempre 960.
Escludo errori matematici sulla scrittura, perchè se cancello la flash, qualsiasi valore scrivo, rimane perfettamente...

UWEFED, si, posso cambiare e utilizzare una EEPROM, anche se leggendo non ho capito granchè le differenze; però tutte le volte che scelgo qualcosa, sbaglio sempre  :) avevo comprato le flash perchè avevo visto su ebay erano molto comuni e vendute in quantità per arduino (e hanno anche discrete dimensioni), e puntualmente ho sbagliato  ;D vedrò di cambiare con una EEPROM, sperando il problema sia quello  ;)

gpb01

#17
Jul 19, 2018, 07:58 pm Last Edit: Jul 19, 2018, 08:08 pm by gpb01
Nessun problema per utilizzare l'RTC, è solo che era già fatto l'hardware e quella winbond era molto + piccola del modulo RTC.
Continuo a suggerirti il più semplice DS1307 ... case DIP8 o SMD più un piccolissimo quarzo a 32.768KHz ... NON dirmi che occupa più spazio di quanto ne stai usando ...

         

Guglielmo
Search is Your friend ... or I am Your enemy !

thedrifter

Si, non è male, posso usare anche una 24CXX, almeno risparmio il quarzo esterno... Vedrò di fare questa modifica.
Comunque nessuno ha usato le flash per capire il problema?
Grazie

gpb01

Comunque nessuno ha usato le flash per capire il problema?
NO, in passato ho usato le FRAM (Cypress Semiconductor) e non ho avuto alcun problema ... :)

Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

#20
Jul 20, 2018, 02:47 pm Last Edit: Jul 20, 2018, 03:08 pm by docdoc
Cancello la flash, aspetto 2 minuti, scrivo il valore, tutto ok, lo vado a rileggere è sempre quello scritto (mettiamo decimale 995); cambio il valore a 980, lo vado a scrivere, quando lo rileggo trovo 960, se riscrivo 980, rimane sempre 960; cambio valore, vado a scrivere 970, se rileggo rimane sempre 960.
Escludo errori matematici sulla scrittura, perchè se cancello la flash, qualsiasi valore scrivo, rimane perfettamente...
Tutto troppo strano, in genere una memoria difettosa o ti dà letture sempre differenti (o almeno "spesso" differenti) o non funziona affatto (ossia leggi sempre lo stesso valore, oppure zero, oppure FF).

Ma puoi fare un esempio concreto? Quelle che hai citato non sono informazioni dirette di dati reali (poi sono byte, che è questo 980? ;) ) quindi andiamo per gradi: se alle righe 708-724 scrivi dei valori (byte), mandali in monitor seriale così quando scrivi sai esattamente cosa intendevi scrivere (e dovresti aver scritto). Poi anche alle righe 746-754 quando rileggi metti un po' di Serial.print per vedere cosa (quali byte) esattamente hai letto. E magari ripeti la lettura una seconda volta (sempre riportando su seriale quanto letto), e questo ciclo di scrittura e doppia lettura ripetilo ancora.
Ma tu leggi anche alle righe 294-301, metti dei print anche lì.

Una volta che ci fai vedere questi risultati, possiamo capire meglio e mi togli questa curiosità... ;)

EDIT: per completezza, quale versione esatta di SPIFlash stai usando?

EDIT2: Ma hai anche impostato l'esatta dimensione della memoria del tuo chip (che credo sia 128)?
Intendo queste:
Code: [Select]
#define CHIP_SIZE128     16L * 1024L * 1024L  //W25Q128
#define CHIP_SIZE64       8L * 1024L * 1024L  //W25Q64
#define CHIP_SIZE32       4L * 1024L * 1024L  //W25Q32
#define CHIP_SIZE16       2L * 1024L * 1024L  //W25Q16
#define CHIP_SIZE8        1L * 1024L * 1024L  //W25Q08
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

thedrifter

#21
Jul 20, 2018, 07:43 pm Last Edit: Jul 20, 2018, 08:15 pm by thedrifter
Ciao,
rispondo ai tuoi edit, la versione di SPIFlash è la 3, il mio chip è W25Q128, no, non avevo messo questa stringa per impostare la dimensione... L'ho aggiunta ora, ma non era quello il problema.
I valori che ho indicato, sono in decimale, come ho scritto fra parentesi, è il valore reale che devo salvare (995), naturalmente viene scomposto in 2 byte per salvarlo nella flash e poi ricomposto dopo la lettura; comunque farò la prova che dici tu...

EDIT: ho fatto le prove che dici, ho letto i 2 byte che formano il mio valore, prima di scriverli, ed è corretto, ma se vado a rileggerli (anche più volte) non è quello che ho scritto...

Sulimarco

Ciao Thedrifter,


e' una caratteristica delle Flash Memory poter solo resettare i bit, e non settarli, durante la scrittura.

Questo significa che prima di scrivere una locazione di memoria questa deve essere cancellata, e cioe' tutti i bit devono essere messi ad 1.

Questo e' specificato all'inizio del paragrafo 8.2.15, pagina 49,  del  datasheet del W25Q128.


Quindi se tu scrivi 995 cioe'   0000001111100011  e poi  980 e cioe'  0000001111010100  ti ritrovi con l'and dei due e cioe'    0000001111000000   = 960.



Per quanto riguarda il tempo di attesa di 2 minuti dopo la cancellazione, questo non e' assolutamente normale, ma non sono in grado di dirti dove sbagli.


Senza offesa per nessuno trovo decisamente barocca la proposta di mettere un modulo di orologio, con tanto di batteria di backup, per memorizzare qualche byte.
Io metterei una EEPROM su I2C, tipo 24LCXX o simile, che, visto che si parla di dimensioni, sono chip disponibili anche in package sot23, decisamente piccolo, ma ancora umanamente usabile.


Marco







uwefed

#23
Jul 21, 2018, 08:07 am Last Edit: Jul 21, 2018, 08:09 am by uwefed
CI sono memorie EEprom con interfaccia SPI e percui basta cambiare l' integrato sulla schedina senza dover fare modifiche sui collegamenti.
Se si deve modificare spessissimo il valore un FRAM o la memoria su RTC con batteria hanno grossi vantaggi.
Ciao Uwe

thedrifter

Ciao Thedrifter,


e' una caratteristica delle Flash Memory poter solo resettare i bit, e non settarli, durante la scrittura.

Questo significa che prima di scrivere una locazione di memoria questa deve essere cancellata, e cioe' tutti i bit devono essere messi ad 1.

Questo e' specificato all'inizio del paragrafo 8.2.15, pagina 49,  del  datasheet del W25Q128.


Quindi se tu scrivi 995 cioe'   0000001111100011  e poi  980 e cioe'  0000001111010100  ti ritrovi con l'and dei due e cioe'    0000001111000000   = 960.



Per quanto riguarda il tempo di attesa di 2 minuti dopo la cancellazione, questo non e' assolutamente normale, ma non sono in grado di dirti dove sbagli.


Senza offesa per nessuno trovo decisamente barocca la proposta di mettere un modulo di orologio, con tanto di batteria di backup, per memorizzare qualche byte.
Io metterei una EEPROM su I2C, tipo 24LCXX o simile, che, visto che si parla di dimensioni, sono chip disponibili anche in package sot23, decisamente piccolo, ma ancora umanamente usabile.


Marco





Buongiorno,
stanotte facendo le prove, ero arrivato a questo dubbio, e tu me lo hai confermato... Un'altra cosa imparata, grazie. A questo punto mi conviene usare una eeprom qualsiasi, mi va bene sia SPI che I2C, mi metto all'opera  ;)

Sulimarco

Quote
Se si deve modificare spessissimo il valore un FRAM o la memoria su RTC con batteria hanno grossi vantaggi.
Dando un'occhiata al codice di Thedrifter non mi sembra proprio sia il suo caso ...

Ciao
Marco

Go Up