Не удается считывать данные из регистров с помощью I2C

Я пытаюсь считывать данные из регистров 6, 7, 8 и 9 STC3100 (Технический паспорт) с помощью arduino uno.

Я следовал этому учебнику: https://howtomechatronics.com/tutorials/arduino/how-i2c-communication-works-and-how-to-use-it-with-arduino/ И соответствующим образом настроил устройство и регистрационный адрес.

Это не работает, и вместо того, чтобы возвращать данные в регистр, я просто получаю 16 снова и снова.

Вот мой код:

#include <Wire.h>
int ADXLAddress = 0x70; 

#define X_Axis_Register_DATAX0 0x08 

#define X_Axis_Register_DATAX1 0x09 

#define Power_Register 0x00 

int X0,X1,X_out;

void setup() {

  Wire.begin(); 

  Serial.begin(9600);
  delay(100);
  Wire.beginTransmission(ADXLAddress);
  Wire.write(Power_Register);
  Wire.write(16);  
  Wire.endTransmission();
}
void loop() {
  delay(2000);
  Wire.beginTransmission(ADXLAddress);  
  
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  
  Wire.endTransmission();

  Wire.requestFrom(ADXLAddress,2); 
  
  if(Wire.available()<=2) {  
    X0 = Wire.read(); 
    X1 = Wire.read();   
  }
  
  Serial.print("X0= ");
  Serial.print(X0, BIN);
  Serial.print("   X1= ");
  Serial.println(X1, BIN);
}

, 👍2

Обсуждение

Пожалуйста, включите свой код в свой вопрос (отредактировав его)., @chrisl

Я не уверен, но, прочитав таблицу данных, я ожидал бы, что должен быть записан только один адрес регистра, чем считывать два байта; адрес регистра, похоже, будет автоматически увеличен. Вы кодируете адрес регистра 8, затем 9, и я бы сказал, что вы начинаете читать с адреса 9, затем автоматически увеличиваете до 10 (9=высокое напряжение батареи, 10 = Низкая температура, 10). Спецификация также может быть истолкована как запись более одного адреса регистра без считывания данных, не указано., @Peter Paul Kiefer


1 ответ


1

Следующий код показывает, как бы я читал из STC3100. Но у меня нет ни одного из них, поэтому я не могу попробовать код. Я был бы очень удивлен, если бы он работал напрямую. Используйте его в качестве примера. Возможно, мы могли бы улучшить его вместе. ;-)

#include <Wire.h>

#define STC_ADDRESS 0x70
#define MODE_REGISTER 0x00 
#define CURRENT_LOW_REGISTER 0x06 
#define VOLTAGE_LOW_REGISTER 0x08 

int voltage, current;
int high_value = 0;

void setup() 
{
  Serial.begin(9600);

  Wire.begin(); 
  delay(100);
  // power on the STC
  Wire.beginTransmission(STC_ADDRESS);
  Wire.write(MODE_REGISTER);
  Wire.write(16);  
  Wire.endTransmission();
}

void loop() 
{
  Wire.beginTransmission(STC_ADDRESS); 
  Wire.write(VOLTAGE_LOW_REGISTER);
  Wire.requestFrom(STC_ADDRESS, 2); 
  delay(500);
  if( Wire.available() > 0 ) 
  {          
    voltage = Wire.read(); 
    //Serial.print("REG 8 = ");
    //Serial.println(voltage);
  }
  delay(500);
  if( Wire.available() > 0 ) 
  {  
    high_value = Wire.read();
    //Serial.print("REG 9 = ");
    //Serial.println(high_value);
    voltage += (high_value << 8);   
    //Serial.print("voltage = ");
    //Serial.println(voltage);

  }
  Wire.endTransmission();

  Wire.beginTransmission(STC_ADDRESS); 
  Wire.write(CURRENT_LOW_REGISTER);
  Wire.requestFrom(STC_ADDRESS, 2); 
  delay(500);
  if( Wire.available() > 0 ) 
  {  
    current = Wire.read(); 
    //Serial.print("REG 6 = ");
    //Serial.println(current);
  }
  delay(500);
  if( Wire.available() > 0 ) 
  {  
    high_value = Wire.read();   
    //Serial.print("REG 7 = ");
    //Serial.println(high_value);
    current += (high_value << 8);   
    //Serial.print("current = ");
    //Serial.println(current);
  }
  Wire.endTransmission();

  Serial.print("V= ");
  Serial.print(voltage);
  Serial.print("   C= ");
  Serial.println(current);
}
,

Я попробовал код, который вы опубликовали, и в настоящее время он ничего не напечатает, если я выполню весь код. Если я запущу его так, чтобы он считывал только регистры 8 и 9, он напечатает значение (которое неверно) один раз, а затем остановится, как будто оно вообще не зацикливается., @John

Я просмотрел код и обнаружил некоторые ошибки. Я изменил код на исправленную версию. Я допустил ошибку с первым макросом "#define", который должен был помешать компиляции кода. Как вы его составили? Вы исправили макрос? Если аппаратной ошибки нет, эта версия должна, по крайней мере, считывать регистры. Я включил некоторые "Serial.println", которые вы можете раскомментировать, чтобы увидеть необработанные значения регистра. Если это снова прекратится, вы сможете увидеть, где., @Peter Paul Kiefer

Похоже, в данный момент все работает хорошо. Большое вам спасибо за вашу помощь :), @John