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