двухпроводной AD C, чтение SPI - PullRequest
0 голосов
/ 02 апреля 2020

Я использую Arduino UNO (Atmega328) и 12-битный компонент AD C (AD7893ANZ-10), таблица данных доступна на https://www.analog.com/media/en/technical-documentation/data-sheets/AD7893.pdf

Проблема: я пробовал уже несколько разных коды, но значение чтения всегда неверно, даже если вывод SDATA AD C не подключен к выводу MISO Arduino, я получаю одинаковые значения ( См. рисунок 1 здесь ). Я имитировал его в протей ( см. Рисунок 2 здесь ) и использовал виртуальный последовательный монитор в протей. Вывод MOSI и SS Arduino не соединены, но я установил вывод SS в коде на НИЗКИЙ и ВЫСОКИЙ, чтобы удовлетворить требования к библиотекам. Более подробная информация о времени AD C добавлена ​​в виде комментариев в код ниже. Или доступны в таблице. Я был бы благодарен, если вы посмотрите на это, потому что я не могу понять, что я сделал неправильно.

PS: AD C имеет только контакты для связи с SPI: 1.SDATA (slaveout) и 2.SCLK. Вывод CONVST на AD C предназначен для запуска преобразования.

#include <SPI.h>
   //source of code https://www.gammon.com.au/spi
void setup() {

  Serial.begin (115200);
  pinMode(7, OUTPUT);   // this pin is connected to convst on adc to initiate conversion


  // Put SCK, MOSI, SS pins into output mode (introductions from source)
  // also put SCK, MOSI into LOW state, and SS into HIGH state.
  // Then put SPI hardware into Master mode and turn SPI on
  pinMode(SCK, OUTPUT);
  pinMode(MOSI, OUTPUT);
  pinMode(SS, OUTPUT);
  digitalWrite(SS, HIGH);
  digitalWrite(SCK, LOW); 
  digitalWrite(MOSI, LOW);
  SPCR = (1<<MSTR);
  SPI.begin ();
  SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE1)); // set the clk frequency; take the MSB first;
                                                                    //mode1 for CPOL=0 and CPHA=1 according to datasheet p.9 "CPOL bit set to a logic zero and its CPHA bit set to a logic one."
}


int transferAndWait (const byte what)  //methode to read data
{ 
  int a = SPI.transfer(what);    //send zero(MOSI not connected)and  read the first 8 bits and save
  Serial.println (a);            // show the value, in serial monitor -1
  a =(a << 8);                   //shift the saved first 8 bits to left
  Serial.println (a);            // show the value, in serial monitor 255
  a = a | SPI.transfer(what);     //read and save the last  8 bits
  Serial.println (a);             // show the value, in serial monitor -256
  delayMicroseconds (10);
  return a;
}


void loop() {
  int k;
  digitalWrite(7, HIGH);      //set pin high to initiate the conversion
  delayMicroseconds(9);       //the conversion time needed, actually 6 mikroseconds

  digitalWrite(SS, LOW);    // enable Slave Select  to get the library working
  k = transferAndWait (0);  //call the method
  delayMicroseconds(1);
  digitalWrite(7, LOW);     
  digitalWrite(SS, HIGH);   //disable chip select
  delay(2000);              //delay just to keep the overview on serial monitor
  Serial.println (k);       // show the value, in serial monitor -1
}

1 Ответ

0 голосов
/ 02 апреля 2020

Сначала возвращаемая переменная должна быть целым без знака вместо целого числа со знаком. Также значение CONVST должно быть низким только в течение короткого периода, так как преобразование начинается позже. См. Временная последовательность .

...