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.
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):
I2C-FRAM-Adresse nicht bestätigt (Slave-Adresse wird korrekt gesendet):
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 mit dem FRAM verbundenen SDA- und SCL-Signale durch die Verwendung von BLM18-Ferriten von Murata gefiltert werden.
Das FRAM ist wie folgt angeschlossen:
Diese Karte ist eine "ISA-ähnliche" Karte, die nur den FRAM einbettet.
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.
FRAM_SDA- und FRAM_SCL-Signale wurden nach jedem Schritt gemessen.
Das Problem tritt immer noch auf.
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.
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?
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.
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!
Für den FRA:
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?
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.
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?
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.
Suirnder
Kaz
Ben Gartner
fm_andreas
josey
josey
josey
josey
Suirnder
Kaz
josey
josey
Scott Seidmann
josey