No I2C ACK del sensor de humedad Honeywell HIH-6120

3

Hay una biblioteca Arduino para el HIH-6130 que tiene exactamente el mismo protocolo I2C que el sensor que estoy usando, que es el HIH-6120. Estoy usando las mismas dos líneas de código para decirle al sensor que tome una lectura:

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

ret es 2, lo que significa que el maestro recibió NACK en la transmisión de la dirección. Viendo esto en mi alcance analógico, parece que el sensor intenta que SDA se incremente a 1, pero es tarde y demasiado débil: <(aproximadamente10uspordiv,2vpordiv,sincronizaciónenlacaídadeSDA)AretrasadoporBda < (1us por div) Las resistencias pullup son 2k. La dirección del sensor es 0x27 según HP. La frecuencia mínima de reloj es de 100 KHz, que es lo que está dando Arduino.

¿Qué diablos está mal?

    
pregunta Peter Facey

2 respuestas

2

Parece que ACK está bien para mí, pero ¿quizás o el código lo interpreta mal?

Veo el 0x27 (datos bloqueados en el flanco ascendente del reloj), y luego el bit de lectura / escritura es 0, lo que significa que está haciendo una escritura, luego el esclavo baja el nivel de SDA para indicar un ACK. Puedes verlo justo cuando sucede, hay un pequeño paso hacia abajo a exactamente 0 voltios.

Luego, en el flanco descendente del reloj, el esclavo está liberando la línea SDA (como debería), de modo que el SDA se eleva, luego el maestro está tomando el control del bus y está bajando la línea SDA. Es por eso que ves esa pequeña señal.

Así se ve bien. De alguna manera, ¿el HW lo interpreta mal o su comprensión de la API podría estar equivocada?

    
respondido por el Vince Patron
2

Vea mi comentario anterior: la transacción se ve bien.

Sin embargo, todo lo que está haciendo su código es enviar la dirección y luego enviar inmediatamente un STOP. En realidad no estás leyendo nada. Esta primera lectura es solo un comando de activación ficticio (gracias Janka).

De acuerdo con la hoja de datos , entonces debe enviar la dirección en el modo LECTURA y luego leer dos bytes si desea solo humedad, o cuatro bytes si desea humedad más temperatura. Entonces envías una parada.

Creo que el código debe parecerse más a esto:

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();

Si este código se desordena (es decir, si aún ve NAK donde no hay ninguno), quizás haya algo sospechoso en la biblioteca.

    
respondido por el Adam Lawrence

Lea otras preguntas en las etiquetas