Sto cercando di comunicare con una FRAM connessa in remoto (FM24C04 da Ramtron) utilizzando I2C. Questa memoria è incorporata su una scheda che può essere inserita e rimossa in qualsiasi momento al / dal sistema (la comunicazione viene terminata correttamente prima che la memoria venga rimossa).
Il problema è: subito dopo aver inserito la scheda che contiene la FRAM, a volte , non riconosce l'indirizzo.
Misure dei segnali
Ho misurato i segnali per vedere cosa sta succedendo e sembra che i tempi siano OK in entrambi i casi (funzionante e non funzionante).
Comunicazione I2C corretta (lettura di 3 byte):
Indirizzo FRAM I2C non riconosciuto (indirizzo slave inviato correttamente):
Azioni già intraprese per risolvere questo problema (senza successo)
- Ritardo aggiunto dopo l'inserimento della scheda con FRAM incorporata per garantire il rispetto della sequenza di potenza.
- I2C interrompe la generazione dopo il rilevamento di un indirizzo slave non confermato
Configurazione bus I2C
- Un master (microcontrollore STM32F205 di ST)
- Tre slave (EEPROM 24AA1025 di Microchip, RTC DS1339C di Maxim IC e la FRAM remota FM24C04 di Ramtron
- Un cambio di livello I2C (MAX3373E da Maxim IC) viene utilizzato per consentire la comunicazione tra il master e la FRAM
- Frequenza bus impostata su 100 kHz
EDITED (17-04-2013)
Innanzitutto, grazie a tutti per i vostri commenti.
Dato che ci sono molti suggerimenti, ecco la descrizione delle indagini che ho fatto.
Schematico
L'immagine seguente mostra uno schema semplificato del bus I2C:
I segnali I2C_SDA e I2C_SCL sono direttamente collegati al microcontrollore e i segnali FRAM_SDA e FRAM_SCL sono collegati alla FRAM. Si noti che i segnali SDA e SCL collegati alla FRAM vengono filtrati utilizzando i ferriti BLM18 di Murata.
La FRAM è collegata come segue:
- NC (pin 1) -> non collegato
- A1 (pin 2) -> GND
- A2 (pin 3) -> GND
- VSS (pin 4) -> GND
- SDA (pin 5) -> FRAM_SDA
- SCL (pin 6) -> FRAM_SCL
- WP (pin 7) -> GND (non protetto da scrittura)
- VDD (pin 8) -> + 5V
Descrizione della scheda FRAM
Questa carta è una carta "ISA like" che incorpora solo la FRAM.
indagini
Rallentando la frequenza
Ho eseguito i test con la frequenza SCL impostata su 50kHz e 10kHz. Ho misurato il segnale SCL con un oscilloscopio per assicurarmi che fosse alla frequenza prevista.
Queste modifiche non hanno risolto il problema. Ho controllato i tempi e rientrano nelle specifiche della scheda tecnica FRAM.
Garantire la sequenza di potenza
@jippie.
- Il cambio di livello I2C viene messo in modalità tre stati prima di inserire la scheda che incorpora la FRAM. I segnali FRAM_SDA e FRAM_SCL sono abbassati.
- Dopo aver inserito la "scheda FRAM", viene aggiunto un ritardo di 100 ms per garantire che l'alimentazione sia stabilizzata (almeno 11 ms richiesti prima della prima condizione di avvio in base al foglio dati).
- Il cambio di livello I2C è attivato.
- Un ritardo di 1 ms viene aggiunto per garantire che il cambio di livello I2C sia attivato e che le linee siano tirate su (~ 4us richiesto dal foglio dati). I segnali FRAM_SDA e FRAM_SCL vengono richiamati.
- Si accede alla FRAM.
I segnali FRAM_SDA e FRAM_SCL sono stati misurati dopo ogni passaggio.
Il problema si verifica ancora.
Condizione di arresto / avvio anziché avvio ripetuto
@gbarry.
Ho provato a mettere un arresto prima dell'inizio ripetuto durante il trasferimento di byte. Ho misurato il trasferimento di byte con l'oscilloscopio: la condizione STOP seguita dalla condizione START è OK.
Sfortunatamente, questa soluzione non risolve il problema.
Pensieri
Questo problema si verifica solo dopo aver collegato la scheda che incorpora la FRAM. Ho eseguito alcune migliaia di accessi in lettura riusciti (indirizzamento e lettura slave) dopo che la "scheda FRAM" è stata inserita e indirizzata correttamente.
Mi sembra sempre più un problema hardware. Ma non so se potrebbe essere correlato al cambio di livello I2C o agli altri slave sul bus I2C.
Hai altre idee o suggerimenti?
EDITED (18-04-2013)
Il problema sembra risolto
Ho sostituito il connettore del modulo FRAM e ho trovato un modo per eseguire misurazioni direttamente sulla FRAM. Sembra che tutto funzioni bene con questo nuovo connettore.
Farò altri test per essere sicuro che il problema provenga da una cattiva connessione.