Problem mit dem I2C-Kommunikationssignal

Mikrocontroller-SchemaGeben Sie hier die Bildbeschreibung einI2C-Signalkommunikation SDA (PINK) SCL (Gelb)

Hallo an alle,

Ich arbeite an einem I2C-basierten Kommunikationsgerät bq27742-g1 (Texas Instrument). Die Batteriestandsanzeige ist die Slave-Geräteadresse 0xAA. Ich habe den 10K-Pullup-Widerstand eingebaut.

Dabei verwende ich den Cortex M4-Mikrocontroller der Kinetis-Serie als Master-Gerät. Der Mikrocontroller arbeitet mit einem anderen I2C-Gerät zusammen.

Ich habe die Batteriestandsanzeige bq27741-g1 mit einem MSP430 Launchpad-Board mit I2C-Scanner getestet und sie funktioniert einwandfrei.

Ich habe einen Screenshot von CRO-Signalen (SDA (PINK) SCL (Gelb)) des I2C-Geräts im 9. Taktimpuls von SCL angehängt, wenn SDA einen unbestimmten Zustand hat. Warum passiert das auf dieser Ebene? Liegt das Problem am Pullup-Widerstand?

Hast du irgendwelche Pegelumsetzer im I2C verwendet (wie MOSFET-Pegelumsetzer usw.)
Das sieht so aus, als hätte der ti.com-Teil es versucht, konnte aber die Datenleitung nicht auf Low treiben, um die vom Master gesendete Adresse zu bestätigen. Sind Sie sicher, dass die Masse des bq27742-g1 die gleiche Spannung wie die Masse des Prozessors hat?
Irgendetwas stimmt mit deiner Schaltung nicht. Glaubst du wirklich, dass es hilfreich ist, den Schaltplan geheim zu halten?
@ user19579 Ich verwende einen Free-Scale-Mikrocontroller mit 3,3 V Pegel und I2c-Gerät auch gleich.
@st2000 beide Masse sind gemeinsam.
@CL. Ich habe Schaltplan aktualisiert.
200 Ohm sind viel Widerstand zwischen dem Bq27741-g1 I2C-Treiber und dem I2C-Bus. Dieser Teil des ti.com Bq27741-g1-Spezifikationsschemas sagt "Zusätzlicher ESD-Schutz. Nicht Teil der Anwendungsschaltung." Es ist also nicht bekannt, ob es notwendig ist. Bei einem 10-kOhm-Pullup sollte dies jedoch nicht das Problem verursachen, das Sie auf dem Oszilloskop zeigen. Bitte überprüfen Sie, ob Sie mit einem 10-kOhm-Widerstand hochziehen. Da es sich um einen 100-Ohm-Widerstand handelt.
Lese ich diesen Zielfernrohrschuss richtig? Schwingen die I2C-Leitungen wirklich zwischen 0 und 35V-37V? Bei 20V pro Teilung sieht es sicher so aus. Wenn das wirklich der Fall ist, dann haben Sie wahrscheinlich den GQ27741-G1 gebraten. Das absolute Maximum an den I2C-Pins beträgt 5,5 V beim GQ27741.
@KalaravN.Parmar - (a) Sie sagten: "Ich habe den Pull-up-Widerstand von 10 k eingestellt", aber in dem von Ihnen bereitgestellten Schaltplan sind keine I2C-Pull-up-Widerstände dargestellt. Bei einem I2C-Problem müssen Sie uns alle Komponenten (alle Widerstände, alle ICs usw.) zeigen, die an den I2C-Bus angeschlossen sind. (b) Diese Wellenform auf SDA (rosa) ist klassisch für Signalkonflikte, z . B. zwei Totem-Pole-Ausgänge, die das Signal auf entgegengesetzte Pegel treiben. Suchen Sie nach einem Gerät, das dieses Signal ansteuert, das nicht für Open-Drain-Ausgang eingerichtet ist. (c) Wie CHendrix hervorgehoben hat, müssen Sie erklären, warum Ihr Oszilloskop zeigt, dass SCL ca. 37V pp.
@st2000 gemäß Ihrem Vorschlag habe ich den Vorwiderstand entfernt und versucht, aber die gleiche Welle von ist ob cro angekommen.
@CHendrix tut mir leid, aber ich verwende ein Gerät mit einem maximalen Spannungspegel von 3,7 V, und cro arbeitet im 10X-Modus, also wurde es von mir verwechselt. Entschuldigung dafür.
@SamGibson Hallo Sir, ich habe auch das Schema des Mikrocontrollers aktualisiert, die Tankanzeige ist eine Art von Zusatzkarte.
@Kalarav N. Parmar, implementieren Sie I2C in Software? Oder haben Sie die I2C-Hardware von Kenetic verwendet? Wenn Sie in der Software den Pin, der den I2C DATA-Pin steuert, drei Zustände (auf Eingang setzen) müssen, wenn Sie ihn nicht auf Low treiben. Wenn Sie die I2C-Hardware von Kenetic verwenden, wie lautet die Teilenummer des Prozessors, Pin-Anzahl, Pin, den Sie für I2C-DATEN verwenden, und den Wert, den Sie im Mux-Register von Kenetic einstellen, das diesen Pin steuert.
@KalaravN.Parmar - Wenn Ihre 2 Schaltpläne jetzt alle I2C-Geräte zeigen, dann weisen die bisher bereitgestellten Informationen darauf hin, dass die MCU-Firmware die Art von Problem verursacht, die ich in meinem vorherigen Kommentar (Punkt (b), Signalkonflikt) und wie erklärt habe spätere Antworten und die hilfreichen Kommentare von st2000 haben auch erwähnt. Das ist der Bereich, den ich an Ihrer Stelle untersuchen würde.
@SamGibson Vielen Dank an alle für Ihre größte Unterstützung gemäß dem Vorschlag, SCL und SDA als Open-Drain-Aktivierung zu definieren und die Geschwindigkeit auf 100 KHZ einzustellen, und es funktioniert gut und großartig. danke nochmal an euch alle..
Danke an euch alle für die tolle Resonanz und Unterstützung

Antworten (2)

Ich bin mit der Kinetic MCU nicht vertraut, aber auf einer anderen MCU hatte ich die gleiche Wellenform, als ich die SDA-Leitung als regulären Ausgang falsch konfigurierte, anstatt sie als Open-Drain-Ausgang zu konfigurieren.

Sie können sehen, dass der Slave mit einem ACK antwortet und versucht, SDA niedrig zu fahren, aber etwas (wahrscheinlich der Kinetic als I2C-Master) treibt SDA hoch, sodass Sie die Spannung bei 1/2 der Schiene während Bit 9 sehen.

Stellen Sie SDA als Open Drain ein.

Auf den Kinetic-Prozessoren sollte die Pin-Multiplex-Funktion Pin-Eigenschaften konfigurieren (konfiguriert normalerweise) Pin-Eigenschaften. Obwohl Ihr Kommentar mich dazu bringt, dies in Frage zu stellen. Möglicherweise liegt ein Problem mit diesem speziellen Kinetic-Prozessor oder dieser speziellen Funktion vor. Aber meiner Erfahrung nach ist alles, was benötigt wird, "das Feature mit dem physischen Pin zu verbinden".
Weißt du, mir ist gerade eingefallen, dass @Kalarav N. Parmar möglicherweise das I2C in Software implementiert. Und den Bus nicht richtig fahren.
@st2000 Ja, ich implementiere i2c in Software.
@KalaravN.Parmar, dann müssen Sie den Pin auf Ausgang und Low für ein Low setzen. Aber für ein High müssen Sie es als Eingang festlegen. Fahren Sie keinen I2C, sondern Line High. Lassen Sie das den Pull-up-Widerstand tun. Lassen Sie mich wissen, wenn Sie möchten, dass ich dies mit weiteren Details in eine Antwort einfüge. Warum verwenden Sie nicht den eingebauten I2C? Ich bin mir fast sicher, dass all dies in der Hardware für Sie erledigt wird, wenn Sie dies tun. Ha, das erklärt auch, warum die Oszilloskopspuren nicht konsistent ausgerichtet sind! Es gibt ein wenig Jitter an den Rändern, weil es von Software ausgeführt wird.
@st2000 Ich verwende den internen I2C des Kinetic-Mikrocontrollers, aber er hat auch die Funktion, dass wir diese Pins als OPEN DRAIN ENABLE aktivieren können, nachdem ich Nake SCL und SDA zu ODE habe. Also, es funktioniert gut, I2C Write und I2c Read.
Ich verwende diesen speziellen Kinetic-Prozessor nicht. Aber ich erinnere mich nicht an eine Kinetic-Funktion wie den Open-Collector-Ausgang der Kinetic-Prozessoren, mit denen ich gearbeitet habe. Außerdem sagten Sie, Sie würden I2C in Software implementieren. Jetzt sagen Sie, dass Sie den internen I2C der Kinetik verwenden. Also bin ich verwirrt. Außerdem haben Sie gesagt, dass Sie auch OPEN DRAIN ENABLE aktiviert haben. Wie ich bereits sagte, dachte ich, dass die Kinetic-Hardware den I2C-Pin automatisch konfigurieren würde, wenn Sie sich entscheiden, den internen I2C mit einem Pin zu verbinden. Wieder bin ich verwirrt. Aber wenn es jetzt funktioniert, super.

Dieses Problem tritt auf, wenn I2C-Slave und -Master beide versuchen, die Leitung gleichzeitig in entgegengesetzte Richtungen zu treiben.

Ihre Batteriestandsanzeige ist I2C-Slave und MSP ist I2C-Master. Verwenden Sie einige Bibliotheken für die I2C-Kommunikation oder haben Sie das I2C-Protokoll selbst implementiert?

Im 9. Taktzyklus sollte MSP die SDA-Leitung freigeben (in den Tristate-Eingang umwandeln ), damit die Kraftstoffanzeige sie niedrig treiben kann. Dieses Tief sollte als Bestätigung interpretiert werden. Bitte überprüfen Sie Ihren I2C-Code.

Auf einem normalen I2C-Bus sind alle Treiber Open Collector. Keiner der Fahrer sollte in der Lage sein, den Bus hoch zu ziehen.