I2C-Slave-Adresse nicht bestätigt (manchmal)

Ich versuche, über I2C mit einem entfernt angeschlossenen FRAM (FM24C04 von Ramtron) zu kommunizieren. Dieser Speicher ist auf einer Platine eingebettet, die jederzeit in das System eingesetzt und entfernt werden kann (die Kommunikation wird ordnungsgemäß beendet, bevor der Speicher entfernt wird).

Das Problem ist: Direkt nach dem Einstecken der Karte, die das 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 (funktioniert und nicht funktioniert).

Korrekte I2C-Kommunikation (3 Bytes lesen):Geben Sie hier die Bildbeschreibung ein

I2C-FRAM-Adresse nicht bestätigt (Slave-Adresse wird korrekt gesendet):Geben Sie hier die Bildbeschreibung ein

Bereits durchgeführte Maßnahmen zur Lösung dieses Problems (ohne Erfolg)

  • Verzögerung hinzugefügt, nachdem die Karte mit dem eingebetteten FRAM eingesetzt wurde, um sicherzustellen, dass die Power Sequence eingehalten wird.
  • I2C-Stopp-Generierung nach Erkennung einer Slave-Adresse ohne Bestätigung

Konfiguration des I2C-Busses

  • Ein Master (STM32F205 Mikrocontroller von ST)
  • Drei Slaves (EEPROM 24AA1025 von Microchip, RTC DS1339C von Maxim IC und das Remote-FRAM FM24C04 von Ramtron
  • Ein I2C-Level-Shifter (MAX3373E von Maxim IC) wird verwendet, um die Kommunikation zwischen dem Master und dem FRAM zu ermöglichen
  • Busfrequenz auf 100 kHz eingestellt

Schema

Das folgende Bild zeigt ein vereinfachtes Schema des I2C-Busses:

I2C-Bus-Schema

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 mit dem FRAM verbundenen SDA- und SCL-Signale durch die Verwendung von BLM18-Ferriten von Murata gefiltert werden.

Das FRAM ist wie folgt angeschlossen:

  • NC (Pin 1) -> nicht verbunden
  • A1 (Stift 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, die nur den FRAM einbettet.

Untersuchungen

Verlangsamung der Frequenz

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 Modifikationen haben das Problem nicht gelöst. Ich habe die Timings überprüft und sie liegen innerhalb der FRAM-Datenblattspezifikationen.

Stromfolge sicherstellen

  1. Der I2C-Level-Shifter wird in den Drei-Zustands-Modus versetzt, bevor die Karte, die den FRAM einbettet, eingesetzt wird. FRAM_SDA- und FRAM_SCL-Signale werden auf Low gezogen.
  2. Nach dem Einstecken der "FRAM-Karte" wird eine Verzögerung von 100ms hinzugefügt, um sicherzustellen, dass sich die Stromversorgung stabilisiert (mindestens 11ms erforderlich vor dem ersten Startzustand laut Datenblatt).
  3. Der I2C Level Shifter ist aktiviert.
  4. Eine Verzögerung von 1 ms wird hinzugefügt, um sicherzustellen, dass der I2C-Pegelumsetzer aktiviert und die Leitungen hochgezogen werden (~ 4 us laut Datenblatt erforderlich). FRAM_SDA- und FRAM_SCL-Signale werden hochgezogen.
  5. Auf den FRAM wird zugegriffen.

FRAM_SDA- und FRAM_SCL-Signale wurden nach jedem Schritt gemessen.

Das Problem tritt immer noch auf.

Stopp/Start-Bedingung statt wiederholtem Start

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 in Ordnung.

Leider löst diese Lösung das Problem nicht.

Gedanken

Dieses Problem tritt nur auf, nachdem die Karte mit dem FRAM angeschlossen wurde. Ich habe einige tausend erfolgreiche Lesezugriffe (Slave-Adressierung und -Lesung) durchgeführt, nachdem die "FRAM-Karte" gesteckt und korrekt adressiert war.

Klingt für mich immer mehr nach einem Hardwareproblem. Aber ich weiß nicht, ob es mit dem I2C-Level-Shifter oder mit den anderen Slaves am I2C-Bus zusammenhängen könnte.

Haben Sie weitere Ideen oder Vorschläge?


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 von einer schlechten Verbindung herrührt.

Kannst du bitte den Schaltplan posten? Probieren Sie eine langsamere Busfrequenz aus, um zu sehen, ob dies einen Unterschied macht.
Ist das Problem nur kurz nach dem Einfügen aufgetreten und nicht zu anderen Zeiten? Wie schnell ist „kurz danach“?
Zusätzlich zu den anderen Experimenten könnten Sie versuchen, die anderen Slaves zu entfernen und sehen, ob sich das auf das Verhalten auswirkt.
Sind die beiden Adressstifte richtig niedrig gezogen oder schwebend gelassen?
@Suirnder Ich habe den Schaltplan in meiner Antwort gepostet.
@Kaz Dieses Problem tritt nur auf, nachdem die Karte, in die der FRAM eingebettet ist, angeschlossen wurde. Ich habe einige tausend erfolgreiche Lesezugriffe (Slave-Adressierung und -Lesung) durchgeführt, nachdem die "FRAM-Karte" gesteckt und korrekt adressiert war.
@BenGartner Ich würde gerne eine andere Lösung finden, bevor ich die anderen Slaves entlöte.
@fm_andreas Die beiden Adresspins werden in einen hochohmigen Zustand versetzt, wenn sich der I2C-Pegelumsetzer im Dreizustandsmodus befindet.
Der MAX3373E hat auf beiden Seiten der I/O-Leitungen eingebaute 10K-Pull-up-Widerstände. Entfernen Sie Ihre Pull-up-Widerstände R36, R37 und, falls Sie einen auf dem FRAM-Gerät haben. Ich gehe davon aus, dass Sie eine Bypass-Kappe auf dem FRAM-Gerät haben. Wenn dies Ihr Problem nicht löst, können Sie, anstatt andere Geräte auszulöten, zuerst versuchen, die 0-Ohm-Widerstände zu entfernen, die Sie an den Stromversorgungsstiften der Echtzeituhr und des EEPROM verwenden.
Mir ist immer noch nicht klar, ob das etwas ist, das einmalig passiert, oder ob es ein dauerhafter Fehler ist? Ich meine, machen Sie sich Sorgen, dass es einen NAK gibt, bevor eine erfolgreiche Kommunikation hergestellt wird? Oder ist es so, dass wenn sich das FRAM in diesem Zustand befindet, es so bleibt? Wenn es so bleibt, ist es vielleicht nur ein schlechter Kontakt. Es wird nicht richtig mit Strom versorgt, oder der SCL/SCA oder was auch immer.
@Suirnder Du hast recht, ich kann externe Widerstände entfernen. Die Grundidee war, den I2C-Level-Shifter zu deaktivieren, bis das FRAM-Modul gesteckt ist. Daher musste ich sicherstellen, dass der Bus hochgezogen wurde, selbst wenn sich die Level-Shifter-I/Os im Hochimpedanzmodus befanden.
@Kaz Es scheint, dass das FRAM in diesem Modus bleibt, wenn das NACK auftritt, bis es getrennt und wieder verbunden wird. Wie Sie sagen, vermute ich einen eventuellen schlechten Kontakt. Ich muss weiter untersuchen, um sicher zu sein, dass dies die Ursache des Problems ist.
Wie lang ist das Kabel zum "entfernten" FRAM? Liegt das Signal, das Sie uns zeigen, am Motherboard oder am FRAM?
@ScottSeidman Die Kabellänge beträgt ca. 30cm. Das Signal in meinem Anfangspost wurde auf dem Motherboard gemessen. Ich habe Tests mit einem anderen Stecker durchgeführt und konnte die Signale direkt an den FRAM-Pins messen. Es scheint, dass jetzt alles in Ordnung ist und das Problem der Stecker war. Ich werde weitere Tests durchführen, um sicherzugehen, dass das Problem behoben ist.

Antworten (7)

Obwohl Sie sagen, dass Ihre Kommunikation vor dem Einsetzen oder Entfernen ordnungsgemäß abgeschlossen ist, kann es sich lohnen, diese Lösung auszuprobieren, da es Situationen gibt, in denen der I2C-Bus nach dem Zurücksetzen nur eines der Geräte am Bus Probleme verursachen kann.

Bevor Sie die Master-I2C-Hardware initialisieren, stellen Sie SDA als Eingang ein und testen Sie, ob SDA niedrig ist.

Wenn es niedrig ist, setzen Sie den SCL-Pin auf hoch.

Schalten Sie dann den SCL-Pin auf Low und High um, bis SDA auf High geht (dh alle verbleibenden Bits austakten, die Peripheriegeräte möglicherweise noch zu senden versuchen). Dies kann nicht länger als 8 Taktzyklen dauern - wenn dies der Fall ist, liegt ein anderes Problem vor.

Ich kann nicht garantieren, dass dies Ihr Problem löst, aber es hat meines gelöst!

Es ist keine schlechte Idee, diesen "Buswiederherstellungsalgorithmus" hinzuzufügen, bevor der Master initialisiert wird. Ich werde es umsetzen. Danke dir.

Für den FRA:

  • zuerst GND und Vcc verbinden;
  • Stellen Sie dann sicher, dass A1, A2 und WP das richtige Niveau haben;
  • Erst dann die Datenpins verbinden.

Das Anschließen anderer Pins als der Stromversorgung, bevor der Chip eingeschaltet wird, kann zu Problemen führen.

10k scheint ein bisschen groß für deine Klimmzüge zu sein, und deine Vorderkanten sehen langsam aus. Reduzieren Sie die Widerstände auf etwa 3k und sehen Sie, ob das hilft.

Warum driftet die Aus-Spannung auch mit der Zeit?

Ich habe die Pull-up-Widerstände auf 3,3 k reduziert und das hilft nicht. Ich habe keine Ahnung von diesem Driften.
Auf dem Bildschirm sieht es klein aus, aber ich denke, es sind ungefähr 250 mV. Möglicherweise liegt ein Problem mit der Stromversorgung auf der 3,3-V-Seite vor
Sie haben Recht, die Drift beträgt auf beiden Seiten des I2C-Pegelwandlers etwa 300 mV. Die +3,3-V-Stromversorgung scheint gut zu funktionieren (keine Drift in ihrem Ausgang, wenn die Drift des SCL-Signals auftritt). Könnte es mit dem I2C Level Shifter zusammenhängen?
Überhaupt nicht sicher. Woher kommen 3,3V? Konverter schalten? Auf jeden Fall ist es verdächtig. Ziehen Sie den MINDESTSTROM, den das Gerät mit 3,3 V gemäß Datenblatt benötigt? Wenn nicht, laden Sie Ihre Versorgung mit einem Widerstand auf. Was passiert, wenn Sie ein oder zwei Sekunden warten, bevor Sie mit der Kommunikation beginnen?
3,3 V kommen von einem SMPS (LM3103MH von TI). Ich bin kein Experte für Netzteile, aber wie ich verstanden habe, ist bei diesem Gerät kein Mindeststrom erforderlich, da es bei geringer Last im diskontinuierlichen Leitungsmodus betrieben werden kann. Das gleiche Problem tritt auf, wenn ich zwei Sekunden warte, bevor ich die Kommunikation starte.

Besteht die Möglichkeit, dass etwas anderes versucht, mit diesem Board zu sprechen? Ich hatte einmal so ein Problem; Ich konnte in 60% der Fälle eine Bestätigung erhalten, aber ich kann mich nicht erinnern, jemals eine Kollision gesehen zu haben. Ich vermute, dass der mir zur Verfügung gestellte i2c irgendwie vom echten internen Bus isoliert war. Ich könnte es kontinuierlich ausführen und es würde nur 30% der Nachrichten fallen lassen. Das Problem verschwand in dem Moment, als wir anfingen, direkt mit dem Gerät (einem Netzteil) ohne die dazwischenliegende "Backplane" zu sprechen.

Ich sehe nach Ihrem NAK-Fehler keine Stoppsequenz. Ich vermute, Sie haben einen Haltepunkt, der das Programm an diesem Punkt anhält?

Wenn Sie denken, dass Sie der einzige im Bus sind, können Sie auch versuchen, den wiederholten Start durch einen Stopp / Start zu ersetzen. Ich habe Geräte (insbesondere benutzerdefinierte FPGAs) gesehen, die nicht genau wussten, wie sie mit dem RS umgehen sollten.

[Antwort auf den Kommentar]: Es gibt vieles, was Sie über das FRAM-Board nicht gesagt haben, z. B. ob es sich nur um Speicher oder um ein ganzes Subsystem handelt. Aber wenn Sie das Oszilloskop direkt auf die Leitungen des i2c-Geräts setzen können, das Ihnen Probleme bereitet, und Sie immer noch sehen, was abgebildet ist, würde ich eine Störung ausschließen. I2C ist einfach genug, dass, wenn Sie die richtigen Signale am Eingang sehen, der Chip richtig spielen sollte, es sei denn, es liegt ein internes Problem vor.

Insbesondere möchten Sie auf die FRAM-Seite dieses Level-Shifters gelangen. Eine Unterbrechung des Signals ist wahrscheinlicher als etwas, das normalerweise als Kollision angesehen wird.

Ich möchte darauf hinweisen, dass ein NAK-Zyklus nicht von einem Chip zu unterscheiden ist, der einfach nicht da ist. EEPROMs tun dies, um anzuzeigen, dass sie beschäftigt sind. Ich habe die Schreibzeit auf FRAM nachgeschlagen und sie ist schneller als ein einzelnes i2c-Datenbit ... also ist das kein Problem.

Es gibt nur einen Master auf dem I2C-Bus und die Platine, die den FRAM einbettet, ist nur mit diesem Bus verbunden. Daher denke ich, dass es keine Chance gibt, dass jemand anderes versucht, mit ihm zu sprechen. Ja, ich habe einen Haltepunkt vor die Stoppsequenz gesetzt. Ich werde versuchen, diesen wiederholten Start durch einen Stop / Start zu ersetzen, wie Sie es vorschlagen, und werde es erneut testen. Laut Datenblatt soll der FRAM wiederholtes Starten unterstützen. Glauben Sie, dass dieses Problem letztendlich gelöst werden könnte, wenn ich den FRAM isoliere (z. B. auf einem dedizierten I2C-Bus)?
Das FRAM-Board bettet nur den FRAM ein. Es ist ein "ISA-ähnliches" Board. Es ist schwierig, die Signale direkt an den FRAM-Pins zu messen, da diese Karte in ein Plastikteil eingebettet ist. Wie auch immer, ich werde versuchen, einen Weg zu finden, diese Signale so nah wie möglich am FRAM zu messen.
Auf die FRAM-Seite von U13 zu kommen, wäre ein großer Schritt.

Da das Problem, wenn es reproduziert wird, ein dauerhafter Fehler ist, der nur durch Entfernen und erneutes Einsetzen des Geräts behoben wird, ist es eines von zwei Dingen: Das Gerät geht in einen schlechten Zustand über, von dem es sich nur durch einen Neustart erholt. oder es besteht ein schlechter Kontakt.

Wenn das Gerät in einen schlechten Zustand gerät, aus dem es sich bei einem Einschaltzyklus erholt, können Sie einen zusätzlichen Schaltkreis haben, der es Ihrer MCU ermöglicht, das Gerät auszuschalten. Die Firmware kann dann, nachdem sie keine Bestätigung von der Vorrichtung erhalten hat, eine Wiederherstellungsprozedur ausführen, bei der sie den Chip für einige Zeit herunterfährt, ihn wieder hochfährt und es dann erneut versucht.

Wenn es sich um einen schlechten Kontakt handelt, müssen Sie sich vielleicht die Zuverlässigkeit des Steckers ansehen und etwas Besseres finden. Wenn Sie denselben Steckverbinder verwenden, um mehrere dieser Platinen herzustellen, kann es im Feld zu Problemen kommen. In jedem Fall kann es ein menschliches Verfahren zur Bewältigung der Situation geben. Der Bediener, der mit dem Gerät arbeitet, muss sich des potenziellen Problems beim Einführen der Karte bewusst sein und dass es möglicherweise neu eingesetzt werden muss, um ordnungsgemäß zu funktionieren.

Ihr Hauptgerät könnte eine Möglichkeit haben, einen Alarm auszulösen, der anzeigt, dass es nicht mit dem FRAM kommunizieren kann: eine "Störungs" -LED auf einem Bedienfeld und / oder ein Piepton oder was auch immer. Oder umgekehrt: ein Licht, das aufleuchtet, gibt dem Benutzer Rückmeldung, dass das FRAM akzeptiert und die Kommunikation hergestellt wurde. Wenn der FRAM weit vom Master-Gerät entfernt ist, kann das Licht auf dem FRAM-Modul lokalisiert werden: ein weiterer I2C-Chip, der eine LED ansteuert.

Die sporadische Natur des Problems deutet darauf hin, dass es sich um ein Timing-Problem handeln könnte.

Das Datenblatt listet zwei Sätze von Timings auf, einen für den "Standardmodus" und einen für den "Schnellmodus". Nach Ihren Messungen scheinen Sie sich an der Grenze der "Standardmodus" -Timings zu befinden. Ich kann aus dem Überfliegen des Datenblatts nicht erkennen, wie genau der Chip in einen der beiden Modi versetzt wird.

Ich würde nicht davon ausgehen, dass sich Ihr Gerät im Schnellmodus befindet. Können Sie die Timings um den Faktor 2-4 reduzieren, sicherstellen, dass Sie sich innerhalb der Standardmodus-Timings für Startbedingungs-Haltezeit, Clock-High-Periode und Clock-Low-Periode befinden, und prüfen, ob dieses Problem weiterhin auftritt?

Mein Gerät befindet sich im „Standard Mode“ (SCL-Frequenz von 100kHz). Tatsächlich liegt diese Frequenz an der Grenze dieses Modus. Ich werde versuchen, es um den Faktor zwei zu reduzieren und einige Tests zu machen.

Hast du ein 24c04a, b oder c? Wenn es ein c04a ist, war es ein robustes Design. Der b-Teil ist empfindlich gegenüber Stromversorgungsrampen. Welche Entkopplung haben Sie auf Pin8 zu GND? Ich wollte etwas über Signalpegel sagen, aber ich sehe, dass Sie einen Pegelübersetzer verwenden. Vielleicht möchten Sie überprüfen, ob bei SCL keine Störung auftritt, die der Chip als zusätzlichen Takt interpretieren würde.

Haben Sie das auf einem alten Mobiltelefon mit nur neun Tasten eingegeben?
Der verwendete FRAM ist der FM24C04B . Woher haben Sie diese Informationen über die Leistungsempfindlichkeit dieses Gedächtnisses? Kannst du mir mehr Inputs geben? An Pin 8 gibt es keine Entkopplung. Das Design dieses Moduls wurde vor einigen Jahren erstellt und wir müssen die gesamte Produktion verbrauchen. Nach den mit dem Oszilloskop durchgeführten Messungen scheint es keinen Fehler auf der SCL-Leitung zu geben, wenn das FRAM-Modul angeschlossen und der Level-Shifter aktiviert ist.
Mir ist klar, dass diese Antwort sehr spät kommt, aber meine Informationen zur Vcc-Empfindlichkeit stammen von der Unterstützung von Apps für Ramtron vor Jahren. Ich erinnere mich nicht an die genauen Details, aber unter bestimmten Rampenraten und Temperaturen blockiert der Chip im Wesentlichen und erlaubt keine I2C-Kommunikation, bis Sie mit einer „guten“ Rampe einschalten. Keine Entkopplungskappe in der Nähe des Chips zu haben, ist nicht gut. Möglicherweise stellen Sie fest, dass die Verwendung einer Entkopplung von 0,1 uF gegenüber 10 uF die Vcc-Rampe ändert, bei der die eine funktioniert und die andere nicht. @angelatlarge, ja, tut mir leid, dass ich meine erste Antwort von einem Telefon eingegeben habe.