This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DAC1220: Vout shows 2.56V at power up

Part Number: DAC1220

Hi team,

My customer is using DAC1220 for analog output, and they have tested 5 samples, all of them output 2.56V at power up, which is not desired. I've recommend to write register CALPIN to disconnect output during calibration, and MD to set self-calibration, but it won't help. Could you please have a look on this application?

BR

Sirui

.c file:

#include "dac1220.h"
#include "main.h"
#include "systick.h"
void dac1220_gpio_init() 
{
    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1);                                
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1);
}

void da_spi0_init()
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SPI0);
    gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5 | GPIO_PIN_6 |GPIO_PIN_7);
      gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6 |GPIO_PIN_7);
     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 |GPIO_PIN_7);
    DASPI0_CS0_OFF;
    DASPI0_CS1_OFF;
    DASPI0_CS2_OFF;
    DASPI0_CS3_OFF;
    spi_parameter_struct spi_init_struct;

    /* SPI1 parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_64;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
       spi_init(SPI0, &spi_init_struct);

    spi_enable(SPI0);
}

void dac1220_init()
{
    DASPI0_CS0_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS0_OFF;
    DASPI0_CS0_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA1);
    DASPI0_CS0_OFF;
    delay_1ms(1000);
    DASPI0_CS0_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS0_OFF;
    DASPI0_CS0_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA0);
    DASPI0_CS0_OFF;
    delay_us(100);
    
    
    DASPI0_CS1_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS1_OFF;
    delay_us(100);
    DASPI0_CS1_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA1);
    DASPI0_CS1_OFF;
    delay_1ms(1000);
    DASPI0_CS1_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS1_OFF;
    delay_us(100);
    DASPI0_CS1_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA0);
    DASPI0_CS1_OFF;

    DASPI0_CS2_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS2_OFF;
    DASPI0_CS2_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA1);
    DASPI0_CS2_OFF;
    delay_1ms(1000);
    DASPI0_CS2_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS1_OFF;
    DASPI0_CS2_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA0);
    DASPI0_CS2_OFF;

    DASPI0_CS3_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS3_OFF;
    DASPI0_CS3_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA1);
    DASPI0_CS3_OFF;
    delay_1ms(1000);
    DASPI0_CS3_ON;
    delay_us(100);
    da_spi0_readwrite(0x04);
    delay_us(100);
    da_spi0_readwrite(0x00);
    DASPI0_CS3_OFF;
    DASPI0_CS3_ON;
    delay_us(100);
    da_spi0_readwrite(0x05);
    delay_us(100);
    da_spi0_readwrite(0xA0);
    DASPI0_CS3_OFF;
}

uint16_t da_spi0_readwrite(uint8_t data)
{
    uint16_t spidata;
    while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE))
    {}
     spi_i2s_data_transmit(SPI0, data);
      while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE))
    {}
      spidata = spi_i2s_data_receive(SPI0);
    return spidata;
}

void dac1220_out(uint8_t ch,uint32_t data)
{
    if (0x00 == ch)
    {
        DASPI0_CS0_ON;
        delay_us(100);
        da_spi0_readwrite(0x00);
        delay_us(100);
        da_spi0_readwrite((data>>12)&0xff);
        DASPI0_CS0_OFF;
        DASPI0_CS0_ON;
        delay_us(100);
        da_spi0_readwrite(0x01);
        delay_us(100);
        da_spi0_readwrite((data>>4)&0xff);
        DASPI0_CS0_OFF;
        DASPI0_CS0_ON;
        delay_us(100);
        da_spi0_readwrite(0x02);
        delay_us(100);
        da_spi0_readwrite((data<<4)&0xf0);
        DASPI0_CS0_OFF;
    }
    else if (0x01 == ch)
    {
        DASPI0_CS1_ON;
        delay_us(100);
        da_spi0_readwrite(0x00);
        delay_us(100);
        da_spi0_readwrite((data>>12)&0xff);
        DASPI0_CS1_OFF;
        delay_us(100);
        DASPI0_CS1_ON;
        delay_us(100);
        da_spi0_readwrite(0x01);
        delay_us(100);
        da_spi0_readwrite((data>>4)&0xff);
        DASPI0_CS1_OFF;
        delay_us(100);
        DASPI0_CS1_ON;
        delay_us(100);
        da_spi0_readwrite(0x02);
        delay_us(100);
        da_spi0_readwrite((data<<4)&0xf0);
        DASPI0_CS1_OFF;
    }
    else if (0x02 == ch)
    {
        DASPI0_CS2_ON;
        delay_us(100);
        da_spi0_readwrite(0x00);
        delay_us(100);
        da_spi0_readwrite((data>>12)&0xff);
        DASPI0_CS2_OFF;
        DASPI0_CS2_ON;
        delay_us(100);
        da_spi0_readwrite(0x01);
        delay_us(100);
        da_spi0_readwrite((data>>4)&0xff);
        DASPI0_CS2_OFF;
        DASPI0_CS2_ON;
        delay_us(100);
        da_spi0_readwrite(0x02);
        delay_us(100);
        da_spi0_readwrite((data<<4)&0xf0);
        DASPI0_CS2_OFF;
    }
    else if (0x03 == ch)
    {
        DASPI0_CS3_ON;
        delay_us(100);
        da_spi0_readwrite(0x00);
        delay_us(100);
        da_spi0_readwrite((data>>12)&0xff);
        DASPI0_CS3_OFF;
        DASPI0_CS3_ON;
        delay_us(100);
        da_spi0_readwrite(0x01);
        delay_us(100);
        da_spi0_readwrite((data>>4)&0xff);
        DASPI0_CS3_OFF;
        DASPI0_CS3_ON;
        delay_us(100);
        da_spi0_readwrite(0x02);
        delay_us(100);
        da_spi0_readwrite((data<<4)&0xf0);
        DASPI0_CS3_OFF;
    }
}
    

  • Hi,

    Please send us the complete schematics. We need more hardware details.

    1. How are you applying power to DAC1220? Digital supply first and then analog? This device needs proper power supply sequencing if you are operating with different analog and digital supplies..

    2. How are you generating Vref for this device?

    3. I can see 2 GND symbols in this schematics. Is it shorted somewhere on board?

    4. Power supply decoupling capacitors?

    Regards,

    AK

  • Hi AK,

    Since it's related to customer's schematic, I'll send you email offline.

    BR

    Sirui