Ich arbeite an einem I2C-Master-Treiber für die Anbindung eines bestimmten Peripheriegeräts. Das Problem, das ich habe, ist, dass das Slave-Gerät die SDA-Leitung nicht herunterzieht, wenn die 9. Uhr ankommt.
Ich habe die Signale mit einem Oszilloskop überprüft, und alles sieht gut aus. die Adresse ist in Ordnung. Ich verwende keine externen Pullup-Widerstände, sondern die interne Pullup-Fähigkeit meiner MCU (EFM32GG).
Ich bin kein Elektroingenieur und meine Erfahrung stammt von der Softwareseite, daher mag diese Frage albern sein, aber besteht die Möglichkeit, dass das Gerät die Leitung nicht herunterziehen kann, weil der Pull-up-Antrieb zu hoch ist?
Kann es eine andere Erklärung für dieses Problem geben (außer der offensichtlichen, dass der Slave-Chip tot ist)?
Mit dem Oszilloskop sollten Sie eine Art Effekt auf der Datenleitung sehen , auch wenn die Leitung zu stark hochgezogen wird. Es kann nur ein halbes Volt oder so abfallen, nicht genug, um als Null gelesen zu werden.
Es besteht auch die Möglichkeit, dass die Slave-Adresse falsch ist. Manchmal wird die Adresse als 7-Bit und manchmal als 8-Bit angegeben. Letzteres wird 2x ersteres sein. Kostenlose Beratung: Schreiben Sie eine Schleife, um alle Adressen auszuprobieren, und stoppen Sie, wenn eine antwortet.
Ich würde vermuten, dass Sie in diesem Fall mit "Pull-up-Antrieb zu hoch" meinen, dass der interne Pull-up-Widerstand zu klein wäre. Dies ist höchst unwahrscheinlich. Sie können dies sicherstellen, indem Sie den Pull-up einschalten und den Pin zu einem Eingang machen. Dann legen Sie einfach einen Widerstand vom Pin auf Masse, Sie können den internen Pull-Up-Widerstand mit der Spannungsteilergleichung berechnen . Denken Sie daran, dass "großer Pull-up-Widerstand" = "schwacher Pull-up" ist.
Das wahrscheinlichste Problem ist ein Verdrahtungsproblem, wie das Vertauschen von SDA/SCL beim Anschließen des Peripheriegeräts oder das Fehlen einer gemeinsamen Erdung.
Am zweitwahrscheinlichsten wäre der Zeitpunkt. Überprüfen Sie das I2C-Timing-Diagramm Ihres Slave-Geräts (sollte im Datenblatt stehen) und stellen Sie sicher, dass es eingehalten wird, indem Sie mit dem Oszilloskop messen.
Schließlich, wenn es keines dieser anderen Dinge ist, haben Sie möglicherweise tatsächlich einen toten Sklavenchip. Kannst du ein anderes testen?
Es gibt zwei Hauptkomponenten, damit dies funktioniert, die physische elektrische Schnittstelle und die logischen Daten, die gesendet werden.
Auf der elektrischen Seite scheint zumindest der Master selbst korrekt zu funktionieren, wenn Sie auf einem Oszilloskop sehen, dass die Signale gut sind. Da Sie keine Plots bereitgestellt haben, können wir nicht sagen, ob sie wirklich gut sind oder ob Sie eine falsche Vorstellung davon haben, was gut ist. Auf der Slave-Seite müssen die Klimmzüge schwach genug sein, damit der Slave die SDA-Leitung nach unten ziehen kann. Wenn ich mich recht erinnere, sagt die IIC-Spezifikation, dass der Slave nur 3 mA sinken muss, um die Leitung unter den maximalen logischen niedrigen Pegel zu bringen. Wenn Sie beispielsweise eine 5-V-Logik verwenden, bedeutet dies, dass der Pullup nicht weniger als 5 V / 3 mA = 1,7 kΩ betragen kann, sodass ein 2-kΩ-Widerstand eine vernünftige Wahl wäre. Sehen Sie sich die Spezifikationen für den internen Pullup an, den Sie verwenden, und stellen Sie sicher, dass er nicht mehr als 3 mA liefern kann. Wenn dies möglich ist, können Sie es nicht verwenden und müssen einen externen Pullup verwenden.
Auf der logischen Seite müssen Sie sicherstellen, dass der Slave richtig adressiert wird. Die IIC-Sequenz sollte mit beiden Leitungen hoch beginnen, dann eine Startbedingung, bei der SDA niedrig wird, bevor SCL niedrig wird. Danach sollte SDA für jedes Bit auf den neuen Wert wechseln, dann SCL hoch gehen, dann SCL wieder niedrig. Die ersten 7 Bits sind die Adresse, dann das Lese-/Schreibbit. Für das neunte Bit lässt der Master SDA schwebend und der Slave sollte es niedrig ziehen, kurz nachdem SCL niedrig wird.
Meiner Erfahrung nach ist die häufigste Ursache dafür, dass der Slave keine Antwort erhält, eine falsche Adresse.
pjc50
Sanfte Kerze
Benutzer3624
pjc50