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.

[参考译文] DAC81404EVM:无法设置 DAC 输出寄存器

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1043044/dac81404evm-cannot-set-dac-output-registers

器件型号:DAC81404EVM

您好、TI、

我有 DAC81404EVM 板以及 MSP-EXP432E401 Launchpad。 但是、当我无法获得 DAC 输出并且不确定我是否可以读取/写入寄存器后、由于@Parsath's library、我切换到了 ESP32

https://github.com/sphCow/DAC81404_lib/blob/main/main.cpp

当我读取寄存器时,我将得到以下结果:  

0x00 : 0
0x01 : A70
0x02 : 8
0x03 : A86
0x04 : 4000
0x05 : F
0x06 : 0
0x07 : 0
0x08 : 0
0x09 : FFF0
0x0A : 0
0x0B: 0
0x0C : 0
0x0D : 0
0x0E : 0
0x0F : 0
0x10 : 0
0x11 : 0
0x12 : 0
0x13 : 0


在这里、您可以看到内部基准寄存器(0x04)处于 false (0x4000)状态。 当我检查 TP11时、它是0伏。 当我将0x04 (内部基准寄存器)更改为 true 时、我可以看到0x04寄存器更改为0x00、我可以在 TP11上看到2.5V。 我理解的是,我可以成功地写入和读取寄存器(我对吗?)。 除了 Parswa 的库之外、我将 SPIMODE0更改为 SPIMODE2以读取/写入寄存器。  

我的问题是我无法设置寄存器0x09 (上电通道)、0x0A (DAC 范围)、也无法写入 DAC 值。 当我尝试写入0x09时,我只能使通道0加电(0xFFF0),正如上面所见,但在这种情况下,我也无法为通道0设置 DAC 范围和 DAC 值(通道0是 DAC 输出 A,对吧?)。 对于其他通道、我无法使其通电。 请帮我解决这个问题。

此致

Fatih

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

    您好、我们相信、

    DACPWDWN 寄存器(0x09)使用最后4位为通道加电。 0xFFF0表示所有通道都已加电(最后4位都为零)。 DACRANGE 和 DACn 数据寄存器是只写的、这意味着您不能读回它们。 您可能已成功写入。  

    EVM 上的跳线设置是什么?

    CLRZ (J3)跳线是开路还是闭合?  

    如果内部基准断电、如何为外部基准供电?

    最棒的

    Katlynne Jones

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

    您好 Katlynne;

    这是我的主板图片:  

    您可以看到跳线(它必须是其默认位置)。 J3处于打开位置。

    下面的连接器是 J17。 我将其第一个引脚连接到5V。 第2和第3引脚至 GND。 第四个引脚连接到 AVDD、此时电压为12V。 和第5个引脚接地。

    当我检查测试引脚 TP1、TP2或 TP3时、我无法看到电压(0伏)。 我将不同的值写入 DAC 输出寄存器(0x10、0x11、0x12、0x13)。  

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

    您好、我们相信、

    您似乎已将 CLR 和 RST 连接到您正在使用的控制器。 这些信号的电压电平是多少? 它们应该为高电平、或者 DAC 输出可以被清除或者一个器件复位被触发。

    最棒的

    Katlynne Jones

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

    您好 Katlynne;

    CLR 和 LDAC 电缆未连接到我的控制器。 如果您愿意、我可以连接并更改它们的电平。

    我们在 代码的初始阶段使用 RST。

     pinMode(_rst_pin, OUTPUT);
     digitalWrite(_rst_pin, LOW);
     delay(1); 
     digitalWrite(_rst_pin, HIGH); 
     delay(1);

    它的最新引脚电平是高电平。

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

    您好、我们相信、  

    如果您没有连接 CLR 和 LDAC 信号、则 会将它们上拉至 EVM 上的 DAC_IOVDD、这很正常。 您可以使用仪表验证这些信号是否为高电平、以确保正常。  

    如果内部基准断电、如何为外部基准供电? 您似乎已将 J16开路、这意味着板载2.5V 基准未连接 到 VREF。

    最棒的

    Katlynne Jones

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

    您好 Katlynne、

    我已检查 CLR 和 LDAC 引脚。 CLR 引脚为高电平、但 LDAC 为低电平、根据默认跳线设置、我知道这是可以的。  

    我真的不明白基准电压问题、您能不能明确我应该怎么做?

    我所做的是、我通过 J17为电路板供电、正如我在上面提到的那样。 我在 J16短路或内部基准通过寄存器0x04激活的情况下测试了电压。 但我无法获取任何 DAC 输出电压。

    此致

    Fatih

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

    您好、我们相信、

    我认为您使用自己的控制器进行 SPI 通信。 您能否共享 SPI 信号的编程代码和快照。 我想查看序列。

    您能否正确读取和写入寄存器?

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

    您好、Anbu、

    是的、我可以按照我的理解正确读取和写入 SPI 寄存器。 如上所述、我可以读取器件 ID 和其他寄存器。 此外、我可以将 GENCONFIG (0x04)读取为0x4000。 当我更改(0x04)并写入0x0000时、我可以将寄存器读取为0x0000、当我检查 TP11时、我可以在更改寄存器之前看到2.5V、即0伏。 因此、我可以更改寄存器0x04、并将电压基准从外部更改为内部。 此外、寄存器 DACPWDWN (0x09)起始为0xFFFF、我可以通过启用通道将其更改为0xFFF0。 这意味着我对寄存器进行写入和读取。

    作为编程代码,我使用 Parsath's library https://github.com/sphCow/DAC81404_lib/blob/main/main.cpp 。 唯一的区别是我将 SPI 模式从 SPIMODE0更改为 SPIMODE2。 我 可以很肯定的快照 SPI 相关器件。

    #define DAC_CS 5
    #define DAC_RST 22
    #define DAC_LDAC 12
    #define DAC_CLR 14
    
    DAC81404 dac(DAC_CS, DAC_RST, DAC_LDAC, &SPI, 30000000);

    int res = dac.init();
    dac.set_int_reference(false);

     dac.set_ch_enabled(0, true);
      dac.set_ch_enabled(1, true);
      dac.set_ch_enabled(2, true);
      dac.set_ch_enabled(3, true);

    dac.set_range(0, DAC81404::U_10); //   0 -> +10V
      dac.set_range(1, DAC81404::U_10);  //  -5 -> +5V
      dac.set_range(2, DAC81404::U_10);  //   0 -> +6V
      dac.set_range(3, DAC81404::U_10); // -10 -> +10V

    dac.set_out(0, (i)%65535 );
      delayMicroseconds(5);
      dac.set_out(1, (2*i)%65535 );
      delayMicroseconds(5);
      dac.set_out(2, (3*i)%65535 );
      delayMicroseconds(5);
      dac.set_out(3, (4*i)%65535);
    

    很抱歉出现代码捕捉。 我无法将整个代码复制并粘贴到一个代码对齐中。 我总是得到错误:  

    访问被拒绝
    您无权访问此服务器上的"">e2e.ti.com/.../configure。
    参考#18.82a0de52.1634014275.28ee01c2

    对于 SPI 或 DAC 初始化器件、您可以检查 Parswa 的库。 我尝试复制并粘贴到这里、但由于上面的错误、看起来很糟糕。 我只更改了 Parswa 库中的 SPI 模式。

    顺便说一下、当我们也使用 launchpad 时、我们无法获得 DAC 输出。 我可以从 SPI 获取相同的读数。 电路板上是否存在与硬件相关的问题? 我们如何检查它?

    此致

    Fatih

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

    您好、我们相信、

    原始库似乎具有循环写入的 DAC 数据寄存器:

    uint16_t i = 0;
    bool done = true;
    
    void loop() {
      dac.set_out(0, (i)%65535 );
      dac.set_out(1, (2*i)%65535 );
      dac.set_out(2, (3*i)%65535 );
      dac.set_out(3, (4*i)%65535);
    
      i = (i+64)%65535;  
      delayMicroseconds(1);
    
      
      /*
      if(millis()>10000 && done) {
        dac.set_ch_enabled(2, false);
        Serial.println("ch 2 shutdown");
        for(int i=0; i<4; i++) Serial.printf("ch %d power -> %d\n", i, dac.get_ch_enabled(i));
        Serial.println();
        done = false;
      } */
    
    }

    在您共享的代码段中、您对我有何价值?  

    谢谢、

    Katlynne Jones

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

    您好 Katlynne、

    是的、它与您共享的代码在库中相同、我的代码也在循环中运行。 由于出现 “Access Denied (拒绝访问)”错误,我无法像您一样共享代码。

    此致

    Fatih

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

    您好、我们相信、  

    我们能否 简化代码、将一个 DAC 输出设置为满量程(0xFFFF)、而不是在循环中写入。 确保通过寄存器0x04启用内部基准、并将跳线 J16开路以断开外部基准。 将 ***.(0x03)设置为0、并禁用代码中的读取功能。 将 DACPWDWN 寄存器(0x09)设置为0xFFF0。  

    如果您可以发送 SPI 帧的示波器快照、也会很有帮助。 我认为 SPIMODE 2是正确的、但我最近遇到了一个问题、即有人将器件设置为错误模式、仍然能够 打开和关闭内部基准、但无法更新 DAC 输出。 验证 SPI 是否正常工作将很有帮助。

    您是否还可以尝试移除 J2以将 LDAC 引脚拉高?  

    是否在 J20外部应用外部 IOVDD? 跳线 J19的位置是什么?  

    谢谢、

    Katlynne Jones  

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

    您好 Katlynne、

    我简化了以下代码:  

      dac.write_reg(0x03, 0x0000);
      dac.write_reg(0x04, 0x0000);
      dac.write_reg(0x09, 0xFFF0);
      dac.write_reg(0x0A, 0x1111);
    
      dac.write_reg(0x10, 0xFFFF);
      dac.write_reg(0x11, 0xFFFF);
      dac.write_reg(0x12, 0xFFFF);
      dac.write_reg(0x13, 0xFFFF);

    当我这么做时、我可以在 DAC 输出上获得3.8V 电压。 如果我循环执行下面的代码:  

      dac.write_reg(0x10, 0xFFFF);
      dac.write_reg(0x11, 0xFFFF);
      dac.write_reg(0x12, 0xFFFF);
      dac.write_reg(0x13, 0xFFFF);
    
      delay(1000);
    
      dac.write_reg(0x10, 0x0);
      dac.write_reg(0x11, 0x0);
      dac.write_reg(0x12, 0x0);
      dac.write_reg(0x13, 0x0);
    
      delay(1000);

    我可以看到电压输出在3.8V 和0V 之间持续变化。

    如果我通过将0x4000写入0x04寄存器将内部基准更改为外部基准、并将跳线插入 J16、我会得到相同的结果、即从3.8V 持续变为0V (我正在向 J17 (AVDD)的第4个引脚提供12V 电压)。  

    但是、如果我尝试写入除0xFFFF 和0x0000之外的 DAC 输出值(0x10、0x11、0x12、0x13)、则无法从 DAC 输出获取任何电压输出。 在启动时、我将 DAC 输出值更改为 0xFFFF、我可以获得3.8V 的输出。 然后、我将寄存器值更改为0x1000、DAC 输出值变为0V。 之后、我尝试再次将其更改为0xFFFF、但无法再获得0V 的任何电压输出

    我不通过 J20提供外部 IOVDD、J19的跳线位置默认为(2-3)。 您可以从上图中检查跳线状态。

    插入或移除 J2跳线不会改变位置。

    我尝试获取 SPI 帧的示波器快照、但在此之前、我想告诉您最新的情况、以便您从这些结果中获得一些线索。

    此致

    Fatih

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

    大家好、Katlynne、

    我添加了 SPI 帧、就像我在上面说的那样。

    我使用的代码为:  

    dac.write_reg(0x03, 0x0000);
      dac.write_reg(0x04, 0x0000);
      dac.write_reg(0x09, 0xFFF0);
      dac.write_reg(0x0A, 0x1111);
    
      dac.write_reg(0x10, 0xFFFF);
      dac.write_reg(0x11, 0xFFFF);
      dac.write_reg(0x12, 0xFFFF);
      dac.write_reg(0x13, 0xFFFF);

    我获得了 SPI 帧、用于写入 DAC 输出寄存器(0x10、0x11、0x12、0x13)值0xFFFF  

    频道1:CS

    通道2:SDO

    通道3:SDIN

    通道4:CLK

    第一张图片是写入4个 DAC 输出寄存器的帧。 (0x10、0x11、0x12、0x13)

    第二幅图片是写入2个 DAC 输出寄存器(0x10、0x11)的帧

    第三幅图片是写入单个 DAC 输出(0x10)的帧

    但愿这对您有所帮助。

    此致

    Fatih

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

    您好、我们相信、

    它看起来不像捕获了完整的 SPI 帧。 我在通道4上看不到完整的24位时钟。

    您似乎不符合 SPI 时序要求。 当您写入0xFFFF 时、线路中的数据保持高电平、因此如果您不满足时序要求、某些"1"位可能 会被捕获、某些位可能会被跳过、这就是为什么您看到3.8V 的原因。 您能否尝试降低时钟速度以查看这是否有帮助?  

    如果您有一个示波 器可以捕获整个 SPI 时钟和时间刻度、以便我们验证时序、那么这将很有帮助。 如果执行此操作、请尝试捕获0xFFFF 和0xAAAA 写入。 0xAAAA 将让我们看到线路中的数据切换位。

    谢谢、

    Katlynne Jones

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

    您好 Katlynne、

    我检查了 SPI 时钟频率、并发现还有一个0 (我设置30MHz 而不是3MHz)。 很抱歉犯了一个愚蠢的错误:( 当我减少它的时候,我可以看到24位时钟。

    关于 DAC 输出范围、我还有一个问题。  在我将电压基准设置为外部(将0x4000写入0x04)后、当我将 DAC 输出电压设置为0x0000时、我可能会得到0V、 0x1111 I 可以得到0.66V、0x5555 I 可以得到3.33V。但当我设置0xAAAA 或0xFFFF 时、我得到3.93V。设置十六进制0xA6FE (十进制42750)后、我始终得到相同的结果。 我得到的电压不能超过3.93伏。 我将 DAC 范围设置为0-10V (将0x1111写入0x0A)并短路 J16。 I 为 AVDD (J17引脚4)提供12V 电压、并为引脚5提供 GND。

    当我将电压基准更改为内部(将0x0000写入0x04)时、结果是相同的。 当我将 J11位置从2-3更改为1-2时、我可以得到0xAAAA 和0xFFFF 的6.53V 电压。   设置十六进制0xA6FE (十进制42750)后、我始终得到相同的结果。  我得到 的电压不能超过6.53伏。  

    这是0xAAAA 到0x10的 SPI 帧:  

    我认为有关寄存器或跳线的配置有误、但我不确定。

    此致

    Fatih

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

    您好、我们相信、

    IOVDD 为3.3V 时、最大 SPI SCLK 频率为50MHz。  但现在、让我们尝试使用3MHz SCLK 获得完整的10V 范围。 感谢您提供示波器屏幕截图、SPI 模式看起来是正确的。 在之前的答复中、您提到 J17 引脚1连接 到5V、第二和第三引脚连接到 GND、第四引脚连接到 AVDD (12V)、第五引脚连接到 GND。 第5个引脚是 AVSS、因此 J11的位置不应该重要。 J11的选项包括 AVSS (您已接地)或 GND。  

    似乎跳线设置正确。 寄存器 设置 看起来是正确的。 高达0xA6FE (6.53V)、我们可以看到正确的电压电平。 这似乎是一个余量问题。

    DAC 通道输出上是否有任何负载? 或者您只是使用示波器进行测量? 如果存在较大的负载、则余量要求 会增加:

    12V AVDD 是什么类型的电源?  

    如果可能、您能否在增大 DAC 代码时测量通过输出和 AVDD 的电流、并确保在增大 DAC 代码时12V 电源保持在12V。

    另一项测试可能是增加 AVDD 并保持范围不变。 如果存在余量问题、则增大 AVDD 应使您看到大于6.53V。

    最棒的

    Katlynne Jones

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

    您好 Katlynne、

    我们找到了问题。 这是接地问题。 我们使用通道1为 EVM 供电、使用通道2为 AVDD 供电。 当我们连接它们的接地端时、我们可以读取正确的 DAC 输出值。 感谢您的大力支持和耐心。

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

    您好、我们相信、

    很高兴听到! 如果您遇到更多问题、请告诉我。  

    最棒的

    Katlynne Jones