Ich versuche, über I2C mit einem remote verbundenen FRAM (FM24C04 von Ramtron) zu kommunizieren. Dieser Speicher ist in eine Karte eingebettet, die jederzeit zum / vom System eingelegt und entfernt werden kann (die Kommunikation wird ordnungsgemäß beendet, bevor der Speicher entfernt wird).
Das Problem ist: Unmittelbar nach dem Einsetzen der Karte, die den FRAM enthält, wird die Adresse manchmal nicht bestätigt.
Signalmessungen
Ich habe die Signale gemessen, um zu sehen, was passiert, und es scheint, dass die Timings in beiden Fällen in Ordnung sind (funktionieren und nicht funktionieren).
Richtige I2C-Kommunikation (3 Bytes Lesen):
I2C-FRAM-Adresse nicht bestätigt (Slave-Adresse wird korrekt gesendet):
Bereits durchgeführte Maßnahmen zur Lösung dieses Problems (ohne Erfolg)
- Verzögerung hinzugefügt, nachdem die Karte mit dem eingebetteten FRAM eingelegt wurde, um sicherzustellen, dass die Stromsequenz eingehalten wird.
- I2C stoppt die Generierung nach Erkennung einer Slave-Adresse nicht quittiert
I2C-Buskonfiguration
- Ein Master (STM32F205 Mikrocontroller von ST)
- Drei Slaves (EEPROM 24AA1025 von Microchip, RTC DS1339C von Maxim IC und der Remote-FRAM FM24C04 von Ramtron
- Ein I2C-Pegelumsetzer (MAX3373E von Maxim IC) ermöglicht die Kommunikation zwischen dem Master und dem FRAM
- Busfrequenz auf 100 kHz eingestellt
EDITIERT (2013-04-17)
Zunächst einmal vielen Dank für Ihre Kommentare.
Da es viele Vorschläge gibt, finden Sie hier die Beschreibung der Untersuchungen, die ich durchgeführt habe.
Schema
Das folgende Bild zeigt ein vereinfachtes Schema des I2C-Busses:
I2C_SDA- und I2C_SCL-Signale sind direkt mit dem Mikrocontroller verbunden, und FRAM_SDA- und FRAM_SCL-Signale sind mit dem FRAM verbunden. Beachten Sie, dass die an den FRAM angeschlossenen SDA- und SCL-Signale mithilfe von BLM18-Ferriten von Murata gefiltert werden.
Der FRAM ist wie folgt angeschlossen:
- NC (Pin 1) -> nicht angeschlossen
- 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 (nicht schreibgeschützt)
- VDD (Pin 8) -> + 5V
Beschreibung der FRAM-Karte
Diese Karte ist eine "ISA-ähnliche" Karte, in die nur der FRAM eingebettet ist.
Untersuchungen
Die Frequenz verlangsamen
Ich habe Tests mit einer SCL-Frequenz von 50 kHz und 10 kHz durchgeführt. Ich habe das SCL-Signal mit einem Oszilloskop gemessen, um sicherzustellen, dass es die erwartete Frequenz hat.
Diese Änderungen haben das Problem nicht gelöst. Ich habe die Timings überprüft und sie liegen innerhalb der FRAM-Datenblattspezifikationen.
Sicherstellung der Stromfolge
@ Jippie.
- Der I2C-Pegelumsetzer wird in den Drei-Status-Modus versetzt, bevor die Karte, in die der FRAM eingebettet ist, eingesetzt wird. FRAM_SDA- und FRAM_SCL-Signale werden niedrig gezogen.
- Nach dem Einsetzen der "FRAM-Karte" wird eine Verzögerung von 100 ms hinzugefügt, um sicherzustellen, dass die Stromversorgung stabilisiert ist (mindestens 11 ms vor der ersten Startbedingung gemäß Datenblatt erforderlich).
- Der I2C Level Shifter ist aktiviert.
- Eine Verzögerung von 1 ms wird hinzugefügt, um sicherzustellen, dass der I2C-Pegelumsetzer aktiviert ist und die Leitungen hochgezogen werden (~ 4us gemäß Datenblatt erforderlich). FRAM_SDA- und FRAM_SCL-Signale werden abgerufen.
- Auf den FRAM wird zugegriffen.
Nach jedem Schritt wurden die Signale FRAM_SDA und FRAM_SCL gemessen.
Das Problem tritt immer noch auf.
Stopp / Start-Bedingung statt wiederholten Start
@ gbarry.
Ich habe versucht, vor dem wiederholten Start während der Byte-Übertragung einen Stopp zu setzen. Ich habe die Byteübertragung mit dem Oszilloskop gemessen: Die STOP-Bedingung gefolgt von der START-Bedingung ist OK.
Leider löst diese Lösung das Problem nicht.
Gedanken
Dieses Problem tritt erst auf, nachdem die in den FRAM eingebettete Karte angeschlossen wurde. Ich habe einige Tausend erfolgreiche Lesezugriffe (Slave-Adressierung und Lesen) ausgeführt, nachdem die "FRAM-Karte" eingelegt und korrekt adressiert wurde.
Es klingt für mich immer mehr nach einem Hardwareproblem. Ich weiß jedoch nicht, ob dies mit dem I2C-Pegelumsetzer oder den anderen Slaves am I2C-Bus zusammenhängen könnte.
Haben Sie weitere Ideen oder Vorschläge?
EDITIERT (2013-04-18)
Das Problem scheint gelöst zu sein
Ich habe den FRAM-Modulstecker ausgetauscht und einen Weg gefunden, Messungen direkt am FRAM durchzuführen. Es scheint, dass mit diesem neuen Anschluss alles gut funktioniert.
Ich werde weitere Tests durchführen, um sicherzugehen, dass das Problem auf einen schlechten Zusammenhang zurückzuführen ist.