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