Попытка чтения с AD5934 с помощью Arduino по I2C
Я пытаюсь прочитать блок байтов из преобразователя импеданса AD5934 (PDF) с помощью I2C.
Это мой код на данный момент
Преамбула:
#define AD5934_Address 0xD
#define AD5934_Start_Frequency 0x82
#define AD5934_Block_Read 0b10100001
#define AD5934_Address_Pointer 0b10110000
Цикл:
void loop() {
readAD5934(AD5934_Start_Frequency, test, 3);
}
Функция чтения:
byte readAD5934 (int address, long int data, int len) {
byte err = 0, counter;
if (len > 32)
return 0xFF;
else if (len > 1) {
// Часть ПЕРВАЯ
Wire.beginTransmission(AD5934_Address);
Wire.write((byte) AD5934_Address_Pointer);
Wire.write((byte) address);
err = Wire.endTransmission();
// Часть ВТОРАЯ
Wire.beginTransmission(AD5934_Address);
Wire.write((byte) AD5934_Block_Read);
Wire.write(len);
// Часть ТРЕТЬЯ
Wire.requestFrom(AD5934_Address, len);
StartHigh = Wire.read();
StartMed = Wire.read();
StartLow = Wire.read();
err = Wire.endTransmission();
}
return err;
}
По какой-то причине Arduino пытается прочитать три байта перед выполнением ВТОРОЙ части.
Я знаю, что завершаю передачу I2C после requestFrom. В техническом описании AD5934 на странице 26 описывается, как считать блок байтов. Перед концом там не указано УСЛОВИЕ ОСТАНОВКИ.
Осциллограф показывает
START 0001101 WRITE ACK 10110000 ACK 10000010 ACK STOP START 0001101 READ ACK 00000001 ACK 11000111 ACK 11111111 NACK STOP START 0001101 WRITE ACK 10100001 ACK 00000011 ACK STOP
Коротко: S 0x0D WA 0xB0 A 0x82 AP S 0x0D RA 0x01 0xC7 0xFF NA P S 0x0D WA 0xA1 A 0x03 A P
Выделенная часть (requestFrom и три Wire.read()) должна быть в конце.
Я потратил много времени, пытаясь разобраться в этом, любая помощь будет очень признательна.
P.S. Работаю над Sparkfun Pro Micro 5V
@leviathan, 👍0
1 ответ
Я думаю, вам следует пересмотреть техническое описание AD5934x.
Чтобы прочитать данные из AD5934, у нас есть три способа:
- прочитать один байт
- блок чтения
- использование команды указателя
Если вы хотите прочитать многобайтовые данные, вы можете обратиться к моему способу:
unsigned long GetRegisterValue(unsigned char regAddr, unsigned char len)
{
unsigned long regValue = 0;
unsigned char index;
unsigned char wrData[2] = {0,0};
unsigned char rdData[2] = {0,0};
for (index = 0; index < len; index++)
{
wrData[0] = 0xB0; //назначить указатель cmd
wrData[1] = regAddr + index;
I2C_Write(AD5934_ADDR, wrData, 2);
rdData[0] = 0xff;
I2C_Read(AD5934_ADDR, rdData, 1);
regValue <<= 8;
regValue += rdData[0];
}
return regValue;
}
- I2C - программная отправка данных
- Подключение нескольких MPU 6050 к Micro/Lenardo
- Не удается вызвать функцию при обратном вызове для onRequest()
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?