Настройка 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.
Не могли бы вы мне помочь? Я не понимаю, почему он там висит.
@JPFrancoia, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы забыли Wire.begin();
. Вы должны добавить его в setup()
.
Wire.begin();
настроит контакты ввода-вывода для использования I2C. Без этого сигналы не поступают и не выходят из MCU, поэтому функции I2C, ожидающие сигнала ACK, никогда его не увидят и не завершатся.
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Соединение I2C зависает Ведущий если ведомый отключается
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
Вы забыли
Wire.begin()
..., @Majenkoах... Действительно.... спасибо, @JPFrancoia
Отправьте ответ, чтобы я мог принять его. Даже если мой вопрос был немного глупым..., @JPFrancoia