Чтение данных 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);
}
И он повторяет следующее:
Я действительно не знаю, где я ошибаюсь.
@efe, 👍0
Обсуждение1 ответ
Я знаю, что этот пост очень старый, но мне удалось получить карту регистров от производителя Ismartware. Вот ссылка на пакет данных для тех, кто может оказаться здесь в поисках того же самого.
- Проблемы с запуском проекта Arduino от 9-вольтовой батареи
- Могу ли я иметь резервное питание для устройства Arduino?
- Как перевести Arduino Nano в спящий режим с низким энергопотреблением (<0,05 мА)
- Энергопотребление esp32
- Последовательная связь между несколькими устройствами (или ардуино)
- nrf24l01+ не работает от аккумулятора, или очень ненадежно
- Проблемы с I2C и Wire.Available()
- Какой лучший способ питания ESP32 от аккумулятора?
Вы пробовали сканер 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