Newsgroup: it.hobby.elettronica.digitale
Titolo: Implementare un software reset su bus I2C

Qualcuno di voi ha mai implementato un software reset su bus I2C, come 
quello spiegato nella AN-686 della Analog Devices?
http://www.analog.com/static/imported-files/application_notes/54305147357414AN686_0.pdf
Una interruzione di una comunicazione su bus I2C può avvenire sempre e 
il problema è presente anche nella più semplice connessione tra un 
singolo Master ed un singolo Slave, come una EEPROM (tipo la 24LC64).
In tutte le applicazioni dove uso questa memoria, all'avvio del software 
implemento qualcosa del genere:
- leggo un magic number dalla memoria
- se è quello che m'aspetto, leggo il resto
- altrimenti scrivo dati di default
Questo mi permette di distinguere una memoria vergine da una già scritta.
Non so perché, ma succede che, anche se molto saltuariamente, i dati di 
una memoria già scritta (quindi con il magic number presente) vengano 
sovrascritti con quelli di default. Evidentemente all'avvio quel magic 
number non viene letto correttamente.

 number non viene letto correttamente.
Immagino che utilizzando questo approccio, nella eeprom tu inserisca 
parametri non vitali ma piuttosto impostazioni utente che verranno 
eventualmente ripristinate ai valori di default nel caso non trovi il 
magic number.
Non so se ha senso, ma io di solito preferisco eseguire un crc di tutto 
il blocco dati e scriverlo in un indirizzo noto. All'avvio prima di 
assegnare i valori alle variabili ricalcolo il crc e verifico se è 
uguale a quello memorizzato.
Comunque non ho mai avuto problemi di letture errate (a meno di bug nel 
firmware).
Se non l'hai già fatto ti suggerirei di scrivere una semplice funzione 
di test dove leggi e scrivi dati noti, verificando più volte la congruenza.
Marco

 di test dove leggi e scrivi dati noti, verificando più volte la congruenza.
Già fatto. Con un relè che accende/spegne ogni 10 secondi la scheda, ho 
fatto il test per due notti intere senza successo (nel senso che ha 
sempre funzionato). Eppure, almeno su una scheda con lo stesso software, 
sembra (non è capito nelle mie mani) che le impostazioni siano andate da 
default.
Ho anche provato a stressare l'alimentazione attaccandola e staccandola 
nevroticamente alla scheda, sempre senza successo (cioè le impostazioni 
non sono mai state portate a default).
Provando a cortocircuitare i pin SDA e SCL all'avvio, ottengo un 
"tentato" ripristino alle impostazioni di default. Il software parte con 
queste impostazioni, ma la EEPROM non può essere scritta (visto che il 
bus I2C è bloccato dal corto).

 bus I2C è bloccato dal corto).
Più che altro dovresti capire se il problema avviene in scrittura oppure 
in lettura. La cosa è abbastanza facile: quando lui rileva l'errore sul 
magic number fagli rileggere di nuovo il dato.
Puoi farlo anche al momento della scrittura:
- scrivi
- rileggi
- verifichi
Marco

 magic number fagli rileggere di nuovo il dato.
Il problema è che l'anomalia si presente così di rado che io non l'ho 
mai vista. Pur tuttavia, proprio per evitare questi problemi, ho già 
implementato una lettura multipla del magic number se questi non dovesse 
essere esatto. Ma anche così il problema s'è presentato, almeno una volta.
Comunque sia io penso che il problema sia la lettura, all'avvio, del 
magic number. Solo una lettura non corretta, per come ho scritto il fw, 
può portare ad un azzeramento delle impostazioni.

 può portare ad un azzeramento delle impostazioni.
Ne consegue dunque che questi dati non vai mai a riscriverli, giusto?
Marco

 Ne consegue dunque che questi dati non vai mai a riscriverli, giusto?
No, mi sono spiegato male. Se il fw non è buggato, è scritto in modo 
tale che un normale ciclo di accensione/spegnimento non vada *mai* a 
scrivere nella EEPROM. Solo un operatore, agendo sui tasti, può avviare 
una procedura di scrittura della EEPROM cambiando qualche parametro.
Oppure solo un magic number inesatto porta al default.
Siccome sembra che la memoria sia andata a default completamente in modo 
randomico e quando non c'era nessuno davanti a smanettare (almeno così 
mi dicono), è molto probabile che ci sia stata una lettura errata del 
magic number all'avvio.

 magic number all'avvio.
Yes.
Che interfaccia utente hai a disposizione? Perché eventualmente, come 
pezza temporanea, potresti richiedere la conferma prima di tornare ai 
valori di default. Magari provando comunque a leggere quelli presenti.
Questa era l'eccezione a cui mi riferivo in qualche post fa ma appunto 
richiede una discreta interazione con l'utente e la possibilità che 
l'apparato sia presidiato o che possa richiamare l'attenzione.
Marco

 l'apparato sia presidiato o che possa richiamare l'attenzione.
Purtroppo la macchina deve partire da sola sempre, anche senza utente.