Чтение регистра Arduino I2C

Я пытаюсь прочитать определенный регистр с устройства. В этом случае я пытаюсь прочитать значение, хранящееся в регистре 0X1F, с ведомого устройства 0x08. В области, которую я вижу, пишет для

ADDRESS_SLAVE(Wire.beginTransmission), ADDRESS_TESTCOMP0 (Wire.write)

и

ADDRESS_TESTCOMP0 (Wire.requestFrom(ADDRESS_TESTCOMP0,8))

но я не вижу считывания значений регистров. Вот мой код:

#include <Wire.h>

int ADDRESS_SLAVE = 0X08;
int ADDRESS_TESTCOMP0 = 0X1F;


void setup() 
{
 Wire.setClock(3400000); 
 Wire.begin();
 Serial.begin(9600);
}

void loop() 
{
   Wire.beginTransmission(byte(ADDRESS_SLAVE));  
   Wire.write(byte(ADDRESS_TESTCOMP0));  
   Wire.endTransmission(byte(ADDRESS_TESTCOMP0)); 

   Wire.requestFrom(ADDRESS_TESTCOMP0,8);    
   char read = Wire.read();
   Serial.println(read);

   delay(1000);
}

, 👍0

Обсуждение

пожалуйста, отформатируйте свой код как code ..... выберите текст кода и нажмите {} ..... или просто сделайте отступ в каждой строке еще на 4 пробела, @jsotola

возможно, ардуино «говорит» слишком быстро, @jsotola

Удалите Wire.setClock. Arduino Mega 2560 не может работать на частоте 3,4 МГц. Только 100 кГц, а возможно и 400 кГц при коротких проводах. Wire.endTransmission не принимает данные в качестве параметра, а только параметр для условия остановки. Wire.requestFrom принимает в качестве параметра адрес подчиненного устройства, а не адрес регистра. Второй параметр Wire.requestFrom — это количество байтов, которое вам нужно, поскольку вам нужен всего 1 байт, сделайте это 1, а не 8. Что это за устройство? Надеюсь, это не устройство, работающее от 3,3 В. Начните здесь: https://www.arduino.cc/en/reference/wire и прочитайте справочные страницы функций., @Jot

Wire.begin устанавливает часы по умолчанию. строка setClock не применяется, @Juraj

Спасибо за все отзывы. Код все еще не выполняет то, что мне нужно, и, возможно, я все делаю неправильно. Вот что я пытаюсь сделать:, @fijismart

Я исправил установку тактового сигнала на 100 КБ, исключил параметр в конечной передаче, исправил запрос параметра и установил его на 1 байт.... Я все еще не читаю регистр, который ищу. Это устройство на 5 вольт. Я полностью прочитал справочный раздел по библиотеке проводов на веб-сайте Arduino, поэтому я сейчас здесь., @fijismart


1 ответ


Лучший ответ:

2

ошибки исправлены

#include <Wire.h>

byte ADDRESS_SLAVE = 0X08; 
byte REGISTER_XY = 0X1F;
byte READ_LENGTH = 8;

void setup() 
{
 Wire.begin();
 Wire.setClock(400000); // устанавливаем I2C на полную скорость
 Serial.begin(9600);
}

void loop() 
{
   Wire.beginTransmission(ADDRESS_SLAVE);  
   Wire.write(REGISTER_XY);  // устанавливаем регистр для чтения
   Wire.endTransmission(false); // false, чтобы не освобождать строку

   Wire.requestFrom(ADDRESS_SLAVE,READ_LENGTH); // запрос байтов из регистра XY
   byte buff[READ_LENGTH];    
   Wire.readBytes(buff, READ_LENGTH);
   for (int i = 0; i < READ_LENGTH; i++) {
     Serial.println(buff[i], HEX);
   }
   Serial.println();
   delay(1000);
}

если вы читаете только один регистр устройства, вы можете настроить устройство в setup(), а в loop() только читать данные из регистра:< /п>

#include <Wire.h>

byte ADDRESS_SLAVE = 0X08; 
byte REGISTER_XY = 0X1F;
byte READ_LENGTH = 8;

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

  Wire.begin();
  Wire.setClock(400000); // устанавливаем I2C на полную скорость

  Wire.beginTransmission(ADDRESS_SLAVE);  
  Wire.write(REGISTER_XY);  // устанавливаем регистр для чтения
  Wire.endTransmission();
}

void loop() {
   Wire.requestFrom(ADDRESS_SLAVE,READ_LENGTH); 
   byte buff[READ_LENGTH];    
   Wire.readBytes(buff, READ_LENGTH);
   for (int i = 0; i < READ_LENGTH; i++) {
     Serial.println(buff[i], HEX);
   }
   Serial.println();
   delay(1000);
}
,

мы не знаем, является ли адрес регистра 8-битным или 16-битным. Возможно, ведомым является микроконтроллер и ему нужна задержка. Wire.read не принимает параметров, он считывает один байт. Вы думали о Wire.readBytes? Мы не знаем длины проводов, не знаем, что это за ведомое устройство и как оно себя ведет., @Jot

@Юрай Ух ты... большое спасибо, Юрай! Это работает! Кажется, я был довольно далек от цели в том, что пытался сделать. Знаете ли вы о доступной ссылке, которую я могу использовать для решения подобных задач, например, учебнике/книге?, @fijismart