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:
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!
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.
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).
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