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.

DAC53701: DAC53701:Cannot generate medical alarm wave

Part Number: DAC53701

I use an stm32g031 mcu and two dac53701.

i found i have already changed one of the two dacs's slave address,but when i set to generate wave,,the two dac outputs are 0V.

schematic and code is below

void SetGpiVal(uint8_t dat)
{
if(dat & 0x01)
HAL_GPIO_WritePin(GPI_EN_GPIO_Port,GPI_EN_Pin,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPI_EN_GPIO_Port,GPI_EN_Pin,GPIO_PIN_RESET);

if(dat & 0x02)
HAL_GPIO_WritePin(GPI_FQ_GPIO_Port,GPI_FQ_Pin,GPIO_PIN_SET);
else
HAL_GPIO_WritePin(GPI_FQ_GPIO_Port,GPI_FQ_Pin,GPIO_PIN_RESET);

}


void DacSlaveAddressUpdate(uint8_t dacx,uint8_t addr)
{
uint8_t addr_r,datw[2],datr[2];
uint16_t dat_reg;

addr_r = addr & 0x03;

//1. Set GPI pin to 0b for all devices.
SetGpiVal(0);
HAL_Delay(1);

//2. Set GPI_CONFIG in the CONFIG2 register to 111b.
dat_reg = CONFIG2_GPI_CONFIG_I2C_SLAVE_ADDR;
datw[0] = dat_reg >> 8;
datw[1] = dat_reg;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,datw,2,100);
HAL_Delay(1);

//3. Set GPI_EN in the TRIGGER register to 1b.
dat_reg = TRIGGER_GPI_ENABLE;
datw[0] = dat_reg >> 8;
datw[1] = dat_reg;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,datw,2,100);
HAL_Delay(1);

//4. Set the GPI pin to logic HIGH for the device that needs to be configured.
if(dacx == DAC1)
SetGpiVal(0x01);
else if(dacx == DAC2)
SetGpiVal(0x02);
HAL_Delay(1);

//5. Write data to SLAVE_ADDRESS bit field in the CONFIG2 register.
switch(addr_r)
{
case 0:
dat_reg = CONFIG2_SLAVE_ADDRESS_48H;
break;

case 1:
dat_reg = CONFIG2_SLAVE_ADDRESS_49H;
break;

case 2:
dat_reg = CONFIG2_SLAVE_ADDRESS_4AH;
break;

case 3:
dat_reg = CONFIG2_SLAVE_ADDRESS_4BH;
break;
}
datw[0] = dat_reg >> 8;
datw[1] = dat_reg;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,datw,2,100);
HAL_Delay(1);

//6. Toggle the GPI pin of the device bring programmed to logic LOW
SetGpiVal(0);
HAL_Delay(1);

//7. Repeat steps (1) through (6) above to program the I2C slave addresses to all the devices on the bus.

//8. Set GPI_EN to 0b.
dat_reg = TRIGGER_GPI_DISABLE;
datw[0] = dat_reg >> 8;
datw[1] = dat_reg;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,datw,2,100);
HAL_Delay(1);

//9. Change GPI_CONFIG to 000b.
dat_reg = CONFIG2_GPI_CONFIG_PU_PD_HiZ;
datw[0] = dat_reg >> 8;
datw[1] = dat_reg;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,datw,2,100);
HAL_Delay(1);

//10. Trigger NVM write operation.
dat_reg = TRIGGER_NVM_PROG_ENABLE;
datw[0] = dat_reg >> 8;
datw[1] = dat_reg;
datr[0] = 0x20;
while(datr[0] & 0x20)
{
HAL_I2C_Mem_Read(&hi2c1,(0x48 + addr_r)*2+1,DAC_REG_ADDR_STATUS,I2C_MEMADD_SIZE_8BIT,datr,2,100);
HAL_Delay(5);
}
HAL_I2C_Mem_Write(&hi2c1,(0x48 + addr_r)*2,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,datw,2,100);
HAL_Delay(1);

}


void DAC53701_Init()
{
uint8_t dat[2]={0};

//check dac2 read or not,if not ,try change address
while(HAL_I2C_IsDeviceReady(&hi2c1,I2C_ADDR_DAC2_WRITE,5,100))
{
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
DacSlaveAddressUpdate(DAC2,0x49);
HAL_Delay(100);
}
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);

//check dac1 ready or not,check dac2 first to avoid only one dac online and changed to dac2
while(HAL_I2C_IsDeviceReady(&hi2c1,I2C_ADDR_DAC1_WRITE,5,100))
{

}

//DAC1startup
//Power-up DAC1, enable VDD reference, SLEW_RATE: 1.6384 ms (Square wave frequency: 610 Hz)
dat[0] = 0xC1;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC1_WRITE,DAC_REG_ADDR_GENERAL_CONFIG,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_HIGH on DAC1
dat[0] = 0x0F;
dat[1] = 0xFC;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC1_WRITE,DAC_REG_ADDR_DAC_MARGIN_HIGH,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_LOW on DAC1
dat[0] = 0x00;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC1_WRITE,DAC_REG_ADDR_DAC_MARGIN_LOW,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set DAC1 GPIO to trigger square wave
dat[0] = 0x18;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC1_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Trigger NVM write operation. 
dat[0] = 0x00;
dat[1] = 0x10;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC1_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);

}


void SetAlarmType()
{
uint8_t dat[2];

if((alarm_type & 0x0F) == ALARM_HIGH)
{
if((alarm_type & 0xF0) == 0) //HP alarm
{
//Power-up DAC2, enable VDD reference
//CODE_STEP: 8 LSB, SLEW_RATE: 204.8 μs x 1.75 = 358.4 μs (Envelope rise/fall times for full-scale:~26 ms)
dat[0] = 0x0A;
dat[1] = 0x80;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_GENERAL_CONFIG,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Configure DAC2 GPIO to trigger high-priority alarm with minimum time settings and trigger
dat[0] = CONFIG2_GPI_CONFIG_MED_ALARM_HP >> 8;
dat[1] = (uint8_t)CONFIG2_GPI_CONFIG_MED_ALARM_HP;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_HIGH on DAC2
dat[0] = 0x0F;
dat[1] = 0xFC;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_DAC_MARGIN_HIGH,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_LOW on DAC2
dat[0] = 0x00;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_DAC_MARGIN_LOW,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
// Set GPI_EN in the TRIGGER register to 1b
dat[0] = 0x04;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Trigger NVM write operation.
dat[0] = 0x00;
dat[1] = 0x10;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(5);

SetGpiVal(0x03);

alarm_type |= 0x10;
}
else //
{

}
}

if((alarm_type & 0x0F) == ALARM_MEDIUM)
{
if((alarm_type & 0xF0) == 0) //
{
//Power-up DAC2, enable VDD reference
//CODE_STEP: 8 LSB, SLEW_RATE: 204.8 μs x 1.75 = 358.4 μs (Envelope rise/fall times for full-scale:~26 ms)
dat[0] = 0x0A;
dat[1] = 0x80;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_GENERAL_CONFIG,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
// Configure DAC2 GPIO to trigger medium-priority alarm with minimum time settings and trigger
dat[0] = CONFIG2_GPI_CONFIG_MED_ALARM_MP >> 8;
dat[1] = (uint8_t)CONFIG2_GPI_CONFIG_MED_ALARM_MP;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_HIGH on DAC2
dat[0] = 0x0F;
dat[1] = 0xFC;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_DAC_MARGIN_HIGH,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_LOW on DAC2
dat[0] = 0x00;
dat[1] = 0x00;
HAL_Delay(1);
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_DAC_MARGIN_LOW,I2C_MEMADD_SIZE_8BIT,dat,2,100);
// Set GPI_EN in the TRIGGER register to 1b
dat[0] = 0x04;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Trigger NVM write operation.
dat[0] = 0x00;
dat[1] = 0x10;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(5);

SetGpiVal(0x03);

alarm_type |= 0x10;
}
else //
{

}
}

if((alarm_type & 0x0F) == ALARM_MEDIUM)
{
if((alarm_type & 0xF0) == 0) //
{
//Power-up DAC2, enable VDD reference
//CODE_STEP: 8 LSB, SLEW_RATE: 204.8 μs x 1.75 = 358.4 μs (Envelope rise/fall times for full-scale:~26 ms)
dat[0] = 0x0A;
dat[1] = 0x80;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_GENERAL_CONFIG,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Configure DAC2 GPIO to trigger low-priority alarm with minimum time settings and trigger
dat[0] = CONFIG2_GPI_CONFIG_MED_ALARM_LP >> 8;
dat[1] = (uint8_t)CONFIG2_GPI_CONFIG_MED_ALARM_LP;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_CONFIG2,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_HIGH on DAC2
dat[0] = 0x0F;
dat[1] = 0xFC;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_DAC_MARGIN_HIGH,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Set MARGIN_LOW on DAC2
dat[0] = 0x00;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_DAC2_WRITE,DAC_REG_ADDR_DAC_MARGIN_LOW,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
// Set GPI_EN in the TRIGGER register to 1b
dat[0] = 0x04;
dat[1] = 0x00;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(1);
//Trigger NVM write operation.
dat[0] = 0x00;
dat[1] = 0x10;
HAL_I2C_Mem_Write(&hi2c1,I2C_ADDR_BROADCAST_WRITE,DAC_REG_ADDR_TRIGGER,I2C_MEMADD_SIZE_8BIT,dat,2,100);
HAL_Delay(5);

SetGpiVal(0x03);

alarm_type |= 0x10;
}
else //
{

}
}

if((alarm_type & 0x0F) == ALARM_NONE)
{
if((alarm_type & 0xF0) == 0) //
{
SetGpiVal(0x00);

alarm_type |= 0x10;
}

}

}