Не удается прочитать 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 можно найти здесь.

Я пытаюсь уже несколько дней и понятия не имею, в чем проблема. Заранее большое спасибо за вашу поддержку.

С наилучшими пожеланиями,

Мартин

, 👍0

Обсуждение

Строка с Wire.endTransmission() находится перед Wire.requestFrom(), @chrisl

@chrisl Ответы идут в поле для ответов. Комментарии предназначены для прояснения вопроса., @Nick Gammon


3 ответа


1

Вы делаете что-то в неправильном порядке.

 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();
,

1

Чтобы прочитать 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 вернет вам все флаги для прерываний и автоматически сбросит их после чтения регистра, что я считаю новым и лучшим.

,

0

Я использую ESP32 уже около 10 лет, и это может быть привередливо

I2C — это интерфейс с открытым коллектором, для работы которого требуются подтягивающие резисторы.

Если вы используете модуль платы, он, вероятно, имеет подтягивающие напряжения, если не убедитесь, что они у вас есть (около 1,5 кОм) от SDA и SCL до 3,3 В пост. тока.

Я предлагаю начать с i2cdetect.ino Arduino и выполнить отладку, если он виден.
Если нет, у вас проблема с проводкой.

хотя оба других ответа довольно хороши, вы не показываете схемы и не упоминаете, используете ли вы плату RTC.

,