I2C - Wo ist die ACK

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)?

Es ist auch möglich, dass Sie die Slave-Adresse falsch eingegeben haben, das Gerät in einem NAK-Zustand ist oder Ihre Uhr zu schnell geht. Was ist das Gerät? Wie stark ist der interne Pullup?
@pjc50 Der Takt ist auf EFM32 der niedrigstmögliche (93458Hz), die Adresse ist auch wie im Datenblatt angegeben. Was ist ein NAK-Zustand?
Ich habe gerade ein Problem debuggt, bei dem ich etwa 1 uS von der fallenden Flanke von SCL bis zu einem Wechsel von SDA benötigte. Definitiv nicht gemäß I2C-Spezifikation, aber das war nötig, damit es funktioniert.
NAK-Zustand: Ich meinte, dass das Gerät aus irgendeinem Grund wirklich nicht bereit sein könnte. Ohne ein Datenblatt für das Slave-Gerät weiß ich nicht, ob das möglich ist.

Antworten (3)

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.

Nein, IIC-Adressen sind 7 Bit, niemals 8 Bit. Es gibt auch einen erweiterten Standard, der ein zweites Adressbyte verwendet und daher eine breitere Adresse hat (11 Bit?), aber das sind definitiv mehr als 8 Bit, -1. Aber +1 für den Rat, alle Adressen in einer Schleife zu versuchen, also nennen wir es sogar.
Ich bezog mich auf das "7-Bit, aber sie verschieben es nach links, um Platz für das R / W-Bit" zu lassen. Sie werden Ihnen gerne sagen, dass das EEPROM bei 0x50 ist, wo der Rest der Welt 0xA0 sagen wird. Es kommt natürlich auf den Kontext an, in dem es verwendet wird.
Ich stimme gbarry zu, viele Datenblätter geben eine 8-Bit-Lese- und eine 8-Bit-Schreibadresse an, die nichts anderes als die 7-Bit-Adresse plus das RW-Bit ist, entweder gesetzt oder gelöscht.

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.