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.

DAC161S997: Current Ripple Issue

Part Number: DAC161S997


Tool/software:

Hi team,

Could you please help to check the register map and schematic design, it is observed 1mA ripple happens when the same digital signal input as the video shows.

#include "bsp.h"
#include "dev_dac.h"

#define REG_DATA_DUMMY                       0xFF

#define DAC161S997_XFER_REG		        0x01
#define DAC161S997_NOP			        0x02
#define DAC161S997_WR_MODE		        0x03
#define DAC161S997_DACCODE		        0x04
#define DAC161S997_ERR_CONFIG           0x05
#define DAC161S997_ERR_LOW		        0x06
#define DAC161S997_ERR_HIGH		        0x07
#define DAC161S997_RESET			        0x08
#define DAC161S997_STATUS		        0x09
#define DAC161S997_READ_CMD                      0x80
#define DAC161S997_RESET_CMD                     0xC33C
#define DAC161S997_ERR_CONFIG_SPI_TIMEOUT        0x000E
#define DAC161S997_ERR_CONFIG_MASK_SPI_TOUT      0x0001
#define DAC161S997_WR_MODE_MASK                  0x0001
#define DAC161S997_ERR_HIGH_LOW_MASK             0xFF00
#define DAC161S997_CMD_DIS_RETRY_LOOP_DISABLE          0x0000
#define DAC161S997_CMD_DIS_RETRY_LOOP_ENABLE           0x0080
#define DAC161S997_CMD_MASK_LOOP_ERR_DISABLE           0x0000
#define DAC161S997_CMD_MASK_LOOP_ERR_ENABLE            0x0040
#define DAC161S997_CMD_DIS_LOOP_ERR_ERRB_DISABLE       0x0000
#define DAC161S997_CMD_DIS_LOOP_ERR_ERRB_ENABLE        0x0020  
#define DAC161S997_CMD_MASK_SPI_ERR_DISABLE            0x0000
#define DAC161S997_CMD_MASK_SPI_ERR_ENABLE             0x0010
#define DAC161S997_CMD_SPI_TIMEOUT_50ms                0x0000
#define DAC161S997_CMD_SPI_TIMEOUT_100ms               0x0002
#define DAC161S997_CMD_SPI_TIMEOUT_150ms               0x0004
#define DAC161S997_CMD_SPI_TIMEOUT_200ms               0x0006
#define DAC161S997_CMD_SPI_TIMEOUT_250ms               0x0008
#define DAC161S997_CMD_SPI_TIMEOUT_300ms               0x000A
#define DAC161S997_CMD_SPI_TIMEOUT_350ms               0x000C
#define DAC161S997_CMD_SPI_TIMEOUT_400ms               0x000E
#define DAC161S997_CMD_MASK_SPI_TOUT_DISABLE           0x0000
#define DAC161S997_CMD_MASK_SPI_TOUT_ENABLE            0x0001
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_50ms     0x0000
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_100ms    0x0100
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_150ms    0x0200
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_200ms    0x0300
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_250ms    0x0400
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_300ms    0x0500
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_350ms    0x0600
#define DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_400ms    0x0700
#define _delay() 

uint16_t dac161S997_read_register(uint8_t reg)
{
    uint16_t ret_reg;
    MCU_SPI_CS_LOW;
    _delay();
    bsp_spi_rw_byte(reg | DAC161S997_READ_CMD);
    ret_reg = bsp_spi_rw_byte(REG_DATA_DUMMY);
    ret_reg <<= 8;
    ret_reg |= bsp_spi_rw_byte(REG_DATA_DUMMY);
    _delay();
    MCU_SPI_CS_HIGH;
#if 0    
    _delay();
    MCU_SPI_CS_LOW;
    bsp_spi_rw_byte(DAC161S997_NOP);
    ret_reg = bsp_spi_rw_byte(REG_DATA_DUMMY);
    ret_reg <<= 8;
    ret_reg |= bsp_spi_rw_byte(REG_DATA_DUMMY);
    _delay();
    MCU_SPI_CS_HIGH;
#endif    
    
 #if 0
    MCU_SPI_CS_LOW;
    _delay();
    bsp_spi_rw_byte(reg | DAC161S997_READ_CMD);
    ret_reg = bsp_spi_rw_byte(REG_DATA_DUMMY);
    ret_reg <<= 8;
    ret_reg |= bsp_spi_rw_byte(REG_DATA_DUMMY);
    _delay();
    MCU_SPI_CS_HIGH;

#endif
    return ret_reg;
}

void dac161S997_write_register(uint8_t reg, uint16_t val)
{
    MCU_SPI_CS_LOW;   
    _delay();
    bsp_spi_rw_byte(reg);
    bsp_spi_rw_byte(val >> 8);
    bsp_spi_rw_byte(val & 0xff);
    _delay();    
    MCU_SPI_CS_HIGH;
}


void dac161S997_xfer_write_register(uint8_t reg, uint16_t val)
{
    MCU_SPI_CS_LOW;   
    _delay();
    bsp_spi_rw_byte(reg);
    bsp_spi_rw_byte(val >> 8);
    bsp_spi_rw_byte(val & 0xff);
    _delay();    
    MCU_SPI_CS_HIGH;
    _delay();    
    MCU_SPI_CS_LOW;   
    _delay();
    bsp_spi_rw_byte(DAC161S997_XFER_REG);
    bsp_spi_rw_byte(0x00);
    bsp_spi_rw_byte(0xff);
    _delay();    
    MCU_SPI_CS_HIGH;
    _delay();    
    MCU_SPI_CS_LOW;   
    _delay();
    bsp_spi_rw_byte(DAC161S997_NOP);
    bsp_spi_rw_byte(REG_DATA_DUMMY);
    bsp_spi_rw_byte(REG_DATA_DUMMY);
    _delay();    
    MCU_SPI_CS_HIGH;
}


void dac161S997_reset(void)
{
    dac161S997_write_register(DAC161S997_RESET, DAC161S997_RESET_CMD);
    dac161S997_write_register(DAC161S997_NOP, REG_DATA_DUMMY);
}

void dev_dac_init(void)
{
    uint16_t reg_val;
    dac161S997_reset();
    delay_1ms(10);
  //  while (1)
    {
        reg_val = dac161S997_read_register(DAC161S997_STATUS);
        delay_1ms(10);
    }
    dac161S997_write_register(DAC161S997_NOP, 0x00);
    dac161S997_write_register(DAC161S997_WR_MODE, 0x00);
    dac161S997_write_register(DAC161S997_ERR_CONFIG, DAC161S997_CMD_RETRY_TIMEL_RETRY_TIME_200ms 
                                                     | DAC161S997_CMD_DIS_RETRY_LOOP_ENABLE
                                                     | DAC161S997_CMD_MASK_SPI_ERR_ENABLE
                                                     | DAC161S997_CMD_SPI_TIMEOUT_400ms );
}


void dev_adc_set_value(float current)
{
    dac161S997_write_register(DAC161S997_DACCODE, 65536 * current / 24);
}
#include "gd32l23x_libopt.h"
#include "bsp.h"

void bsp_spi_init(void)
{
   spi_parameter_struct spi_init_struct;
    rcu_periph_clock_enable(RCU_SPI0);
    /* SPI0 GPIO configuration: SCK/PA5, MISO/PA6, MOSI/PA7 */
    gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
    
    gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_7);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);

    gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_6);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);
    
    spi_struct_para_init(&spi_init_struct);
    /* deinitilize SPI and the parameters */
    spi_i2s_deinit(SPI0);
    /* SPI0 parameter configuration */
    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_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_4;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);
    spi_crc_length_set(SPI0, SPI_CRC_8BIT);
    spi_fifo_access_size_config(SPI0, SPI_BYTE_ACCESS);
    spi_crc_polynomial_set(SPI0, 7);
    spi_crc_off(SPI0);
    spi_enable(SPI0);
}


uint8_t bsp_spi_rw_byte(uint8_t data)
{
    int count = 0xfff;
    do{
        count -= 1;
        if (count < 0)
        {
            return 0xFF;
        }
    }while(spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == 0);
    spi_i2s_data_transmit(SPI0, data);
    count = 0xfff;
    do{
        count -= 1;
        if (count < 0)
        {
            return 0xFF;
        }
    }while (0 == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
    return spi_i2s_data_receive(SPI0);
}

void bsp_spi_send_byte(uint8_t data)
{
    int count = 0xfff;
    do{
        count -= 1;
        if (count < 0)
        {
            return;
        }
    }while(spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == 0);
    spi_i2s_data_transmit(SPI0, data);
}






void bsp_spi1_send_byte(uint8_t byte)
{
    int16_t count = 0xfff; 

    while (spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == 0 && count > 0)
    {
        count -= 1;
    }
    spi_i2s_data_transmit(SPI1, byte);
}

  • Hi Shengyue,

    I dont see 1mA change in the video.  It seems like the output change about ±2µA in the video.  This could be noise in the meter.  There is a possiblity that the there is some settling time for the circuit when the COMD current changes, but it does only seem like a few µA.

    Can you clarify the issue?

    Paul

  • Shengyue,

    If the noise is just the noise from the current meter as Paul had suggested, then you might want to try measuring it in voltage mode. If you use a 100Ω resistor as a sense resistor in the loop, you could measure the voltage. The voltage measurement may have less noise than the current measurement.

    Joseph Wu

  • Paul, Joseph

    Thanks for your response, after check with customer, it should be few uAs. But the fluctuation is larger than 1.2uA (3‰ accuracy) which is expected, could you please suggest optimization?

  • Shengyue,

    The DAC161S997 full scale range is 24mA. With 1.2uA, the fluctuation is 0.005%.

    Can you check again with the customer on the value? From my observation, the video does look like it is 1.2uA.

    Joseph Wu