SDA und SCL für I2C sind immer niedrig

Ich habe eine Leiterplatte mit einigen Sensoren ( Kreisel , Beschleunigungsmesser usw.) entworfen, die das I2C-Protokoll zur Kommunikation verwenden. Wenn ich jedoch einen Arduino UNO als Master verwende, kann ich die Wellenform sowohl des SDA-Busses als auch des SCL-Busses nicht sehen. Sie bleiben bei ~400 mV statisch, wenn sie mit einem Oszilloskop gemessen werden. Wenn ich ein anderes Board (wie dieses ) mit demselben Testset verwende, kann ich die von SDA und SCL erzeugte Wellenform deutlich sehen

Normalerweise bedeutet dies entweder, dass etwas kurzgeschlossen ist, aber ich habe kein Problem gesehen, als ich mit einem Multimeter die Kontinuität aller Vias für SCL, SDA, VDD und GND überprüft habe. Der Widerstand zwischen SCL/SDA und GND beträgt ~1M Ohm.

Es könnte auch sein, dass die Pullup-Widerstände am I2C-Bus fehlen, aber ich habe für jeden I2C-Bus einen 4,7kOhm Pullup-Widerstand verwendet. Ich habe auch versucht, den Widerstand zu verringern, indem ich ein parallel geschaltetes Potentiometer anschloss. Die Spannung von SCL/SDA steigt mit abnehmendem Widerstand, aber es gibt überhaupt keine Wellenform.

Es gibt tatsächlich 3 I2C-Leitungen auf der Platine, um widersprüchliche I2C-Adressen zu vermeiden, und keine davon funktioniert. Die einfachste Linie enthält nur einen Kreisel und einen eCompass. Die Schaltpläne sind unten:Kreisel eKompass

Die vollständigen EAGLE-Schaltpläne und Board-Dateien finden Sie hier .

Klingt so, als hätten Sie KEINE Pull-up-Widerstände. Messen Sie den Widerstand zwischen SDA und SCL und VDD. Stellen Sie dann sicher, dass VDD mit Strom versorgt wird, wenn der Stromkreis eingeschaltet ist. Sie sollen hoch hinaus.
Es ist eher ein Softwareproblem.
Wenn Sie 4,7 kOhm angeschlossen haben, ist der Widerstand zwischen SCL/SDA und GND wahrscheinlich niedriger als 1 Megaohm. Wahrscheinlich müssen Sie auch den Widerstand zwischen SCL/SDA und VCC messen.
Der Widerstand zwischen SCL/SDA und VDD beträgt tatsächlich wie erwartet 4,7 kOhm (mit Multimeter gemessen). VDD wird definitiv mit Strom versorgt - ich habe eine LED auf der Platine verwendet, um dies zu überprüfen. Ich glaube auch nicht, dass es ein Softwareproblem ist. Ich habe bereits verschiedene Basisprogramme ausprobiert, um eine I2C-Kommunikation aufzubauen. Keiner von ihnen hat auf meinem Board gearbeitet, aber sie arbeiten auf anderen Boards
Veröffentlichen Sie die Schaltpläne, damit wir sehen können, ob das Problem vorhanden ist, und möglicherweise ein Bild der fertigen Leiterplatte mit Komponenten darauf (z. B. Chip, der in falscher Ausrichtung montiert ist).
Trennen Sie nach Möglichkeit die Slaves und prüfen Sie, ob die Leitungen hoch gehen. Überprüfen Sie alternativ die Stromversorgung der Slaves. Schaltplan? Slave-Gerät? Datenblätter? Messen Sie den Widerstand zwischen SCL und SDA.
Die von Ihnen hinzugefügten Schaltpläne zeigen keine Pull-up-Widerstände und sind nicht vollständig. Bitte posten Sie den vollständigen Schaltplan Ihrer I2C-Busverbindungen.
Danke für alle Kommentare! Ich habe die Schaltpläne der beiden Geräte auf einer I2C-Leitung und die EAGLE-Dateien hinzugefügt. Außerdem beträgt der Widerstand zwischen SCL und SDA 9,4 kOhm, ist das normal? Das Board enthält nur Slaves. Alle Sensoren werden mit Strom versorgt. Um Slaves zu trennen, müsste ich die gesamte Platine trennen
Es gibt keinen wirklich "normalen" Widerstand für I2C-Pullup-Widerstände. Die geeigneten Pull-Up-Widerstandswerte hängen von der Buskapazität ab, dh die Pull-Ups dürfen nicht so stark sein, dass der Master den Bus nicht nach unten treiben kann, und nicht zu schwach, damit der I2C-Bus keine Zeit zum Ansteigen hat vor dem nächsten Impuls. In diesem App-Hinweis erfahren Sie, wie Sie einen korrekten Pull-up-Widerstand berechnen: e2e.ti.com/cfs-file/__key/…
Ihr Widerstand zwischen SDA und SCL ist korrekt - 4,7 k von SCL zu VDD, weitere 4,7 k von VDD zu SDA, macht genau 9,4 k. Trennen Sie, wie hier empfohlen, alle Slaves und prüfen Sie, ob die Leitungen hoch gehen. Dies scheint tatsächlich ein Softwareproblem zu sein, z. B. falsch konfigurierte MCU-Pins (natürlich nicht 100% sicher).
Wo hast du das Board machen lassen? Es gibt viele enge Abstände auf Ihrer Leiterplatte, z. Spuren, die sich innerhalb von 5 mil von Durchkontaktierungen usw. befinden. Dies liegt außerhalb der Toleranz der meisten billigen Leiterplattenfabrikate.
Der Schaltplan ist schwer zu überprüfen (es wäre viel klarer, die Netzetiketten vom Typ Box zu verwenden, bei denen die spitze Ecke den Draht berührt)
Die Leiterplatte ist auch schwer zu überprüfen, weil sie in einer Ecke so dicht ist und sich alle Teileetiketten überlappen. Aber eine oberflächliche Inspektion ergab eine Menge potenzieller Freigabeprobleme.
Und Sie haben 5 V am VREF-Pin des ADC128D818, was seine Versorgungsspannung von 3,3 V übersteigt.

Antworten (1)

Es gibt mehrere Probleme mit Ihrem Design.

Schema:

  • VDD_IO-Pins des LSM303 sind mit Masse verbunden
  • Der Vref-Pin des ADC128D818 ist mit 5 V verbunden, was die Versorgungsspannung übersteigt
  • evtl. mehr, ich habe keine erschöpfende Prüfung vorgenommen.

Die erste davon reicht wahrscheinlich aus, um das Problem zu verursachen.

Leiterplatte:

  • Sehr enge 5-mil-Abstände überall und Spuren, die den Durchkontaktierungen sehr nahe kommen. Es könnte zwar funktionieren, wenn es von einem guten Fabrikat hergestellt wird, dies erfordert jedoch Ärger und einen versehentlichen Kurzschluss irgendwo. Sie brauchen nicht einmal so enge Abstände für dieses Board, also machen Sie es den Fabs leicht :)

  • Die Spuren sind auch sehr dünn – das ist für das Signal in Ordnung, aber stellen Sie sicher, dass Ihre Stromspuren, einschließlich derjenigen zu den Entkopplungskappen, etwas dicker sind. Kurze Leistungsspuren können 10 mil betragen, versuchen Sie, mehr für lange zu verwenden.

Ich würde vorschlagen, zuerst Ihren Schaltplan aufzuräumen. Verwenden Sie zur Verdeutlichung die Stromversorgungssymbole (z. B. +3V3, +5V usw.) anstelle von Netzkennzeichnungen. Verwenden Sie durchgehend den gerahmten und spitzen Typ von Netzetiketten ("Xref"-Kontrollkästchen im Eigenschaftsdialogfeld) und stellen Sie sicher, dass es offensichtlich ist, mit welchem ​​​​Kabel sie verbunden sind (das Etikett darf nicht vom Kabel versetzt sein).

Wenn das erledigt ist, überprüfen Sie alles auf mögliche Fehler. Gehen Sie jedes Datenblatt durch, rufen Sie den Abschnitt "Pin-Konfiguration und -Funktion" auf und überprüfen Sie den Schaltplan Pin für Pin und überprüfen Sie auch die zulässigen Spannungen. Wiederholen Sie dann Ihre Leiterplatte mit etwas großzügigeren Abständen und stellen Sie sicher, dass keine DRC-Verletzungen vorliegen.

Vielen Dank! Dieser VDD_IO-Fehler ist riesig. Ich werde auf jeden Fall die Schaltpläne überprüfen und das Board neu gestalten. das Brett neu gestalten. Übrigens habe ich OSH-Park für die Leiterplatte verwendet. Ich bin mir nicht sicher, ob sie gut sind oder nicht haha
@ user295069 OSHpark geht es gut, also ist die Platine wahrscheinlich in Ordnung, aber es ist trotzdem eine gute Idee, Ihre Platine mit größeren Abständen zu entwerfen. Hast du den Autorouter benutzt? Dies ist eine klassische Ursache dafür, dass Leiterbahnen sehr nahe an Durchkontaktierungen herankommen, wenn dies eigentlich nicht erforderlich ist.
Achten Sie auch auf den Schaltplaneditor von Eagle: Nur die Spitze der Stifte stellt eine Verbindung her. So ist zum Beispiel unklar, ob Pin 18 von U4 tatsächlich mit C2 verbunden ist und ob C2 tatsächlich mit Masse verbunden ist. Dies lässt sich am besten durch einen Abstand zwischen den Symbolen verdeutlichen, sodass zwischen Stiften und Anschlüssen immer mindestens eine Einheit grünes Kabel vorhanden ist. Eine gute Möglichkeit, dies zu testen, besteht darin, das Teil zu bewegen; Wenn sich die Drähte nicht mitbewegen, waren sie nicht wirklich verbunden, obwohl sie sich möglicherweise überlappt haben. Hat mich ein paar mal erwischt.
Ich habe gerade nachgesehen und C2 verbindet sich nicht mit Pin 18: Versuchen Sie, C2 zu bewegen und beobachten Sie. Es funktioniert nur, weil Sie den Draht an Pin 18 manuell als dasselbe Netz gekennzeichnet haben.
Demonstration: imgur.com/a/w3L7K8B
Vielen Dank für den Hinweis! Es ist definitiv mehrdeutig auf den Schaltplänen. Da Pin18 und Pin15 jedoch beide mit 3V3PDM_9 verbunden sind, verbinden sie sich auch mit C2. Ich denke, mein nächster Schritt wird sein, den LSM303-Chip auf der I2C3-Leitung zu entlöten und dann zu sehen, ob ich eine Wellenform bekommen kann. Was denken Sie?
@ user295069 Möglicherweise können Sie die Leiterbahn sogar abschneiden, bevor sie die Durchkontaktierung zur Masse erreicht, die Lötmaske abziehen und einen Draht an 3V3 löten. Suchen Sie nach "pcb bodge" ;)
Natürlich ist es möglich, dass die Chips bereits beschädigt sind, aber Sie können diesem Prototyp möglicherweise weitere Informationen entnehmen. Schneiden Sie auch die 5-V-Spur zum Vref des ADC, wenn Sie können.
Ich habe den LSM303 entlötet und die restlichen Sensoren funktionieren alle! Vielen Dank