Проблемы I2C

  • frequency (Optional, float): Set the frequency the I²C bus should operate on. Defaults to 50kHz. Values are 10kHz, 50kHz, 100kHz, 200kHz, … 800kHz

Речь же об этом?

похоже что так
и вон там мин скорость в 10к виднеется

да, но скорость не при чём, I2C до 800 килогерц нормально работает, на атмеге

Очень странная табличка.
До сих пор считал, что у i2c есть только две стандартные частоты 100 и 400 кГц, причем первая - по умолчанию.
Ну а по факту на AVR максимальная частота (без дополнительных телодвижений) составляет 880 кГц, а максимальная частота, на которой мне удавалось устойчиво использовать экран OLED 1306 - 2 МГц с использованием Due.
Вот как-то так.

В спецификации написано так:
“Data on the I2C-bus can be transferred at rates of up to 100 kbit/s in the Standard-mode, up to 400 kbit/s in the Fast-mode, up to 1 Mbit/s in Fast-mode Plus, or up to 3.4 Mbit/s in the High-speed mode. The bus capacitance limits the number of interfaces connected to the bus”

Иными словами - устройства на шине должны поддерживать скорости вплоть до некоего предела, но не обязательно только на нем работать. Просто ардуина врубает на полную. А так - тактируй хоть на Герц, хоть сотую часть Герца.

Только вот в stm32 при работе через его wire почему-то устанавливается в 400, если задать эту величину, и в 100, если задать любую другую.

Ну, это уже вопрос к реализации, а не к спецификации.

Да, притом, к софтовой реализации.

ТС, решилась проблема али нет?

Так проблема ТС в том, что он хочет использовать I2C не по назначению.
Поэтому единственное исчерпывающее решение проблемы - это перехотеть.

Сейчас спаял без репитера на все полтора метра провода. Буду смотреть сколько продержится. Ресет распаивать не стал, все равно им только если вручную управлять. Интеграция ESPHome его не будет использовать.

Ну вот, больше суток, ни одного сбоя. Отличный результат.

это да …когда понимаешь, что нельзя объединять выход со входом как правило проблем нет
PS для чистоты эксперимента кинь 5 метровый кусок кабеля…да не забываем сворачивать в кольцо и бухточку нельзя, совсем нельзя, категорически нельзя

1 лайк

Сейчас нет под рукой такого куска кабеля. Кстати, а объединить например вход с землей, а выход с питанием это совсем не правильно? Оба ведь подтянуты к плюсу.

пробуй, есть надежда что будет работать

Приветствую всех.
Пытаюсь подключить три VL53L0X с библиотекой Adafruit_VL53L0X на ESP8266 с инициализацией по новым адресам.
Ни в примере vl53l0x_dual, ни vl53l0x_multi_extended begin() третьего датчика не проходит. Два работают без проблем. Может кто-то сталкивался с этой проблемой?

Покажите код как инициализируете

Извините - бываю редко. Очень загружен на работе.
Вот функция инициализации ( reg.write(); … т.к. использую 74HC595 с библиотекой GyverHC595.h)

void setID() {
  // all reset
//  digitalWrite(SHT_LOX1, LOW);    
//  digitalWrite(SHT_LOX2, LOW);
  reg.write(SHT_LOX1, 0);    
  reg.write(SHT_LOX2, 0);
  reg.write(SHT_LOX3, 0);
  reg.update();
  delay(10);
  // all unreset
//  digitalWrite(SHT_LOX1, HIGH);
//  digitalWrite(SHT_LOX2, HIGH);
  reg.write(SHT_LOX1, 1);    
  reg.write(SHT_LOX2, 1);
  reg.write(SHT_LOX3, 1);
  reg.update();
  delay(10);

  // activating LOX1 and reseting LOX2, LOX3
//  digitalWrite(SHT_LOX1, HIGH);
//  digitalWrite(SHT_LOX2, LOW);
  reg.write(SHT_LOX1, 1);    
  reg.write(SHT_LOX2, 0);
  reg.write(SHT_LOX3, 0);
  reg.update();

  // initing LOX1
  if(!lox1.begin(LOX1_ADDRESS)) {
    Serial.println(F("Failed to boot first VL53L0X_1"));
    while(1);
  }
  delay(10);

  // activating LOX2
//  digitalWrite(SHT_LOX2, HIGH);
  reg.write(SHT_LOX1, 1);
  reg.write(SHT_LOX2, 1);
  reg.write(SHT_LOX3, 0);
  reg.update();
  delay(10);

  //initing LOX2
  if(!lox2.begin(LOX2_ADDRESS)) {
    Serial.println(F("Failed to boot second VL53L0X_2"));
    while(1);
  }

 /*   // activating LOX3
//  digitalWrite(SHT_LOX3, HIGH);
  reg.write(SHT_LOX1, 1);
  reg.write(SHT_LOX2, 1);
  reg.write(SHT_LOX3, 1);
  reg.update();
  delay(10);

  //initing LOX3
  if(!lox3.begin(LOX3_ADDRESS)) {
    Serial.println(F("Failed to boot second VL53L0X_3"));
    while(1);
  }*/
}

Третий датчик закомментирован и всё работает.
С тремя датчиками “Soft WDT reset”. Вероятно от while(1);. Следовательно !lox3.begin(LOX3_ADDRESS).
На vl53l0x_multi_extended та же история.

Так проблема с I2C или с WDT?