Kein I2C ACK vom Honeywell HIH-6120 Feuchtigkeitssensor

Es gibt eine Arduino-Bibliothek für den HIH-6130, die genau das gleiche I2C-Protokoll hat wie der Sensor, den ich verwende, nämlich der HIH-6120. Ich verwende die gleichen zwei Codezeilen, um dem Sensor mitzuteilen, dass er eine Messung vornehmen soll:

Wire.beginTransmission(0x27);
ret = Wire.endTransmission();

ret ist 2, was bedeutet, dass der Master beim Senden der Adresse NACK empfangen hat. Wenn ich mir das auf meinem analogen Oszilloskop ansehe, scheint der Sensor zu versuchen, SDA auf 1 steigen zu lassen, aber es ist spät und zu schwach: daher(ungefähr 10us pro div, 2v pro div, sync bei fallendem SDA) A verzögert durch B ergibt daher(1us pro div) Pullup-Widerstände sind 2k. Die Sensoradresse ist laut HP 0x27. Die minimale Taktfrequenz beträgt 100 KHz, was Arduino angibt.

Was in aller Welt ist falsch?

Nichts sieht auf den ersten Blick falsch aus. Die Adresse wird korrekt übertragen, das 8. Bit ist Low (Schreiben) und das 9. Bit ist Low bei steigender Flanke (ACK). Der stämmige Anstieg/Abfall ist genau die Zeit zwischen der SDA-Freigabe durch den Sklaven und dem Herunterziehen durch den Meister.

Antworten (2)

Es sieht so aus, als ob es für mich ACK ist, aber vielleicht interpretiert der Code es falsch?

Ich sehe die 0x27 (Daten, die an der steigenden Taktflanke zwischengespeichert werden), und dann ist das Lese-/Schreibbit 0, was bedeutet, dass Sie einen Schreibvorgang ausführen, dann treibt der Slave SDA auf Low, um eine Bestätigung anzuzeigen. Sie können direkt sehen, wenn es passiert, gibt es einen winzigen Schritt nach unten auf genau 0 Volt.

Dann gibt der Slave an der fallenden Flanke der Uhr die SDA-Leitung frei (wie es sollte), so dass die SDA ansteigt, dann übernimmt der Master den Bus und treibt die SDA-Leitung auf Low. Deshalb sehen Sie diesen schmalen Punkt.

Es sieht also gut aus. Irgendwie interpretiert die HW es falsch oder Ihr Verständnis der API könnte falsch sein?

Danke. Als ich gepostet habe, hatte ich im Kopf, dass der Slave SDA auf 1 zu ACK fahren muss, aber natürlich muss er es herunterziehen, also habe ich es falsch interpretiert. Aber Arduino gab immer noch 2 zurück, was darauf hinweist, dass es ein NACK las. Siehe auch meinen Kommentar zu Lawrence oben.

Siehe meinen Kommentar oben - die Transaktion selbst sieht in Ordnung aus.

Ihr Code sendet jedoch nur die Adresse und sendet dann sofort ein STOP. Du liest eigentlich gar nichts. Dieses erste Lesen ist nur ein Dummy-Weckbefehl (danke Janka).

Laut Datenblatt müssen Sie dann die Adresse im READ-Modus senden und dann entweder zwei Bytes lesen, wenn Sie nur Feuchtigkeit wollen, oder vier Bytes, wenn Sie Feuchtigkeit plus Temperatur wollen. Dann schickst du einen Stop.

Geben Sie hier die Bildbeschreibung ein

Ich denke, der Code sollte eher so aussehen:

Wire.beginTransmission(0x27); // write to wake-up
Wire.endTransmission();       // ignore this
delay(100);

Wire.begin();                 // optional for read
Wire.requestFrom(0x27, 4);    // request 4 bytes from slave device 
while (Wire.available())      // slave may send less than requested
{                            
    char c = Wire.read();     // receive a byte as character
    Serial.print(c);          // print the character
}
ret = Wire.endTransmission();

Wenn dieser Code durcheinander kommt (dh wenn er immer noch NAK sieht, wo keines ist), ist vielleicht etwas mit der Bibliothek faul.

Sie mussten die Adresse zuerst im Schreibmodus senden, um eine Konvertierung auszulösen. Dann warte. Dann lies.
Puh - danke. Verpasste das. Vielleicht mag die Arduino-Bibliothek keine Start-Stopp-No-Data-Transaktionen?
Danke. Ich habe meinen Code auf das anfängliche NACK vereinfacht. Ich hatte tatsächlich Code, wie Sie vorschlagen, aber Wire.available () gab immer 0 zurück. Dies ist eines dieser lästigen Probleme, die über Nacht verschwinden. Heute Morgen funktioniert es einwandfrei und ich schwöre, ich habe nichts getan, außer ein USB-Kabel anzuschließen, um es mit Strom zu versorgen. Eine schwache Möglichkeit ist, dass der Sensor mit einer Abdeckung über dem Sensorloch geliefert wird, und ich hatte diese an Ort und Stelle gelassen. Letzte Nacht habe ich es abgenommen, aber es hat nicht sofort einen Unterschied gemacht. Könnte es sein, dass der Sensor Zeit braucht, um in der Umgebung zu sitzen, bevor er zum ersten Mal in den vollen Arbeitsmodus geht?
Ah nein. Dicky-Verbindung in meinem Steckbrett auf der SDA-Leitung. Tut mir leid, Ihre Zeit zu verschwenden.