Чтение регистра 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);
}
@fijismart, 👍0
Обсуждение1 ответ
Лучший ответ:
ошибки исправлены
#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
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
пожалуйста, отформатируйте свой код как
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