Sin I2C ACK del sensor de humedad Honeywell HIH-6120

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 al transmitir la dirección. Mirando esto en mi alcance analógico, parece que el sensor intenta dejar que SDA aumente a 1, pero llega tarde y es demasiado débil: de este modo(alrededor de 10us por div, 2v por div, sincronización al caer SDA) A retrasado por B da de este modo(1us por div) Las resistencias pullup son 2k. La dirección del sensor es 0x27 según HP. La frecuencia de reloj mínima es de 100 KHz, que es lo que está dando Arduino.

¿Qué diablos está mal?

Nada se ve mal a primera vista. La dirección se está transmitiendo correctamente, el bit 8 está bajo (escritura) y el bit 9 está bajo en el flanco ascendente (ACK). Creo que el ascenso / descenso rechoncho es solo el tiempo entre que el esclavo libera SDA y el maestro lo tira hacia abajo.

Respuestas (2)

Parece que está ACK bien para mí, pero tal vez o el código lo está interpretando mal.

Veo el 0x27 (datos bloqueados en el borde ascendente del reloj), y luego el bit de lectura/escritura es 0, lo que significa que está escribiendo, luego el esclavo conduce SDA bajo para indicar un ACK. Puede ver justo cuando sucede que hay un pequeño paso hacia abajo exactamente a 0 voltios.

Luego, en el flanco descendente del reloj, el esclavo libera la línea SDA (como debería) para que la SDA suba, luego el maestro toma el control del bus y reduce la línea SDA. Es por eso que ves esa señal estrecha.

Entonces se ve bien. ¿De alguna manera el HW lo está interpretando mal o su comprensión de la API podría ser incorrecta?

Gracias. Cuando publiqué, tenía en mente que el esclavo tenía que conducir SDA a 1 para ACK pero, por supuesto, tiene que bajarlo, así que lo malinterpreté. Pero Arduino aún devolvió 2 indicando que estaba leyendo un NACK. Véase también mi comentario sobre Lawrence arriba.

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

Sin embargo, todo lo que hace 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 , luego debe enviar la dirección en modo LEER y luego leer dos bytes si solo desea humedad, o cuatro bytes si desea humedad más temperatura. Entonces envías una parada.

ingrese la descripción de la imagen aquí

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 estropea (es decir, si todavía ve NAK donde no hay ninguno), tal vez haya algo sospechoso con la biblioteca.

Primero tenía que enviar la dirección en modo de escritura para activar una conversión. Entonces espera. Entonces lee.
Duh - gracias. Perdí eso. ¿Quizás a la biblioteca Arduino no le gustan las transacciones sin datos de inicio y parada?
Gracias. Simplifiqué mi código hasta el NACK inicial. De hecho, tenía el código que sugieres, pero Wire. available() siempre devolvía 0. Este es uno de esos molestos problemas que desaparecen de la noche a la mañana. Esta mañana funciona bien y te juro que no he hecho nada más que enchufar un cable USB para encenderlo. Una pequeña posibilidad es que el sensor venga con una cubierta sobre el orificio de detección, y la dejé en su lugar. Anoche me lo quité, pero no hizo ninguna diferencia de inmediato. ¿Podría ser que el sensor necesite tiempo para sentarse en el ambiente antes de entrar en modo de trabajo completo por primera vez?
Ah, no. Conexión Dicky en mi protoboard en la línea SDA. Perdón por hacerte perder tiempo.