I2C Read Acknowledge und Stop condition

OP #7823862
Lesenswert?

Moin in die Runde,

ich möchte mir ein I2C selbst implementieren und habe eine Frage zur Stop Condition: Beim Read Zugriff sendet der Master ja das Acknowledge zu den Daten. Wird beim letzten Byte dann auch noch ein Acknowledge gesendet? Wo kommt dann die Stop Condition hin? Wenn ich sie auf das erste Bit nach dem Acknowledge sende, dann wird sie ja ggf. vom Slave "überschrieben". Muss ich die Stop Condition also schon in meinem ACK Bit setzen? Kann der Slave dann überhaupt noch erkennen, ob das letzte Byte erfolgreich übertragen wurde?

#7823887
Lesenswert?

Einfach das I2C Device (Linux) oder z.B. die HAL-Routinen (STM) zu nehmen, das geht nicht?

Muss ja eine 'lustige' Architektur sein, wo der Hersteller nichts anbietet. Jede meiner benutzten Controller-Plattformen bot eine passende Bibliothek an.

Es gibt auch einige Bit-Banging Treiber mit Source Code. Da könnte man auch mal reinschauen. Google liefert ein Menge Antworten bei der Suche danach.

#7823959
Lesenswert?

Fpga I. schrieb:

Beim Read Zugriff sendet der Master ja das Acknowledge zu den Daten. Wird beim letzten Byte dann auch noch ein Acknowledge gesendet?

Natürlich nicht. Der Master muß dann ein NACK senden, damit der Slave weiß, daß er nun still zu sein hat. Ansonsten kann das STOP mit dem nächsten Datenbit kollidieren.

Bei den üblichen I2C-Chips muß das NACK vor dem letzten Datenbyte gesetzt werden, d.h. der Master taktet immer 9 Bits in einem Rutsch.

OP #7823965
Lesenswert?

Hallo zusammen,

erst einmal vielen Dank für die hilfreichen Antworten (die anderen ignoriere ich einfach).

Dass das Stop Bit nach dem Ack gesendet wurde, sah für mich in den Datenblättern auch so aus, jedoch erschien es mir für den read Zugriff nicht plausibel, da das Ack dann ja vom Master getrieben wird und das Bit nach dem Ack dann wieder vom Slave. Sendet der Slave also eine '0' im MSB, kann ich keine Stop Condition mehr erstellen.

Des Rätsels Lösung: nach dem letzten Byte muss der Master ein NACK senden, um im nächsten Bit Zugriff auf den Bus zu haben. Somit kann der Slave also protokollbedingt nicht erkennen, ob das letzte Byte korrekt empfangen wurde, da es immer mit einem NACK bestätigt wird. Das ging aus den Datenblättern meiner Chips leider nicht hervor, ist aber im Datenblatt von Rainer schön dargestellt (S.7 Figure 9): https://www.ti.com/lit/an/slva704/slva704.pdf

edit: Danke @Peter D., das wäre die Antwort gewesen, die mir direkt geholfen hätte, hab sie nur leider etwas zu spät gesehen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren