Настройка I2C с HTU21D, нет ответа после beginTransmission

Я играю с датчиком температуры/влажности HTU21D. Техническое описание: https://www.te.com/commerce/DocumentDelivery/DDEController?Action=showdoc&DocId=Data+Sheet%7FHPC199_6%7FA6%7Fpdf%7FEnglish%7FENG_DS_HPC199_6_A6.pdf%7FCAT-HSC0004

Датчик правильно подключен и дает разумные значения, если я использую библиотеку и пример здесь: https://github.com/sparkfun/SparkFun_HTU21D_Breakout_Arduino_Library/blob/master/examples/SparkFun_HTU21D_Demo/SparkFun_HTU21D_Demo.ino

Но меня больше интересует, как работает I2C, поэтому я пытаюсь написать с нуля небольшой скетч для связи с датчиком. Вот что у меня есть сейчас:

#include <Wire.h>

#define SensorAddress 0x40
#define SoftReset 0xFE
#define TriggerTemperatureNoHold 0xF3
#define TriggerHumidityNoHold 0xF5

void setup(){

    Serial.begin(9600);
    Serial.println("HTU21D library");

    // задержка (50);

    //Wire.beginTransmission(SensorAddress);
    //Wire.write(SoftReset);
    //Wire.endTransmission();

    // задержка (50);
    Serial.println("init finished");

}

void loop(){

    Serial.println("entering");
    Wire.beginTransmission(0x40);
    Wire.write(0xF3);
    Wire.endTransmission();
    Serial.println("hello");

    //Тисуемся, пока производится измерение. в техническом описании указано 50 мс, на практике может потребоваться больше
    bool validResult;
    byte counter;
    for (counter = 0, validResult = 0 ; counter < 10 && !validResult ; counter++){
        delay(100);

        // Возвращает три байта, данные (MSB) / данные (LSB) / контрольная сумма
        validResult = (3 == Wire.requestFrom(0x40, 3));
        Serial.println(validResult);

    }
    Serial.println("here");
}

Я занимаюсь отладкой скетча. Когда скетч загружается, я читаю о последовательном соединении и вижу только следующее:

HTU21D library
init finished
entering

Кажется, программа зависает при первой попытке связи, когда я отправляю команду TriggerTemperatureNoHold.

Не могли бы вы мне помочь? Я не понимаю, почему он там висит.

, 👍0

Обсуждение

Вы забыли Wire.begin()..., @Majenko

ах... Действительно.... спасибо, @JPFrancoia

Отправьте ответ, чтобы я мог принять его. Даже если мой вопрос был немного глупым..., @JPFrancoia


1 ответ


Лучший ответ:

0

Вы забыли Wire.begin();. Вы должны добавить его в setup().

Wire.begin(); настроит контакты ввода-вывода для использования I2C. Без этого сигналы не поступают и не выходят из MCU, поэтому функции I2C, ожидающие сигнала ACK, никогда его не увидят и не завершатся.

,