Подключение Arduino по проводу I2C к микросхеме светодиодного контроллера MAX16826

i2c

Я пытаюсь считывать и записывать данные на эту плату оценки светодиодного контроллера MAX16826 через I2C. Для этой микросхемы нет конкретной библиотеки, поэтому мне приходится использовать библиотеку проводов и таблицу данных, чтобы попытаться связаться с ней. Мое использование этой библиотеки ограничено, и мой тестовый код, похоже, не работает. Пока я жду технической поддержки MAXIM, я подумал, что спрошу здесь.

Согласно спецификации IC, 7-разрядный адрес равен 0x58, а 8-разрядные адреса чтения и записи равны 0xB1 и 0xB0 соответственно. Я смог определить 7-битный адрес, используя примерный скетч i2c_scanner, но через некоторое время он, похоже, теряет связь с ним. Ниже прилагается фотография того, что я имел в виду.

Serial Monitor i2c scanner

Мой код пытается считывать и записывать данные в регистр 0x00 MAX16826, следуя по Проводному API и спецификации. Однако результаты, которые я получил из реестра из Wire.requestFrom(), были 255, когда оно должно быть 0. Не уверен, что именно происходит. Я прочитал Wire API, но все еще не уверен, как определить биты ack от подчиненной микросхемы.

Вот соответствующая ключевая информация из таблицы:

Read Write Format Register Table

Вот мой тестовый код Arduino. Я удалил детали, которые были лишними и ненужными для простоты:

#include <Arduino.h>
#include <Wire.h>

#define MaxAddr 0x58        //7-разрядный адрес
#define MaxAddrRead 0xB1    //8-разрядный адрес чтения
#define MaxAddrWrite 0xB0   //8-разрядный адрес записи
#define enPin 12            // Вывод Arduino для включения IC

//объявления функций
void basicWriteTest();
void basicReadTest();

void setup() {
  Serial.begin(115200);
  Wire.begin();
  //включить контактный режим микросхемы
  pinMode(enPin, OUTPUT);
  digitalWrite(enPin, HIGH);
  //дождитесь открытия последовательного монитора
  while (!Serial);
  delay(1500);
  //функция для записи в регистр 0x00
  basicWriteTest();
}

void loop() {
  //функция для записи значения в регистр 0x00
  basicReadTest();
  delay(1500);
}

void basicWriteTest(){
  Wire.beginTransmission(MaxAddrWrite);
  //запись в регистр 0x00
  Wire.write(0x00);
  //запишите значение 0x00 в этот регистр
  Wire.write(0x00);
  Wire.endTransmission();
}

void basicReadTest(){
  Wire.beginTransmission(MaxAddrRead);
  Wire.write(0x00);
  Wire.endTransmission();

  Wire.requestFrom(MaxAddrRead, 1);
  if (Wire.available() <= 1){
    uint8_t data = Wire.read();
    Serial.println("Data = " + String(data));
    
    float mV = float(316) - 1.72 * (data & 0x7F);
    float mA = mV/2.2;

    Serial.println("mV = " + String(mV));
    Serial.println("mA = " + String(mA));
  }else{
    Serial.println("Failed to get read on MAX!");
  }
}

, 👍1

Обсуждение

Вы должны использовать 7-битный адрес для beginTransmission / requestFrom, @Mat

@Mat как бы мне тогда написать последний бит для чтения или записи?, @Agriculex

Библиотека делает это. Проверьте документы (описания параметров) для этих двух функций., @Mat

Проверьте свои подтягивающие резисторы., @Gil

@Gil У меня есть подтягивающий резистор 10K как на линии SDA, так и на линии SCL, поэтому я очень сомневаюсь, что проблема в этом., @Agriculex

Это немного легко, попробуйте использовать подтягивающие резисторы 4,7 кОм, один для SCA и один для SCL. Я думаю, ваша проблема исчезнет. Без схемы или знания длины проводов я не могу быть уверен. Если вы работаете на 3V3, выберите что-то в диапазоне 3K., @Gil