AnsweredAssumed Answered

AD9910 Init

Question asked by -Simon- on Jun 7, 2018

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_Delay(1);
       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_Delay(1);
       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_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
    HAL_Delay(2);
    HAL_SPI_Transmit(spihandler, &receive_adr, 1, 50);
    HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_RESET);
    HAL_SPI_Receive(spihandler, storage, Reg_size, 50);
    HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(IO_UPDATE_GPIO_Port, IO_UPDATE_Pin, GPIO_PIN_RESET);
    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

Simon

Outcomes