0
votes

I use Arduino UNO (Atmega328) and a 12bit ADC component (AD7893ANZ-10), datasheet available on https://www.analog.com/media/en/technical-documentation/data-sheets/AD7893.pdf

The problem: I tried already few different codes but the read value is wrong always, even when the SDATA pin of ADC is not connected to MISO pin of Arduino, I get the same values (See figure1 here). I simulated it in proteus(See figure2 here) and used the virtual serial monitor in proteus. The MOSI and SS pin of Arduino are not connected but I set SS pin in code to LOW and HIGH to fullfill libraries requirements. More information about the timing of ADC is added as comments into the code below. Or availabe in the datasheet. I would be thanksfull if you take a look on it due I cant figure out what I did wrong.

PS: The ADC has just to pins to communicate with SPI: 1.SDATA(slaveout) and 2.SCLK. The pin CONVST on ADC is to initiate a conversion.

#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

1 Answers

0
votes

First the the return variable should be an unsigned int instead of a signed int. Also the CONVST should only be low for a short period as conversion is started afterwards. See Timing sequence.