Чтение данных I2C из регистра SW6106

Я использую микросхему внешнего аккумулятора SW6106 в качестве I2C, но, как бы я ни старался, я не смог прочитать ничего, кроме «FF».

Техническое описание микросхемы.

Временная диаграмма чтения данных: Чтение временной диаграммы

Временная диаграмма записи данных: Записать временную диаграмму

Код, который я использую:

#include <Wire.h>

byte ADDRESS_SLAVE = 0x3C; 
byte REGISTER_XY = 0xB0;
byte READ_LENGTH = 1;

void setup() {
  Serial.begin(115200);

  Wire.begin();
  Wire.setClock(400000); // установить I2C на «полную скорость»

  Wire.beginTransmission(ADDRESS_SLAVE);  
  Wire.write(REGISTER_XY);  // устанавливаем регистр для чтения
  Wire.endTransmission();
}

void loop() {
   Wire.requestFrom(ADDRESS_SLAVE,READ_LENGTH); 
   byte buff[READ_LENGTH];    
   Wire.readBytes(buff, READ_LENGTH);
   for (int i = 0; i < READ_LENGTH; i++) {
     Serial.println(buff[i], HEX);
   }
   Serial.println();
   delay(1000);
}

Выход последовательного монитора: Последовательный монитор

Я действительно ничего не понял из этой временной диаграммы и не смог ничего прочитать из IC. Буду признателен за любую помощь.

Редактировать: Я немного отредактировал код, чтобы увидеть, что возвращает Wire.endTransmission();.

#include <Wire.h>

byte ADDRESS_SLAVE = 0x3C; 
byte REGISTER_XY = 0xB0;
byte READ_LENGTH = 1;

void setup() {
  Serial.begin(115200);

  Wire.begin();
  Wire.setClock(400000); // установить I2C на «полную скорость»
}

void loop() {
  Wire.beginTransmission(ADDRESS_SLAVE);  
  Wire.write(REGISTER_XY);  // устанавливаем регистр для чтения
  int x = Wire.endTransmission();
  Serial.println(x, DEC);
  delay(200);
}

И он повторяет следующее: endTransmission

Я действительно не знаю, где я ошибаюсь.

, 👍0

Обсуждение

Вы пробовали сканер I2C, чтобы проверить, что адрес правильный? Иногда в даташитах указывается 7-битный адрес, а иногда 8-битный., @Majenko

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

То, как I2C работает на этом чипе, если смотреть на диаграммы, совершенно нормально. Может быть, если переместить запись (выбор регистра) в цикл, прямо перед чтением?, @Majenko

Подключен ли вывод LED4/I2C к земле?, @Majenko

Вы игнорируете оба возвращаемых значения из Wire.endTransmission() и Wire.requestFrom(). Пожалуйста, выведите их в Serial Monitor для отладки. Wire.endTransmission() возвращает код состояния, а Wire.requestFrom() возвращает количество фактически прочитанных байтов., @chrisl

@chrisl Я отредактировал код, чтобы посмотреть, что возвращает Wire.endTransmission(), и он возвращает 0 или 3. Я отредактировал пост и добавил код со снимком экрана последовательного монитора., @efe

Проверьте часы ic power bank, @Ader Nawfal

@AderNawfal в техническом описании указано 100/400K. Я попробовал оба варианта, и результаты у обоих одинаковые., @efe

На схеме показано, что запись на подчиненный адрес 0x3C со значением 0xB0, затем запрос на чтение 1 байта для адреса 0x3C. Можете попробовать этот код? https://hastebin.com/wuxuxulito.cpp, @Maximilian Gerhardt

@MaximilianGerhardt Я попробовал ваш код, и он возвращает следующее: «I2C write ret: 0» Подчиненное устройство I2C отправило нам 8 байт 0`. Я действительно не знаю, почему ic возвращает 0., @efe

Итак, запись I2C проходит без ошибок (была подтверждена и по адресу, и по данным), а чтение возвращает колоссальные 8 байт (?), но затем только 1 байт с содержимым 0x00? Что должно быть возвращено в качестве данных? Я вижу только 1 байт, но не его значение. Вы также можете попробовать удалить Serial.println(), за исключением того, который печатает байты, и какой-то разделитель между ними., @Maximilian Gerhardt

@MaximilianGerhardt О, я действительно извиняюсь, я просто редактировал код, чтобы увидеть другие байты, если я мог что-то получить. Исходный код возвращает I2C write ret: 0 Подчиненное устройство I2C отправило нам 1 байт 0 . Так что он не возвращает 8 байт. И я не знаю, что он должен возвращать, потому что в спецификации ничего не указано о данных., @efe

Ну, я так понимаю, он *правильно* видит данные. Если у вас есть логический анализатор, вы можете перепроверить трассировку данных. Теперь переведенный технический паспорт (http://ismartware.com/enet_upload/file/20181214/20181214101104_63565.pdf) на самом деле не говорит ничего больше, но он показывает, что "IRQ" также должен быть подключен. Может быть, определенные события вызывают импульс IRQ, и вы должны читать регистр I2C? Но тогда почему вам разрешено писать в него? Это для светодиодов или входа? Технический паспорт дает 0 информации об этом, и без этого я не знаю, что вы дальше хотите делать с этим чипом.., @Maximilian Gerhardt

@MaximilianGerhardt Я нашел этот чип на дешевой плате powerbank с поддержкой qc3.0, и когда я проверил спецификацию, я увидел, что она поддерживает i2c. Поэтому я подумал, что, возможно, я смогу получить некоторые подробные данные о выходном токе и напряжении, а также, возможно, индикатор батареи. Но спецификация действительно плохо документирована. Надеюсь, я смогу извлечь из нее что-то полезное, @efe

Следующим лучшим решением будет узнать контактный адрес электронной почты производителя чипа и запросить подробную информацию., @Maximilian Gerhardt


1 ответ


1

Я знаю, что этот пост очень старый, но мне удалось получить карту регистров от производителя Ismartware. Вот ссылка на пакет данных для тех, кто может оказаться здесь в поисках того же самого.

,