Was ist das I2C ACK und wie erkenne ich es?

Ich schreibe einen FPGA-Treiber in Verilog für einen Temperatursensor (Datenblatt hier verfügbar ). Das Kommunikationsprotokoll ist SMBus, ein enger Verwandter von I2C. Wenn ich jetzt das Datenblatt lese, verstehe ich, dass das ACK-Signal aus zwei Teilen besteht (siehe Seite 10, Abbildung 5):

  1. Zuerst wird SDA im 9. Taktzyklus niedrig getrieben
  2. Dann wird SDA zwischen dem 9. und 1. Taktzyklus "gespitzt" (hoch getrieben, dann sofort niedrig getrieben).

Dies scheint diesem Tutorial zu widersprechen , in dem behauptet wird, dass ein ACK einfach durch Herunterfahren von SDA erfolgt (es wird keine "Spitze" erwähnt).

Ist diese "Spitze" tatsächlich im ACK-Signal enthalten? Wenn ja, wie soll ich den "Spike" erkennen?

Geben Sie hier die Bildbeschreibung ein

Sehen Sie sich diese Datei unter Abschnitt 6.2 an. Das scheint die Spezifikation des I2C zu sein
@AndrejaKo: Danke, aber aus meiner Sicht ist der Link tot.
@AndrejaKo - Das ist ein altes (1995!) Dokument. Die neueste Version der Spezifikation, Februar 2012, ist hier
IIC ACK ist effektiv eine Verletzung des IIC-Datenübertragungsprotokolls, das verwendet wird, um den Empfang eines abgeschlossenen Datenblocks zu signalisieren. Jede Spitze ist zufällig. Solange Sie die Anweisungen befolgen und die Timing-Anforderungen erfüllen, wenn andere Signale steigen oder fallen (um etwas zu erzeugen, was als „Spitzen“ angesehen werden könnte, ist dies nicht relevant. Beachten Sie, dass „hoch getrieben und dann sofort niedrig getrieben“ NICHT etwas ist, was Sie tun würden erwarten, von einer Datenblattbeschreibung zu bekommen IIC ist im Wesentlichen Timing-unabhängig, solange Setup- und Hold-Zeiten eingehalten werden, dh nicht wie zB asynchrone oder synchrone serielle Kommunikationen, die von der Taktrate abhängig sind
Auf einem Open-Drain-Multidrop-Bus gibt es kein "Hochfahren". Der offene Abfluss kann nur niedrig fahren. Das Gegenteil ist "Busfreigabe".
@Russell - Warum nennst du es einen Verstoß?
Wow, Sie machen sich eine Menge Mühe, um nicht einfach die Spezifikation zu lesen. Wenn Sie es nur lesen, würden Sie genau sehen, was das ACK-Bit ist und welche Regeln es hat.
@Russell: Ich sehe nicht, wie ACK eine Verletzung ist. Die Start- und Stoppsequenzen sind absichtliche Verstöße gegen die Regel, dass sich SDA nur ändern kann, wenn SCL niedrig ist, aber diese Regel wird durch ACK nicht verletzt.
Olin/Steven - vielleicht Brainfade und langes Nichtbelichten meinerseits. Das Gehirn bot eine "Antwort" als Verletzung an, und ein anderer Teil des Gehirns hängte dies an ACK und nicht an Start / Stopp. Lange kein Spiel IIC.
@Olin - Ich habe I2C noch nie gebissen, also musste ich mir nie Gedanken über diese Busfreigabe machen. Das Lesen des Datenblatts sollte alle Ihre Fragen beantworten, aber hier ist das Datenblatt mehrdeutig, zeigt eine Busfreigabe in einem Diagramm und spricht dann nie darüber. Ich nenne Spezifikationsfehler.
Kümmert sich nicht die Hardware selbst um das ACK? Müssen Sie es in der Software erkennen?

Antworten (3)

Die Spezifikation besagt, dass das ACK nach dem 8. Takt aus einem niedrigen Pegel besteht, wie dieses Diagramm zeigt:

Geben Sie hier die Bildbeschreibung ein

Der Busmaster erzeugt einen 9. Taktimpuls zum Lesen des Pegels. Die Spezifikation spricht nicht über das Pulsen von ACK, und der Master wird es auch nicht bemerken. Befolgen Sie die Spezifikation und kümmern Sie sich um die Einrichtungs- und Haltezeiten der Daten (250 ns und 5 μ s bzw. für den Standardmodus), um sicherzustellen, dass der Füllstand richtig erkannt wird.

Was Sie als Spitze im ACK sehen, ist kein Teil des ACK, sondern eine Busfreigabe zwischen dem ACK und einem ersten Datenbit auf niedrigem Pegel des nächsten Wortes. Die Busfreigabe erfolgt, nachdem SCL wieder auf Low geht, sowohl in Ihrem als auch in meinem Diagramm. Gemäß dem obigen Diagramm ist diese Freigabe erforderlich; Beachten Sie, dass der niedrige Pegel des SDA nach ACK unterbrochen wird, was anzeigt, dass SDA hoch gehen muss.

Hinweis: Die Busfreigabe wird nicht im Timing-Diagramm, Abbildung 38, angezeigt, noch ist das Timing in den AC-Kennlinien angegeben. Ich konnte im Text der Spezifikation keinen Hinweis darauf finden. Es gibt auch keine SCL-Aktivität während dieses SDA-Hochs. Dies deutet darauf hin, dass die Busfreigabe nicht wirklich erforderlich ist. In diesem Fall enthält das Diagramm einen Fehler, der anscheinend von anderen kopiert wurde, wie im TMP175-Datenblatt.

bearbeiten
Madmanguruman kommentiert, dass das ACK vom Slave kommt, während das nächste Datenbit vom Master kommt. Das wird oft der Fall sein, und er hat Recht. Das nächste Datenbit kommt aber auch vom Slave, wenn es die Antwort des Slaves auf einen Lesebefehl ist. Dann wäre es durchaus sinnvoll, dass der Slave den Bus nicht freigibt.

Ich verstehe, danke. Ich bin immer noch verwirrt über diese Spitze, die ich im Zeitdiagramm des Datenblatts sehe. Was könnte es sein?
@Randomblue Es ist keine Spitze. Der Bus wird nach dem ACK freigegeben und geht hoch. Denken Sie daran, dass SCL hier niedrig ist, also darf sich SDA ändern. Das erste Bit, das nach dem ACK gesendet wird, ist 0, also wird SDA heruntergezogen. Wenn das erste Bit, das nach dem ACK gesendet wird, 1 ist, würde es einfach hoch bleiben.
@Madmanguruman - Richtig, aber die Frage ist: Müssen Sie den Bus zwischen ACK (Low) und dem ersten Bit des nächsten Bytes freigeben, wenn dieses Null ist (ebenfalls Low). In diesem Fall können Sie das Niveau genauso gut niedrig halten. Graph sagt, dass Sie den Bus zwischen den beiden niedrigen Pegeln freigeben müssen, aber dies wird im Rest der Spezifikation nicht bestätigt.
@stevenvh Das ACK ist der Empfänger , der SDA niedrig hält. Der Empfänger muss den Bus freigeben, damit der Sender kommunizieren kann – er hat kein Vorwissen über das nächste Bit!
@Madmanguruman - Guter Punkt. Das nächste Byte kann jedoch eine Antwort des Empfängers sein, wenn der Master einen Lesebefehl ausführt.

Ich habe neulich versucht, einen I2C-DAC zum Laufen zu bringen, und ich hatte genau dieselbe Frage. Der Busmaster/Host sendet ein Byte an ein Gerät und sobald das Gerät es erfolgreich empfangen hat, zieht es die Datenleitung (SDA) auf Low, um dem Busmaster anzuzeigen, dass das Byte empfangen wurde. Das Datenblatt des DAC erwähnte einen Gerätekonnektivitätstest, indem nach dem ACK des Geräts gesucht wurde. Da ich nur Zugriff auf ein analoges Oszilloskop hatte, stellte ich schnell fest, dass der DAC höchstwahrscheinlich keine ACKs sendete, da der Rahmen auf dem seriellen Bus nur lang genug für ein einzelnes Byte war, während ich drei aufeinanderfolgende Bytes erwarten würde. Außerdem konnte ich kein überzeugendes ACK im Signal finden (ein niedriges Bit). Ich dachte mir, dass der Busmaster / Host intelligent genug sein könnte, das zweite Byte nicht zu senden, wenn er kein ACK vom Empfänger, dem DAC, erhalten hat. Das würde erklären, warum ich zu kurze Nachrichten gesehen habe, die den I2C-Bus passierten. Da der DAC ein ziemlich einfaches Gerät ist, war die einzige Option, die mir einfiel, die Verwendung einer falschen Geräteadresse. Also fing ich an zu versuchen, den DAC mit verschiedenen Adressen anzusprechen, und ziemlich schnell entdeckte ich einen Rahmen auf dem seriellen Bus, der viel länger war als die anderen.

Nun zur Beantwortung Ihrer Frage: Als ich den DAC erfolgreich ansprechen konnte, bemerkte ich einen interessanten Effekt. Als meine Oszilloskopsonde in der Nähe des DAC angebracht war, war der ACK-Impuls auf dem analogen Oszilloskop deutlich sichtbar. Wo alle vom Host gesendeten Bits einen bestimmten Mindestspannungspegel hatten, wurden die ACK-Impulse viel besser auf 0 V gezogen. So würden beispielsweise vom Host gesendete 0-Bits etwa 0,2 V messen, die ACKs würden 0,1 V messen. Die Werte in diesem Beispiel dienen nur dazu, meinen Standpunkt zu veranschaulichen. Dadurch heben sich die ACK-Pulse deutlich vom restlichen Datenstrom ab.

Jede laufende I2C-Transaktion wird beendet, wenn sich SDA ändert, während SCK hoch ist. Jedes I2C-Gerät, das SDA aktivieren oder freigeben möchte, muss dies entweder zu einem Zeitpunkt tun, zu dem sicher sein kann, dass SCK nicht steigen wird. Es gibt zwei Möglichkeiten, wie ein Gerät sicher sein kann, dass SCK nicht ansteigen wird: (1) es kann SCK selbst bestätigen, oder (2) wenn es eine fallende Flanke an SCK sieht, kann es wissen, dass SCK für a niedrig bleiben wird bestimmte Mindestzeit (abhängig von der Busgeschwindigkeit). Da die meisten I2C-Slave-Geräte niemals SCK selbst geltend machen, können sie ihre Ausgabe auf SDA nur unmittelbar nach einer fallenden Flanke von SCK sicher ändern.

Ein I2C-Master kann jedoch jederzeit den Zustand auf SDA ändern, wenn er SCK geltend macht. Um den Zustand des ACK-Bits eines entfernten Geräts zu lesen, muss der Master SDA vor der ansteigenden Taktflanke nach dem ack freigeben und muss es bis nach der nächsten abfallenden Flanke von SCK freigegeben lassen. Selbst wenn das erste übertragene Bit nach dem "ack" eine "0" sein sollte, sollte der Master zwischen der Behauptung von SCK und der Behauptung von SDA verzögern. Die Tatsache, dass Slaves sofort auf eine fallende Flanke an SCK reagieren, während Master eine Verzögerung zwischen dem Ansteuern von SCK und SDA hinzufügen müssen, bedeutet, dass es bei einer "Übergabe" der Steuerung vom Slave an den Master oft einen kurzen Moment geben wird wenn keines der Geräte es für angemessen hält, SDA geltend zu machen (technisch gesehen die erforderliche Mindestverzögerung zwischen Master'

Wenn übrigens keine Slaves Clock-Stretching verwenden, kann man auf einem Scope-Plot leicht feststellen, welche SDA-Änderungen vom Master und welche vom Slave verursacht werden. Ändert sich SDA gleichzeitig mit dem Wechsel von SCK von High auf Low, wird die Änderung vom Slave verursacht. Wenn sich SDA zu einem anderen Zeitpunkt ändert, wird die Änderung vom Master verursacht.