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);
}