Попытка чтения с 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

, 👍0


1 ответ


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;
}
,