Невозможно подключить AD7705 (SPI) к Arduino

Код, как показано ниже. Я не могу получить 16-битные данные. Может ли кто-нибудь помочь мне определить мою ошибку?

byte spiTransfer(volatile byte data) {
  SPDR = data;
  while (!(SPSR & _BV(SPIF)));
  return SPDR;
}
#define DOUT      (50) 
#define DIN       (51)
#define SCLK      (52)
#define CS_AD7705 (53)
#define DRDY (4)

void setup() {
  Serial.begin(9600);
  pinMode(DOUT, OUTPUT);
  pinM ode(DIN, INPUT);
  pinMode(SCLK,OUTPUT);
  pinMode(CS_AD7705,OUTPUT);
  pinMode(DRDY,INPUT);
  SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPOL) | _BV(CPHA) | _BV(SPI2X) | _BV(SPR1) | _BV(SPR0);
  delay(10);
  digitalWrite(CS_AD7705, LOW);
  spiTransfer(00010000); //настройка регистра
  spiTransfer(01100110);
  spiTransfer(00100000); //тактовый регистр
  spiTransfer(00001000);
  digitalWrite(CS_AD7705, HIGH);
}

void loop() {
  unsigned int data=0;
  digitalWrite(CS_AD7705,LOW); // включить устройство
  while(!digitalRead(DRDY));
  data = spiTransfer(00111000);  // выбираем ch1 и настраиваем чтение 16-битного регистра данных
  data = spiTransfer(0)<<8;
  // Получить старшие 8 бит
  Serial.println("data : "+data);
  data |= spiTransfer(0); // Получить 8 младших бит
  digitalWrite(CS_AD7705, HIGH); // освободить устройство
  delay(1000);
  Serial.println(data, HEX);
}

, 👍2


2 ответа


1

Я думаю, что главная проблема в значениях, которые вы передаете в spiTransfer(). По тому, как они написаны, я думаю, вы думаете, что передаете двоичные значения, но это не так, вы передаете десятичные значения. Так что

data = spiTransfer(00111000);  // выбираем ch1 и настраиваем чтение 16-битных данных

должно быть

data = spiTransfer(B00111000);  // выбираем ch1 и настраиваем чтение 16-битных данных

К номеру необходимо добавить префикс B

Также передача изменчивого параметра в эту функцию кажется мне неправильной, особенно если вы передаете только константы.

,

0

Я тоже пытался заставить что-то из этого работать. Я думаю, прежде чем вы сможете прочитать регистр данных, вы должны сообщить регистру COMM о своем намерении сделать это.

// Выберите канал для чтения:
// запись в com reg выбор канала и
// настройка следующей операции на чтение из регистра данных
SPI.transfer( DRDY_DONT_CARE | REG_DATA | STDBY_OFF | COMMS_READ | CHAN_AIN1 );
// Выполняем два 8-битных чтения, сначала MSByte
highByte = SPI.transfer(0xff);
lowByte  = SPI.transfer(0xff);

adcValue0 = highByte << 8;
adcValue0 = adcValue0 | lowByte;

Тем не менее, у меня были нестабильные и прерывистые успехи в чтении АЦП. Циклический код, похоже, теряет синхронизацию с АЦП; я предполагал, что чтение ASAP после того, как DRDY становится True, важно.

Вы проверили, что ваш интерфейс SPI работает? Вы можете прочитать 24-битные калибровочные данные, которые должны соответствовать задокументированным значениям. Это подтверждает, что SPI правильно считывает и записывает, если только интерфейс SPI не ведет себя по-разному для разных функций. Вы используете подлинный кремний Analog Devices или одну из широко распространенных подделок (TM7705, как у меня)?

,