¿Qué sucede si mi sensor I2C tiene un nivel alto de SDA cuando puede ser bajo, como SCL, cuando está en pausa entre los bytes?

1

Estoy usando un sensor de temperatura / humedad HDC1080 (original de Texas Ins.) que se comunica a través de I2C con un Arduino. Cada medida tiene una longitud de 16 bits y para guardar sus datos, primero debe leer los 8 MSB y luego los 8 LSB de cada registro (hay uno para temperatura y otro para zumbido).

El primer problema fue que al azar, me mostró el byte menos significativo como una palabra de 16 bits en lugar de una palabra de 8 bits, como esta

Mirandoelalcance,sepodríaobservarqueelerrorocurrecuandoelSDAesaltoenelmomentoenqueSCLestábajoenellapsoentrelosbytes,comomuestralaimagen:

Estásucediendodeformaaleatoriay,aveces,enambosregistros,avecessoloenuno,perolointeresanteesquesoloocurrealprincipiodelsegundobytequeseobtuvodelmismoregistro.

¿Hayalgúnproblemaconmisensor?¿Cómopuedotratarderesolverestasituación?

EDITAR:EsteesmicódigoArduino:

#include<Wire.h>#defineHDC0x40//Sensoraddressint16_thumrawvalue;//Rawdatavalue,MSbyte=valmsb,LSbyte=vallsbint16_ttemrawvalue;//Rawdatavalue,MSbyte=valmsb,LSbyte=vallsbint8_thumvalmsb,humvallsb;//Raw8-bitbyteofhumidityint8_ttemvalmsb,temvallsb;//Raw8-bitbyteoftemperatureintincomingByte=0;//Actioninputvoidsetup(){Serial.begin(9600);Serial.println("Hello");
  Wire.begin();
}

void loop() {  
  if (Serial.available() > 0) {
    // read the action input:
    incomingByte = Serial.read();

    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
  }

  if (incomingByte == 49){    //ASCII code for number 1
    Wire.beginTransmission(HDC);
    Wire.write(0x00); //0x00 is the temperature register, 0x01 is the humidity one
    Wire.endTransmission(true);
    delay(200);

    Wire.requestFrom(HDC,4,true); //It asks for 4 bytes, 2 bytes per register
    if(Wire.available()){
      Serial.println("     ");
      Serial.println("Measuring: ");
      temvalmsb = Wire.read();
      temvallsb = Wire.read();
      humvalmsb = Wire.read();
      humvallsb = Wire.read();

      Serial.println("====TEMPERATURE====");
      Serial.print("MSB: "); Serial.println(temvalmsb, BIN);
      Serial.print("LSB: "); Serial.println(temvallsb, BIN);
      temrawvalue = temvalmsb <<8| temvallsb; //Locates each byte in its proper place
      Serial.print("Temp: "); Serial.println(temrawvalue, BIN);

      Serial.println("====HUMIDITY====");
      Serial.print("MSB: "); Serial.println(humvalmsb, BIN);
      Serial.print("LSB: "); Serial.println(humvallsb, BIN);
      humrawvalue = humvalmsb <<8| humvallsb;
      Serial.print("Hum: "); Serial.println(humrawvalue, BIN);

      Serial.println("     ");
      delay(3000);
    }
  }
}
    
pregunta Julio

0 respuestas

Lea otras preguntas en las etiquetas