I²C - Bus Erklärung

Hallo,

Weiß jetzt nicht genau, ob ich hier mit meine Frage richtig bin.

Nehme gerade den I²C - Bus durch, wobei sich mir 2 Fragen aufgetan haben.

Hab da so eine Skizze, die beschreibt, wie die Datenübertragung aussieht.
Während der 9. Takt-High-Phase geht die SDA - Leitung auf LOW. Dies soll das ACK signalisieren. Nachdem dies geschehen ist, geht SCL auf LOW. Da steht dann dabei „byte complete, interrupt within receiver“, kurz bevor SCL wieder auf high geht, steht „clock line held low while interrupts are serviced“. Was bedeutet das denn?
Entschuldigung dafür, dass ich keine Skizze zeigen kann. Falls die Frage unverständlich ist, werde ich versuchen, ein Bild hochzuladen.

Habe mich gefragt, was genau das NACK macht. Ich weiß, dass es gesendet wird, wenn kein Slave auf die Adresse vom Master reagiert.
Doch ich glaube auch, glesen zu haben, dass das NACK auch am Ende einer Datenübertragung verwendet wird. Kann mir das bitte jemand erklären.

Vielen Dank!

Hab da so eine Skizze, die beschreibt, wie die
Datenübertragung aussieht.
Während der 9. Takt-High-Phase geht die SDA - Leitung auf LOW.
Dies soll das ACK signalisieren. Nachdem dies geschehen ist,
geht SCL auf LOW. Da steht dann dabei „byte complete,
interrupt within receiver“, kurz bevor SCL wieder auf high
geht, steht „clock line held low while interrupts are
serviced“. Was bedeutet das denn?
Entschuldigung dafür, dass ich keine Skizze zeigen kann. Falls
die Frage unverständlich ist, werde ich versuchen, ein Bild
hochzuladen.

das bedeutet, dass die letzte lowphase nicht immer gleich lang ist. es kann z.b. sein, dass der empfänger seine daten erst nocht verarbeiten muss, bevor neue daten empfangen werden können. üblicherweise löst der empfänger einen interrupt aus, um die daten aus dem empfangsregister zu lesen. solange wie das dauert, wird der lowpegel auf der clockline gehalten

Habe mich gefragt, was genau das NACK macht. Ich weiß, dass es
gesendet wird, wenn kein Slave auf die Adresse vom Master
reagiert.
Doch ich glaube auch, glesen zu haben, dass das NACK auch am
Ende einer Datenübertragung verwendet wird. Kann mir das bitte
jemand erklären.

naja, das NACK bedeutet einfach nur „not acknowledge“, also dass entweder kein slave auf die gesendete adresse reagiert, oder die daten nicht richtig empfangen hat. zum anderen wird das NACK auch als stop-condition genutzt - also wenn z.b. die sendung abgebrochen wird oder einfach nur zuende ist. damit weiß der slave, dass er nicht mit weiteren daten rechnen muss

aso, hier noch die spezifikation: http://www.nxp.com/acrobat_download/usermanuals/UM10…

allerdings auf englisch

1 „Gefällt mir“

Hallo Fragewurm,

Hab da so eine Skizze, die beschreibt, wie die
Datenübertragung aussieht.
Während der 9. Takt-High-Phase geht die SDA - Leitung auf LOW.
Dies soll das ACK signalisieren. Nachdem dies geschehen ist,
geht SCL auf LOW. Da steht dann dabei „byte complete,
interrupt within receiver“, kurz bevor SCL wieder auf high
geht, steht „clock line held low while interrupts are
serviced“. Was bedeutet das denn?

In ein RAM können Daten praktisch sofort geschrieben werden, ein EEPROM braucht dazu etwas Zeit. Es gibt auch andere Bausteine die Zeit für die interne Verarbeitung benötigen.

Habe mich gefragt, was genau das NACK macht. Ich weiß, dass es
gesendet wird, wenn kein Slave auf die Adresse vom Master
reagiert.

NACK wird eigentlich nicht gesendet :smile:

SDA wird mit einem Widerstand auf „1“ gezogen.
Die Slaves können nur ein ACK („0“ Pegel) senden. Sendet keiner ein ACK, ist dies ein NACK.

Doch ich glaube auch, glesen zu haben, dass das NACK auch am
Ende einer Datenübertragung verwendet wird. Kann mir das bitte
jemand erklären.

Damit wird die Verbindung abgebrochen.
Bei manchen Bausteinen ist Anzahl der Daten nicht festgelegt.
Besonders bei Speichern kann man einmal die Speicheradresse übertragen und dann der reihe nach beliebig viele Bytes auslesen oder schreiben.

MfG Peter(TOO)

Danke erstmal für eure Antworten.
Jetzt habe ich noch eine kurze Frage:

Bestimmt der Receiver oder der Transmitter, ob er weitere Daten haben will? Und wer von den Beiden (Receiver oder Transmitter) bricht bestimmt, wann die Verbindung abgebrochen werden soll?

Danke!

Oh Man,

Diese Frage war jetzt nicht ganz Deutsch. Hier nochmal:

Bestimmt der Transmitter oder der Receiver ob weiter Daten gesendet oder empfangen werden sollen? Und wer von den Beiden (Transmitter oder Receiver) bestimmt, wann die Verbindung zuende ist bzw. abgebrochen werden soll?

Danke nochmals

Hallo,
für konkrete Fälle würde ich doch empfehlen, Datenblätter zu den
verwendeten I²C-Bausteinen zu lesen. Da stehen auch die
Timings und BUS-Bedingungen in graphischer Form drin.
Hier findest du viele davon.
[http://www.nxp.com/#/homepage/cb=t=p,p=/50808/41735…

Gruß Uwi

Bestimmt der Receiver oder der Transmitter, ob er weitere
Daten haben will? Und wer von den Beiden (Receiver oder
Transmitter) bricht bestimmt, wann die Verbindung abgebrochen
werden soll?

Danke!

Ich würde mich gerne durch all diese Datenblätter durchbeißen, doch diesmal bleibt mir einfach nicht die Zeit dafür. Tut mir Leid, wenn ich so viele Fragen stelle.

Bestimmt der Transmitter oder der Receiver ob weiter Daten
gesendet oder empfangen werden sollen?

naja, das ist sache des verwendeten protokolls. es kommt auf die verwendeten teilnehmer an.

grundsätzlich gibt aber der transmitter mit der stop-condition den bus wieder frei, es sei denn, es wird ein repeated-start ausgelöst weil der transmitter noch weitere daten senden will. der slave kann natürlich auch die annahme von daten verweigern und deshalb ein nack senden. was dann passiert, ist sache des protokolls. normalerweise wird die zeit gemessen, die der nack angelegt bleibt. vergeht zuviel zeit, gibt es einen timeout und der bus wird wieder freigegeben.

aber wie gesagt: das ist eine protokollfrage, grundsätzlich kann jeder teilnehmer ein NACK senden und damit die übetragung abbrechen.

Und wer von den Beiden
(Transmitter oder Receiver) bestimmt, wann die Verbindung
zuende ist bzw. abgebrochen werden soll?

das können theoretisch beide. kommt halt drauf an, wie das protokoll ausgelegt ist und was während der sendung sonst noch passieren kann. du kannst dir z.b. mal das datenblatt von einem mikrocontroller ansehen (z.b. c8051f005). dort wird das ganze unter der rubrik sm-bus gut erklärt (sm-bus ist eigentlich das gleiche, i2c-bus stammt ja eigentlich von phillips/nxp). der controller arbeitet mit einem statusregister, welches man als sprungtabelle nutzen kann. dadurch wird die interruptbearbeitung leichter und man hat nur eine anzahl von fällen, auf die man reagieren muss. man muss sie aber nicht selbst erkennen.