Не удается прочитать I2C из RTC
Я использую ESP32, который я подключил к MAX31329 RTC через I2C.
К сожалению, я не могу прочитать ни одного регистра из RTC. После того, как изменение библиотеки MAX31328 не сработало, я попытался напрямую считывать отдельные регистры. Вот код:
#include "Wire.h"
int seconds = 0;
int ret = 0;
void setup() {
Serial.begin(115200);
delay(500);
Wire.begin(33,32,100000);
delay(500);
Wire.beginTransmission(0x68);
Wire.write(0x06);
Wire.write(13);
ret = Wire.endTransmission();
if(ret != 0)
Serial.println("i2c Setup failed");
delay(500);
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x06);
Wire.requestFrom(0x68,1);
seconds = Wire.read();
ret = Wire.endTransmission();
if(ret != 0)
Serial.println("Read failed");
Serial.println(seconds);
delay(1000);
}
Регистр всегда возвращает 0.
Вы видите ошибку в моем коде? Технические характеристики MAX31329 можно найти здесь.
Я пытаюсь уже несколько дней и понятия не имею, в чем проблема. Заранее большое спасибо за вашу поддержку.
С наилучшими пожеланиями,
Мартин
@Martin, 👍0
Обсуждение3 ответа
Вы делаете что-то в неправильном порядке.
Wire.beginTransmission(0x68); Wire.write(0x06); Wire.requestFrom(0x68,1); seconds = Wire.read(); ret = Wire.endTransmission();
Запрос отправляется при вызове endTransmission, поэтому вам нужно сделать это, прежде чем пытаться получить ответ. Другими словами:
Wire.beginTransmission(0x68);
Wire.write(0x06);
ret = Wire.endTransmission();
Wire.requestFrom(0x68,1);
seconds = Wire.read();
Чтобы прочитать max31329, вам нужно сделать следующее, как сказал Ник
Wire.beginTransmission(0x68);
Wire.write(0x06);
ret = Wire.endTransmission(false); //Нет остановки, поэтому запрос является перезапуском
Wire.requestFrom(0x68,1);
seconds = Wire.read();
Но это должен быть повторный перезапуск после записи в регистр 0x06, отсюда и false в Wire.endTransmission(false). Мне потребовалась целая вечность, чтобы понять, что DS3231 и MAX31328 не требуют этого, я действительно нашел это в таблице данных для MAX31343, который имеет аналогичный набор регистров с секундами, начинающимися с 0x06, в отличие от предыдущих часов, которые начинаются с 0x00. . Интересно, что в этих случаях чтение регистра состояния 0x00 вернет вам все флаги для прерываний и автоматически сбросит их после чтения регистра, что я считаю новым и лучшим.
Я использую ESP32 уже около 10 лет, и это может быть привередливо
I2C — это интерфейс с открытым коллектором, для работы которого требуются подтягивающие резисторы.
Если вы используете модуль платы, он, вероятно, имеет подтягивающие напряжения, если не убедитесь, что они у вас есть (около 1,5 кОм) от SDA и SCL до 3,3 В пост. тока.
Я предлагаю начать с i2cdetect.ino Arduino и выполнить отладку, если он виден.
Если нет, у вас проблема с проводкой.
хотя оба других ответа довольно хороши, вы не показываете схемы и не упоминаете, используете ли вы плату RTC.
- DS3231 RTC не работает с ESP32
- Как выбрать альтернативные контакты I2C на ESP32?
- Не удалось выделить SSD1306 при добавлении константы
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- Странная проблема. Ардуино перестает работать через несколько часов. Мнения, пожалуйста
- PN532 не обнаруживает RFID-карту при подключении к ESP32 в режиме I2C, но отлично работает с Arduino Uno
- Как закрыть/закончить Wire.begin()?
- Лучший способ отправки команд I2C между Arduino и ESP32
Строка с
Wire.endTransmission()
находится передWire.requestFrom()
, @chrisl@chrisl Ответы идут в поле для ответов. Комментарии предназначены для прояснения вопроса., @Nick Gammon