AD9959 / Arduino Due SPI sommunication problems

Hi,

I have a problem to write and read bytes to the registers of the AD9959. I use the Evaluation Board 'AD 9958 / 59 Evaluationboard Z’ and on the other side the Arduino Due. It seems there is no bits/byte's written on the AD9959 or the reading is not possible!

I have studied the Manual al lot and all example in this Forum an on other places in the internet, but I don’t understand what is going wrong!
The Signals of CLK, CS/SS and SDIO_0, IO_Update are clear and fine, but i get no proper reaction from the AD9959 on the SDIO_2 line. And if I write the corresponding register values to get a sine signal on one output I also get no signal!
The jumpers on the Evaluation Board at set as follows:
W9                              closed
W1, W2, W3, W10                 open
PC_CTRL                        set to manual
RURD_0, RURD_1, RURD_2         open



Here some Data of my Setup:
Connections between Arduino Du and AD9959:
MISO (SPI-1)   <<>>   SDIO_2
SCK  (SPI-3)   <<>>   SCLK
MOSI (SPI-4)   <<>>   SDIO_0
GND (SPI-6)    <<>>   GND
SPI CS2 (52)   <<>>   CS     //Due to the fact that the Arduino pulls the signal on Out Pin 4 not completely to LOW

updatePin = 3      <<>>      IO_Update
spiResetPin = 2    <<>>      RESET
spiSyncIOPin = 5   <<>>      SDIO_3
GND                <<>>      SDIO_1 

Here my Code (the parts for SPI Communication:


#include <Wire.h>
#include <SPI.h>

// Pins for SPI
int CS = 52;   //CSB
int updatePin = 3;        //IO_Update
int spiResetPin = 2;
int spiSyncIOPin = 5;


void SPI_IO_Update()
{
 //I/O Update
 digitalWrite(updatePin, HIGH);

 digitalWrite(spiSyncIOPin, LOW);
 digitalWrite(spiSyncIOPin, HIGH);
 digitalWrite(spiSyncIOPin, LOW);
 digitalWrite(spiSyncIOPin, HIGH);
 
 digitalWrite(updatePin, LOW);
}


void sendAD9959Setup()
{
 byte byte1 = B10101010;
 byte byte2 = B01010101;

 // AD9959 Reset
 digitalWrite(spiResetPin, HIGH);
 delay(10);
 digitalWrite(spiResetPin, LOW);
 delay(10);

 // Write- Read- Test
 while(1)
 {
   //Write
   digitalWrite(spiSyncIOPin, LOW);
   SPI.transfer(CS, B00000000, SPI_CONTINUE);  //ChannelAdresse (Instruction Write : 0x00 B00000000
   SPI.transfer(CS, B01000010);                //Schreiben Single-Bit Serial 3-Wire Mode ? aktvieren Channel 1
   digitalWrite(spiSyncIOPin, HIGH);
   SPI_IO_Update();

   //Read
   digitalWrite(spiSyncIOPin,LOW);
   byte1 = SPI.transfer(CS, B10000000, SPI_CONTINUE);  //ChannelAdresse (Instruction Read : 0x80 B10000000
   byte2 = SPI.transfer(CS,0x00);                                                                         //Next 8 Bit cycle to read
   digitalWrite(spiSyncIOPin,HIGH);

   Serial.println();
   Serial.println(byte1,BIN);
   Serial.println(byte2,BIN);
   Serial.println();

 delay(1000);
 }
}


void setup() {
 // SPI
 pinMode(spiSyncIOPin, OUTPUT);
 pinMode(spiResetPin, OUTPUT);
 pinMode(updatePin, OUTPUT);
 pinMode(CS, OUTPUT);
 digitalWrite(spiSyncIOPin, HIGH);
 digitalWrite(spiResetPin, LOW);
 digitalWrite(updatePin, LOW);
 digitalWrite(CS, HIGH);

 SPI.begin(CS);
 //SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
 SPI.setDataMode(CS, SPI_MODE0);
 SPI.setBitOrder(CS, MSBFIRST);
 SPI.setClockDivider(CS, 160); //Divider is set to 80 to get 1MHz transfer clocck

 sendAD9959Setup();
}
Is there somebody out there who could help me?
I say thank you in advance
silasnt

Hello,
I am having similar problems as you. I am trying to program an AD9958, which has only 2 output channels. As you, I can't get the read to work and I can't get the DDS to output anything on the oscillator outputs. Did you make any progress? Did you check your Arduino signals with a scope or logic analyzer? Did you post any questions on ez.analog.com?

I use the Evaluation Board 'AD 9958 / 59 Evaluationboard Z' and on the other side the Arduino Due.
I will be getting an eval board soon. Are you using the 25MHz crystal or are you putting an external clock through a coax connector?

In void SPI_IO_Update(), you toggle the io update more than once. How come? Did you think about putting some delay to make the pulses longer?
Frank

check the CS signal with scope

On the AD9959 chip, there is a DDS9959 Shield (expansion board) for Arduino MEGA DDS AD9959 Shield RF Signal Generator 4 Sync Channels 225MHz @600MHz Core Clock | eBay. The board has a TCXO 40MHZ that works with a built-in PLL in DDS (in the datasheet a frequency multiplier) or external clocking, an OLED screen and an incremental encoder for fast and convenient control, all voltage LDO Low NOISE regulators on the board. You also need to pay attention to RF transformers for each DAC output, they suppress even harmonics, the Chinese like to save money and do not put them on many boards! Well, low-pass filters of the 7th order for each channel. There is also a 3.3 to 5V level converter on the board as the AD9959 uses 3.3V control logic and 5V Arduino.

For Arduino Mega, there is a GitHub repository library: github/afch/DDS-AD9959-Arduino-Shield The software is of course rather weak, not all the potential is realized for the AD9959, but the main functionality is a level in dBm, unlike Chinese in which the level is set in unchangeable values , and also the phase is set in degrees, in Chinese boards it is also in unchangeable values. There is a clock and overclocking menu. The AD9959 can be overclocked to 600MHZ, while the output frequency can be obtained up to 225MHZ, if there are a lot of harmonics above it.

There is also such a moment, regarding the output level, by default it is -7dBm, which is frankly not enough, You can increase it to -3dBm, but as it is written in the datasheet, the spectrum will be slightly worse.

The maximum full-scale output current of the combined DAC outputs is 15 mA, but limiting the output to 10 mA provides optimal spurious-free dynamic range (SFDR) performance.

This parameter is set on the DDS9959 board with resistors R11 1.91k for -7dBm (DAC = 10mA) and 1.26k for -3dBm (DAC = 15mA). instead of one percent, you can put 1.8k and 1.2k.