我使用一个 stm32g031 MCU 和两个 dac53701。
我发现我已经更改了两个 DAC 的从器件地址之一、但当我设置为生成波形时、两个 DAC 输出为0V。
原理图和代码如下所示
空 SetGpiVal (uint8_t dat)
{
if (dat & 0x01)
HAL_GPIO_WritePin (GPI_EN_GPIO_Port、GPI_EN_Pin、GPIO_PIN_SET);
否则
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);
否则
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. 对于所有器件、将 GPI 引脚设置为0b。
SetGpiVal (0);
HAL_DELAY (1);
//2. 将 CONFIG2寄存器中的 GPI_CONFIG 设置为111b。
DAT_reg = CONFIG2_GPI_CONFIG_I2C_SLAVE_ADDR;
datw[0]= dat_reg >>8;
datw[1]= dat_reg;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、datw、2100);
HAL_DELAY (1);
//3. 将触发寄存器中的 GPI_EN 设置为1b。
DAT_reg = TRIGGER_GPI_ENABLE;
datw[0]= dat_reg >>8;
datw[1]= dat_reg;
HAL_I2C_WRITE_Hi2c1 Mem_Write、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、datw、2100);
HAL_DELAY (1);
//4. 对于需要配置的器件、将 GPI 引脚设置为逻辑高电平。
if (dacx == DAC1)
SetGpiVal (0x01);
否则、如果(dacx => dac2)
SetGpiVal (0x02);
HAL_DELAY (1);
//5. 将数据写入 CONFIG2寄存器中的 SLAVE_ADDRESS 位字段。
switch (addr_r)
{
情形0:
DAT_reg = CONFIG2_SLAVE_ADDRESS_48h;
中断;
情形1:
DAT_reg = CONFIG2_SLAVE_ADDRESS_49h;
中断;
情形2:
DAT_reg = CONFIG2_SLAVE_ADDRESS_4Ah;
中断;
情形3:
DAT_reg = CONFIG2_SLAVE_ADDRESS_4BH;
中断;
}
datw[0]= dat_reg >>8;
datw[1]= dat_reg;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、datw、2100);
HAL_DELAY (1);
//6. 切换器件的 GPI 引脚将编程为逻辑低电平
SetGpiVal (0);
HAL_DELAY (1);
//7. 重复上面的步骤(1)至(6)、将 I2C 从器件地址编程为总线上的所有器件。
//8. 将 GPI_EN 设置为0b。
DAT_reg = TRIGGER_GPI_DISABLE;
datw[0]= dat_reg >>8;
datw[1]= dat_reg;
HAL_I2C_WRITE_Hi2c1 Mem_Write、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、datw、2100);
HAL_DELAY (1);
//9. 将 GPI_CONFIG 更改为000b。
DAT_reg = CONFIG2_GPI_CONFIG_PU_PD_HiZ;
datw[0]= dat_reg >>8;
datw[1]= dat_reg;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、datw、2100);
HAL_DELAY (1);
//10. 触发 NVM 写入操作。
DAT_reg = TRIGGER_NVM_PROG_ENABLE;
datw[0]= dat_reg >>8;
datw[1]= dat_reg;
datr[0]= 0x20;
while (dat[0]和0x20)
{
HAL_I2C_ADDR_STATUS Mem_Read (&hi2c1、(0x48 + addr_r)* 2+1、DAC_REG_ADDR_STATUS、I2C_MEMADD_SIZE_8位、datr、2100);
HAL_DELAY (5);
}
HAL_I2C_ADDR_TRIGGER Mem_Write (&hi2c1、(0x48 + addr_r)* 2、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、datw、2100);
HAL_DELAY (1);
}
空 DAC53701_Init ()
{
uint8_t dat[2]={0};
//检查 dac2是否读取,如果没有,请尝试更改地址
while (HAL_I2C_IsDeviceReady (&hi2c1、I2C_ADDR_DAC2_WRITE、5100))
{
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);
//检查 dac1就绪或未就绪,首先检查 dac2,以避免只有一个 DAC 在线,并更改为 dac2
while (HAL_I2C_IsDeviceReady (&hi2c1、I2C_ADDR_DAC1_WRITE、5100))
{
}
//DAC1启动
//加电 DAC1、启用 VDD 基准、SLEW_RATE:1.6384ms (方波频率:610Hz)
DAT[0]= 0xC1;
DAT[1]= 0x00;
HAL_I2C_AD1_ Mem_Write (&hi2c1、I2C_ADDR_DAC1_WRITE、DAC_REG_ADDR_GENERAL_CONFIG、I2C_MEMADD_SIZE_8bit、dat、2100);
HAL_DELAY (1);
//在 DAC1上设置 MARGIN_HIGH
DAT[0]= 0x0F;
DAT[1]=0xFC;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC1_WRITE、DAC_REG_ADDR_DAC_MARGIN_HIGH、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC1上设置 MARGIN_LOW
DAT[0]= 0x00;
DAT[1]= 0x00;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC1_WRITE、DAC_REG_ADDR_DAC_MARGIN_LOW、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//设置 DAC1 GPIO 以触发方波
DAT[0]= 0x18;
DAT[1]= 0x00;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_DAC1_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//触发 NVM 写入操作。
DAT[0]= 0x00;
DAT[1]= 0x10;
HAL_I2C_ADDR_DAC1_WRITE Mem_Write、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
}
空 SetAlarmType()
{
uint8_t dat[2];
if (((ALARM_TYPE 和0x0F)== ALARM_HIGH)
{
if ((alarm_type 和0xF0)== 0)//hp alarm
{
//上电 DAC2,启用 VDD 基准
// CODE_STEP:8LSB、SLEW_RATE:204.8 μs x 1.75 = 358.4 μs (满量程的包络上升/下降时间:~26ms)
DAT[0]= 0x0A;
DAT[1]= 0x80;
HAL_I2C_AD_ Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_GENERAL_CONFIG、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//配置 DAC2 GPIO 以触发具有最小时间设置和触发条件的高优先级警报
DAT[0]= CONFIG2_GPI_CONFIG_MED_ALARM_HP >> 8;
DAT[1]=(uint8_t) CONFIG2_GPI_CONFIG_MED_ALARM_HP;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC2上设置 MARGIN_HIGH
DAT[0]= 0x0F;
DAT[1]=0xFC;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_DAC_MARGIN_HIGH、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC2上设置 MARGIN_LOW
DAT[0]= 0x00;
DAT[1]= 0x00;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_DAC_MARGIN_LOW、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//将触发寄存器中的 GPI_EN 设置为1b
DAT[0]= 0x04;
DAT[1]= 0x00;
HAL_I2C_ADDR_WRITE Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//触发 NVM 写入操作。
DAT[0]= 0x00;
DAT[1]= 0x10;
HAL_I2C_ADDR_WRITE Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (5);
SetGpiVal (0x03);
ALARM_TYPE |= 0x10;
}
否则//
{
}
}
if (((alarm_type 和0x0F)== alarm_medium)
{
if ((alarm_type 和0xF0)== 0)//
{
//上电 DAC2,启用 VDD 基准
// CODE_STEP:8LSB、SLEW_RATE:204.8 μs x 1.75 = 358.4 μs (满量程的包络上升/下降时间:~26ms)
DAT[0]= 0x0A;
DAT[1]= 0x80;
HAL_I2C_AD_ Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_GENERAL_CONFIG、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//配置 DAC2 GPIO 以触发具有最小时间设置和触发条件的中等优先级警报
DAT[0]=CONFIG2_GPI_CONFIG_MED_ALARM_MP >>8;
DAT[1]=(uint8_t) CONFIG2_GPI_CONFIG_MED_ALARM_MP;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC2上设置 MARGIN_HIGH
DAT[0]= 0x0F;
DAT[1]=0xFC;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_DAC_MARGIN_HIGH、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC2上设置 MARGIN_LOW
DAT[0]= 0x00;
DAT[1]= 0x00;
HAL_DELAY (1);
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_DAC_MARGIN_LOW、I2C_MEMADD_SIZE_8位、dat、2100);
//将触发寄存器中的 GPI_EN 设置为1b
DAT[0]= 0x04;
DAT[1]= 0x00;
HAL_I2C_ADDR_WRITE Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//触发 NVM 写入操作。
DAT[0]= 0x00;
DAT[1]= 0x10;
HAL_I2C_ADDR_WRITE Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (5);
SetGpiVal (0x03);
ALARM_TYPE |= 0x10;
}
否则//
{
}
}
if (((alarm_type 和0x0F)== alarm_medium)
{
if ((alarm_type 和0xF0)== 0)//
{
//上电 DAC2,启用 VDD 基准
// CODE_STEP:8LSB、SLEW_RATE:204.8 μs x 1.75 = 358.4 μs (满量程的包络上升/下降时间:~26ms)
DAT[0]= 0x0A;
DAT[1]= 0x80;
HAL_I2C_AD_ Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_GENERAL_CONFIG、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//配置 DAC2 GPIO 以通过最小时间设置和触发器触发低优先级警报
DAT[0]= CONFIG2_GPI_CONFIG_MED_ALARM_LP >> 8;
DAT[1]=(uint8_t) CONFIG2_GPI_CONFIG_MED_ALARM_LP;
HAL_I2C_CONFIG2 Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_CONFIG2、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC2上设置 MARGIN_HIGH
DAT[0]= 0x0F;
DAT[1]=0xFC;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_DAC_MARGIN_HIGH、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//在 DAC2上设置 MARGIN_LOW
DAT[0]= 0x00;
DAT[1]= 0x00;
HAL_I2C_DAC Mem_Write (&hi2c1、I2C_ADDR_DAC2_WRITE、DAC_REG_ADDR_DAC_MARGIN_LOW、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//将触发寄存器中的 GPI_EN 设置为1b
DAT[0]= 0x04;
DAT[1]= 0x00;
HAL_I2C_ADDR_WRITE Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (1);
//触发 NVM 写入操作。
DAT[0]= 0x00;
DAT[1]= 0x10;
HAL_I2C_ADDR_WRITE Mem_Write (&hi2c1、I2C_ADDR_BROAD_WRITE、DAC_REG_ADDR_TRIGGER、I2C_MEMADD_SIZE_8位、dat、2100);
HAL_DELAY (5);
SetGpiVal (0x03);
ALARM_TYPE |= 0x10;
}
否则//
{
}
}
if (((alarm_type 和0x0F)== alarm_none)
{
if ((alarm_type 和0xF0)== 0)//
{
SetGpiVal (0x00);
ALARM_TYPE |= 0x10;
}
}
}