Hi,
I am trying to control the evaluation board AD9959 using Arduino Due. I am not observing any output on the oscilloscope and am not sure how to proceed ahead. Following are my pin connections:
Arduino Due -> DDS (U2 row):
Pin 10 -> CSB (my slave select pin)
Pin 9 -> Reset
Pin 4 -> IO_UPDATE
SPI MOSI -> SDIO_0
SPI SCLK -> SCLK
Pin 6 -> P2
Pin 7 -> P3
Digital Pin GND: IO_UPDATE + RESET + P3 + P2
Analog Pin GND: CSB
SPI GND: SDIO_0 + SCLK
This is following the post mentioned here, wherein the person successfully managed to interface Arduino Due and AD9959 Evaluation board. (link )
Following is the code snippet that I am using to write onto the DDS. The code is also taken from the same link:
#include <SPI.h>
#include "DDS.h"
float out=0;
const int slaveSelectPin = 10;
const int IO_UpdatePin = 3;
const int Reset = 9;
const int P0 = 11 ;
const int P1 = 12;
const int P2 = 6; //Profile Pin 2 for DDS
const int P3 = 7; //Profile Pin 3 for DDS
DDS controlDDS(slaveSelectPin,IO_UpdatePin,Reset,P0,P1,P2,P3);
void setup() {
//while (!Serial) ;
// Start SPI
// In initialize(), set the External REF frequency in Hz.
controlDDS.resetDDS();
controlDDS.initializeDDS();
// SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
//digitalWrite(P3,LOW);
//digitalWrite(P2,LOW);
}
void loop() {
//CSR Channel Select Register
byte instruction = B00000000;
byte writeCSR = B00010000;
//10000000 (C3 enable) 01000000 (C2 enable) 00100000 (C1 enable) 00010000 (C0 enable)
SPI.transfer(slaveSelectPin, instruction, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCSR, SPI_LAST);
controlDDS.updateIO();
//FR1 Function Register 1
byte instruction3 = B00000001;
byte writeFR1_1 = B11010000;
byte writeFR1_2 = B00000000;
byte writeFR1_3 = B00000000;
// SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
// digitalWrite(_CS, LOW);
SPI.transfer(slaveSelectPin, instruction3, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeFR1_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeFR1_2, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeFR1_3, SPI_LAST);
//controlDDS.updateIO();
//FR2 Function Register 2
byte instruction4 = B00000010;
byte writeFR2_1 = B00000000;
byte writeFR2_2 = B00000000;
SPI.transfer(slaveSelectPin, instruction4, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeFR2_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeFR2_2, SPI_LAST);
//controlDDS.updateIO();
//CFR Channel Function Register (Single Tone, AM, FM, etc)
byte instruction5 = B00000011;
byte writeCFR_1 = B10000000;
byte writeCFR_2 = B01000011;
byte writeCFR_3 = B00000000;
SPI.transfer(slaveSelectPin, instruction5, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFR_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFR_2, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFR_3, SPI_LAST);
controlDDS.updateIO();
//CTW0 Channel Frequency Tuning Word 0 (Frequency Selection)
byte instruction2 = B00000100;
byte writeCFTW0_1 = B00001010;
byte writeCFTW0_2 = B00111101;
byte writeCFTW0_3 = B01110000;
byte writeCFTW0_4 = B10100100;
SPI.transfer(slaveSelectPin, instruction2, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW0_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW0_2, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW0_3, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW0_4, SPI_LAST);
controlDDS.updateIO();
//LSR Linear Sweep Ramp (Rising Step Interval)
byte instruction7 = B00000111;
byte writeLSR_1 = B00000000;
byte writeLSR_2 = B00000110;
SPI.transfer(slaveSelectPin, instruction7, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeLSR_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeLSR_2, SPI_LAST);
//controlDDS.updateIO();
//RDW Rising Delta Word (Rising Step Size)
byte instruction8 = B00001000;
byte writeRDW_1 = B00000000;
byte writeRDW_2 = B00000000;
byte writeRDW_3 = B00000001;
byte writeRDW_4 = B10101101;
SPI.transfer(slaveSelectPin, instruction8, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeRDW_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeRDW_2, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeRDW_3, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeRDW_4, SPI_LAST);
controlDDS.updateIO();
//CTW1 Channel Frequency Tuning Word 1 (Frequency 2)
byte instruction6 = B00001010;
byte writeCFTW1_1 = B00101110;
byte writeCFTW1_2 = B00010100;
byte writeCFTW1_3 = B01111010;
byte writeCFTW1_4 = B11100001;
SPI.transfer(slaveSelectPin, instruction6, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW1_1, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW1_2, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW1_3, SPI_CONTINUE);
SPI.transfer(slaveSelectPin, writeCFTW1_4, SPI_LAST);
controlDDS.updateIO();
//Profile Pin -> High to carry out sweep
digitalWrite(P3,HIGH);
digitalWrite(P2,HIGH);
digitalWrite(P1,HIGH);
digitalWrite(P0,HIGH);
controlDDS.updateIO();
delay(1000);
}
I have checked the following things:
- Code compiles correctly without any error.
- Checked the individual working of Arduino Due and AD9959 Evaluation board. Both work accurately.
- Checked the CS pin, it is being enabled and disabled when required.
- Checked the basic SPI using a temperature sensor. That is working accurately.
I do not know how to debug ahead from this. Any suggestions on this is helpful.
Regards
Prerna