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.

[参考译文] DAC8.0004万:DAC8.0004万

Guru**** 2535750 points


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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/635384/dac80004-dac80004

部件号:DAC8.0004万

大家好

我需要对DAC8.0004万进行编程方面的帮助。

我使用SPI总线与芯片通信。

我使用数据表 www.ti.com/.../dac8.0004万.pdf

我不会在芯片中写入和获取数据时遇到任何问题。

但我必须同时更新所有4个DAC通道。

我尝试设置并重置LDAC和SDO寄存器。

我在消息末尾尝试发送而不是发送LDAC信号。

我尝试在一次同步时发送两封邮件(2x4字节)。

我尝试在消息的中间发送LDAC信号,如第8页所述。

我尝试使用不同的命令位(0-3位D27-D24)。

所有这些都结合在一起。

每次在每条消息(4个字节)后更新数据时。

是否可以先在每个通道的每个缓冲区中写入数据,然后再进行更新???

正确程序的剂量是怎样的?

我的一个例程:(我测试的是没有LED指示灯的情况)

软件LDAC是我可以自己设置的字节

uINT8_t SPI_SEND_DATA (uint8_t V0,uint8_t v1,uint8_t v2,uint8_t v3)

 UINT8_t ret_wert=0;
 // ChipSelect自动
 cs (bit_reset);

 UB_SPI2_SendByte (V0);
 UB_SPI2_SendByte (v1);
 UB_SPI2_SendByte (v2);
 RET_wert=UB_SPI2_SendByte(v3);

   cs (bit_set);
   IF (软件LDAC == bit_set)
   {
      LDAC (bit_reset);
      LDAC (bit_set);
   }

   IF (软件LDAC == bit_set)
   {
      ub_led亮起(LED_绿色);
      ub_led关闭(LED_RED);
   }
   否则
   {
      ub_led关闭(LED_绿色);
      ub_led亮起(LED_RED);
   }

 返回ret_wert;
}

正在执行例程。dacCommand可以通过多种方式在其中进行更改。

   SPI_SEND_DATA (dacCommand,0x0F,0xFF,0xF0);
   Delayms(100);
   SPI_SEND_DATA (dacCommand,0x1F,0xFF,0xF0);
   Delayms(100);
   SPI_SEND_DATA (dacCommand,0x2F,0xFF,0xF0);
   Delayms(100);
   SPI_SEND_DATA (dacCommand,0x3F,0xFF,0xF0);
   Delayms(100);

初始化例程

0x08,0x00,0x00,0x02 :启用SDO, retval=0x2            
0x04,0xF0,0x00,0x0F :开机, retval=0x2
0x06,0xF0,0x00,0x0F :更新控件, retval=0x3e
0x1d,0x00,0x00,0x00 :正在读取状态寄存器, retval=0x7c
0x05,0x00,0x00,0x02 :清除模式寄存器, retval=0x0

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

    您似乎正在将初始化例程中的LDAC位设置为1,因此将忽略HW LDAC,并在向设备写入新值时自动更新DAC。 如果要使用同步更新,则需要将这些位设置为0。

    如果要使用硬件LDAC,则需要使用命令0x0 (D27-24)来更新每个DAC的缓冲区,然后声明LDAC引脚。 如果使用的是软件LDAC,则使用命令0x0更新3个DAC缓冲区,然后使用命令0x2更新最终DAC缓冲区并初始化SW LDAC。

    这将为您提供所需的同步更新。

    请告诉我这是否解决了您的问题,或者您还有其他问题。

    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这对我帮助不大,你有没有为我提供一些示例代码?

    这是我的代码,

    void software_reset (void)

    dbgMessage("DAC:软件重置");
    SPI_SEND_DATA (0x07,0x00,0x00,0x00);
    }

    void dac初始化示例来自因特网(void)

    uINT8_t rval=0;
    dbgMessage ("dac初始化实例从因特网");
    DELAY (1万);rval = SPI_SEND_DATA (0x08,0x00,0x00,0x02);//启用SDO -寄存器
    Sprintf (txBUF,"0x08,0x00,0x00,0x02:启用SDO,retval=0x%x",rval);dbgMessage (txBUF);

    DELAY (1万);rval = SPI_SEND_DATA (0x04,0xF,0x00,0x0F);//打开电源
    Sprintf (txBUF,"0x04,0xF0,0x00,0x00:开机,retval=0x%x",rval);dbgMessage (txBUF);


    DELAY (1万);rval = SPI_SEND_DATA(0x06,0xF0,0x00,0x00); //通过32下降边缘更新控制
    //delay(1万);rval = SPI_SEND_DATA(0x06,0xF0,0x00,0x0F); //通过32下降沿更新控制
    Sprintf (txBUF,"0x06,0xF 0,0x00,0x00:update control,retval=0x%x",rval);dbgMessage (txBUF);

    DELAY (1万);rval = SPI_SEND_DATA (0x1d,0x00,0x00,0x00);
    Sprintf (txBUF,"0x1d,0x00,0x00,0x00:正在读取状态寄存器,retval=0x%x",rval);dbgMessage (txBUF);

    DELAY (1万);rval = SPI_SEND_DATA (0x05,0x00,0x00,0x02);
    Sprintf (txBUF,"0x05,0x00,0x00,0x02:清除模式寄存器,retval=0x%x",rval);dbgMessage (txBUF);
    }

    作废LDAC_Clear (作废)

    dbgMessage("LDAC已清除");
    SPI_SEND_DATA (0x06,0x00,0x00,0x00);
    }

    void LDAC_Read(void)

    dbgMessage("LDAC Read");
    uINT8_t rval=255;
    rval=spi_send_data(0x16,0x00,0x00,0x00);

    // sprintf (string_BUF,"Reg 0x%0x:0x%02x DEZ:%04d bin:"BYTETOBINARYTERNY,I,I2C1_DATA[I],I2C1_DATA[I],BYTETOBINARY (I2C1_DATA[I]));

    Sprintf (txBUF,"LDAC寄存器的值:%i,二进制:"BYTETOBINARYPATTERN,rval,BYTETOBINARY (rval)";
    dbgMessage(txBUF);
    }

    void ub_led打开(LED_name_t led名称)

    ...您不需要仅用于调试
    }


    void dbgMessage(char* buf)


    printf等...您不需要该文件,只用于调试
    }


    无效delayms(Int32_t Time)


    //你不需要这个

    时间=时间* 8;
    而(1){
    如果(时间!=0)

    时间--;
    //IF ((Time % 10万)== 0) UB_USB_CDC_SendString(".",none);
    }
    否则

    返回;
    }
    时间++;时间--;
    }
    }




    void LDAC_action_set_signal()

    dbgMessage("LDAC操作");
    LDAC (bit_reset);
    LDAC (bit_set);
    }



    uINT8_t SPI_SEND_DATA (uint8_t V0,uint8_t v1,uint8_t v2,uint8_t v3)

    UINT8_t ret_wert=0;
    // ChipSelect自动
    cs (bit_reset);

    UB_SPI2_SendByte (V0);
    UB_SPI2_SendByte (v1);
    UB_SPI2_SendByte (v2);
    RET_wert=UB_SPI2_SendByte(v3);

    cs (bit_set);
    IF (软件LDAC == bit_set)

    LDAC (bit_reset);
    LDAC (bit_set);
    }

    IF (软件LDAC == bit_set)

    ub_led亮起(LED_绿色);
    ub_led关闭(LED_RED);
    }
    否则

    ub_led关闭(LED_绿色);
    ub_led亮起(LED_RED);
    }

    返回ret_wert;
    }




    //****************************************************************************************
    我正在呼叫的例行程序

    void D43_example()

    software_reset();
    dac初始化示例从因特网();
    LDAC_Clear();
    LDAC_READ();

    dacCommand = 0x00;

    ub_led亮起(LED_blue);
    dbgMessage("DAC Channel to zero");
    SPI_SEND_DATA (dacCommand,0x00,0x00,0x00);
    Delayms(100);
    SPI_send_data(dacCommand,0x10,0x00,0x00);
    Delayms(100);
    SPI_send_data(dacCommand,0x20,0x00,0x00);
    Delayms(100);
    SPI_send_data(dacCommand,0x30,0x00,0x00);
    Delayms(500万);
    ub_led关闭(LED_blue);
    LDAC_ACT_ACT_SET_SIGNAL();

    Delayms(500万);

    dbgMessage("DAC Channel to Maximum");
    ub_led亮起(LED_blue);
    SPI_SEND_DATA (dacCommand,0x0F,0xFF,0xF0);
    Delayms(100);
    SPI_SEND_DATA (dacCommand,0x1F,0xFF,0xF0);
    Delayms(100);
    SPI_SEND_DATA (dacCommand,0x2F,0xFF,0xF0);
    Delayms(100);
    SPI_SEND_DATA (dacCommand,0x3F,0xFF,0xF0);
    Delayms(500万);
    ub_led关闭(LED_blue);
    LDAC_ACT_ACT_SET_SIGNAL();
    dbgMessage("D43_example() finished");
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Vodi,

    DAC是否不同时更新? 我认为您的代码没有任何问题,但您可以尝试检查您的时间,因为我没有看到CS或LDAC断言中的任何延迟。 有关LDAC引脚(特别是TD4和tW4)的最小定时要求,请参见DAC8.0004万数据表中的图1。

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

    工作原理:
    清除"LDAC寄存器"(0x6位D27-D24)
    在评估板上释放JP6
    -将SDO转至零(SDO=1仅用于读取)
    使用command=0x0 (0x0 bit D27-D24)“Update to buffer n”写入DAC值
    -按照手册中的说明发送LDAC脉冲,以便在写入预期值后更新所有DAC

    -如果其不工作,请检查CS和LDAC信号和定时,一些 µC会在完成向DAC传输数据之前发送CS-Impulse

    同时检查信号质量miso MOSI等

    同时检查SPI-Bus和Oszi上的CPOL CPHA

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

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

    任何有关此案例的更新,我都面临相同的问题。

    此致。