Подключение Arduino по проводу I2C к микросхеме светодиодного контроллера MAX16826
Я пытаюсь считывать и записывать данные на эту плату оценки светодиодного контроллера MAX16826 через I2C. Для этой микросхемы нет конкретной библиотеки, поэтому мне приходится использовать библиотеку проводов и таблицу данных, чтобы попытаться связаться с ней. Мое использование этой библиотеки ограничено, и мой тестовый код, похоже, не работает. Пока я жду технической поддержки MAXIM, я подумал, что спрошу здесь.
Согласно спецификации IC, 7-разрядный адрес равен 0x58, а 8-разрядные адреса чтения и записи равны 0xB1 и 0xB0 соответственно. Я смог определить 7-битный адрес, используя примерный скетч i2c_scanner, но через некоторое время он, похоже, теряет связь с ним. Ниже прилагается фотография того, что я имел в виду.
Мой код пытается считывать и записывать данные в регистр 0x00 MAX16826, следуя по Проводному API и спецификации. Однако результаты, которые я получил из реестра из Wire.requestFrom(), были 255, когда оно должно быть 0. Не уверен, что именно происходит. Я прочитал Wire API, но все еще не уверен, как определить биты ack от подчиненной микросхемы.
Вот соответствующая ключевая информация из таблицы:
Вот мой тестовый код 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!");
}
}
@Agriculex, 👍1
Обсуждение0
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
Вы должны использовать 7-битный адрес для beginTransmission / requestFrom, @Mat
@Mat как бы мне тогда написать последний бит для чтения или записи?, @Agriculex
Библиотека делает это. Проверьте документы (описания параметров) для этих двух функций., @Mat
Проверьте свои подтягивающие резисторы., @Gil
@Gil У меня есть подтягивающий резистор 10K как на линии SDA, так и на линии SCL, поэтому я очень сомневаюсь, что проблема в этом., @Agriculex
Это немного легко, попробуйте использовать подтягивающие резисторы 4,7 кОм, один для SCA и один для SCL. Я думаю, ваша проблема исчезнет. Без схемы или знания длины проводов я не могу быть уверен. Если вы работаете на 3V3, выберите что-то в диапазоне 3K., @Gil