I2C - Funktion Wire-Library im Detail

Hallo alle!

Ich habe bereits einige Zeit im Netz sowie hier im Forum nach Antworten gesucht, allerdings nicht das gefunden was mich im Detail interessiert. Sorry falls ich postings zu dem Thema übersehen habe.

Folgendes interessiert mich: wie funktioniert die Wire-Library im Detail, d.h. wie genau werden die Bits, die übertragen werden, zusammengesetzt? Z.b. ist mir nicht klar, wie in .beginTransmission(address) das letzte Bit zur Kennzeichnung Lesen bzw. Schreiben gesetzt wird (bzw. wie das genau von .endTransmission() dann zusammengestellt und abgeschickt wird). Außerdem würde ich gerne wissen, welche Befehle wann ACK bzw. NACK und STOP Befehle senden.

Ein Praxisbsp.: Kommunikation mit dem Feuchtigkeits-Temperatursensor HIH 6120 (datasheet). Im Datenblatt zur I2C-Kommunikation (siehe auch angehängtes gif) ist Folgendes angegeben:

1.) Messung anfordern:
START > Senden von Adresse + 0 > ACK > STOP

2.) 4 Bytes Daten anfordern:
START > Senden von Adresse + 1 > ACK > Lesen Byte 1 > ACK > Lesen Byte 2 > ACK > ... > NACK -> STOP

Jetzt ist mir nicht klar, wie ich gezielt ein Bit 0 oder 1 nach dem Senden der Adresse übertrage: muss das gesondert durch ein .write(0 (oder 1)) nach .beginTransmission erfolgen, oder wird das automatisch von .endTransmission eingefügt? Werden die ACK-Signale von .requestFrom(Adresse, 4) dann passend 3 mal eingefügt?

Die Referenz zu Wire habe ich mir durchgelesen, auch eine weiterführende Erklärung, jedoch wurden diese Dinge im Detail nirgends erklärt (oder ich habs nicht gefunden). Danke jedenfalls falls jemand hier Licht reinbringen kann! :slight_smile:

Die Wire-Lib schiebt Deine Adresse um 1 Bit nach links und setzt dann auf das niederwertigste Bit das Schreib-/Lesebit. Das sieht man auch sehr schön im Code der Lib.

Gruß Tommy

Die Referenz zu Wire habe ich mir durchgelesen, auch eine weiterführende Erklärung, jedoch wurden diese Dinge im Detail nirgends erklärt

Noch mal die Referenz lesen!

Hier wird beschrieben wann ein STOP gesendet wird

Z.b. ist mir nicht klar, wie in .beginTransmission(address) das letzte Bit zur Kennzeichnung Lesen bzw. Schreiben gesetzt wird

Das r/w Bit wird automatisch gesetzt!
Schau in den Wire QuellCode, dann siehst du es.

OK hab nochmals in den Code reingeschaut. Also so wie ich das verstanden habe, erweitert Wire.endTransmission() die Adresse um 0 (also write), und Wire.requestFrom() die Adresse um 1 (also Lesen). Im Falle einer Messanforderung wie im obigen Bsp. sollte also eigentlich ein .beginTransmission() gefolgt von einem .endTransmission() ohne .write() dazwischen das Gewünschte leisten. Werde das austesten.

Falls die Funktionalität so ist, könnte man dies aber auch in die Referenz reinschreiben. Die Erklärungen dort sind leider ziemlich dürftig, wenn man mit den Spezifikationen von I2C vergleichen möchte (ja, auch wenn das mit STOP bzw. REPEATED START erklärt wird).

Hier könnte was für Dich dabei sein: Honeywell HumidIconTM Digital Humidity/Temperature Sensors (HIH6130/6131 and HIH6120/6121 Series) ebenso wie in der zugehörigen Programmbibliothek.

Omaru:
Die Erklärungen dort sind leider ziemlich dürftig, ...

Du bist zur Mitarbeit eingeladen!

Danke, die library habe ich auch schon gefunden und durchgeschaut. Habs aber auf die schnelle nicht zum Laufen gebracht, weil hier irgendwelche weiteren Dinge wie <SoftDelay.h> o.ä. eingebunden werden.

So wie ich es gemacht habe funktionierts aber offenbar (bzw. wurde es auch in der genannten library programmiert). Um eine wirklich gute Erklärung zu dem Thema zu schreiben bzw. zu ergänzen, kenne ich mich aber zu wenig aus, da müsst ich noch länger in Wire.cpp und Twi.h reinschauen :wink:

Danke jedenfalls für die Antworten!