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:无法生成医用警报波形

Guru**** 2380450 points
Other Parts Discussed in Thread: DAC53701
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1298077/dac53701-dac53701-cannot-generate-medical-alarm-wave

器件型号:DAC53701

我使用一个 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;




  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我想先确认几件事。 您提到您可以更改第二个器件的 I2C 地址。 您是否通过从该器件读回某些寄存器来确认此功能正常工作?

    您是否尝试过使用 DAC-DATA 寄存器将直流电压设置为任一 DAC 输出? FB 引脚好像通过电阻器连接到了接地或 VCC。 FB 引脚需要连接至 OUT 引脚。 这可能是您没有看到任何输出的原因。 如果未连接这些元件、则输出放大器处于开环状态:

    此致!

    K·琼斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦,谢谢,我会尝试的  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    如果您仍遇到问题、请尝试告知我。  

    此致!

    K·琼斯