Не удается считывать данные из регистров с помощью 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);
}
@John, 👍2
Обсуждение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
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Соединение I2C зависает Ведущий если ведомый отключается
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
Пожалуйста, включите свой код в свой вопрос (отредактировав его)., @chrisl
Я не уверен, но, прочитав таблицу данных, я ожидал бы, что должен быть записан только один адрес регистра, чем считывать два байта; адрес регистра, похоже, будет автоматически увеличен. Вы кодируете адрес регистра 8, затем 9, и я бы сказал, что вы начинаете читать с адреса 9, затем автоматически увеличиваете до 10 (9=высокое напряжение батареи, 10 = Низкая температура, 10). Спецификация также может быть истолкована как запись более одного адреса регистра без считывания данных, не указано., @Peter Paul Kiefer