AnsweredAssumed Answered

AD9910 Init

Question asked by -Simon- on Jun 7, 2018
Latest reply on Jul 12, 2018 by GuilleJaquenod

Hi everyone,


I'm having trouble with my AD9910, as I am unable to make the chip working. I'm using the AD 9910 eval board with an external STM32 microcontroller to program the device using SPI.

Some information on my hardware settings:

ExtPwrDown connected to GND

PROFILE 0 - 2 connected to GND

Jumpers: W1 and W2 disable; W3 open; W4 disable; W5 and W6 disable, W7 XTAL; W11 open, XTAL is connected via R4 and R11 while CLK_Input is disconnected

Microcontroller connections: SCLK, MOSI, MISO, CS, IOUPDATE


This is my function to write the registers of the DDS, it takes a spihandle typedef, a pointer to the data I want to write, the length of the data and the adress of the DDS where I want to write bits. I checked all signals on the oscilloscope and as far as I could see, this function works as it should. I use it to send all the initialization data to the dds.


   void DDS_SPI_Write(SPI_HandleTypeDef *spihandler, uint16_t *data, uint8_t datasize, uint8_t *adress){

       HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);         // Sets CS low
       HAL_Delay(2);                                                                                                //Delay in ms
       HAL_SPI_Transmit(spihandler, &adress, 1, 50);                                          //transmits data located in adress
       HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_SET);      //IO_Update goes high
       HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_RESET);   //IO UPdate goes low
       HAL_SPI_Transmit(spihandler, data, datasize, 50);                                   //transmits data with size datasize                
       HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_SET);      //again IO update high
       HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_RESET);   // IO upadte low again   
       HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);                              // CS goes high again


Then, when trying to read data via SPI (yes, Register 0x00 is set to  00 01 40 02, indicating SDIO as single direction pin) with the following function, all I get is 0xFFFF(when reading 0x00)##, which means for me, SDO pin is always high (see datasheet: "When in 2 wire SPI mode, SD0 is always high")


void DDS_SPI_Read(SPI_HandleTypeDef *spihandler, uint16_t *adress, uint8_t Reg_size, uint8_t *storage){


// function needs spihandletypdef, adress, which register to read, size of that register and where to store the received data

    uint8_t receive_adr = 0x80 |  (uint8_t) adress;


    HAL_SPI_Transmit(spihandler, &receive_adr, 1, 50);
    HAL_SPI_Receive(spihandler, storage, Reg_size, 50);
    HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);



Current consumption on 3.3V is 65.3mA and 8.16mA @ 1.8V

No signal measured on SYNCCLK, PLL_Lock is at 0V



So, my question is, is there anything I forgot to set or reset or a jumper or whatever, that makes the chip work?

Is there a timing problem, is my microcontroller too fast/slow, btw. I'm writing SPI with 312.5 kbit/s.

Additional: " IO UPDATE is active on the rising edge of SYNCCLK..." What does this mean if the chip has/generates no clk itself, do I have to update the chip using the PROFILE pins?!


Best Regards