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.

[参考译文] DAC8775EVM:如果我意外地反向连接 DVDD、会发生什么情况

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1529703/dac8775evm-what-happens-if-i-accidentally-connected-dvdd-in-reverse

器件型号:DAC8775EVM
主题中讨论的其他器件:DAC8775

工具/软件:

所有分流器均默认连接、我错误地从 NUCLEO-F072RB 以反极性连接到 J4、J4-1。 我立即纠正了这个问题、即使根据数据表正确配置了寄存器、我似乎也无法让通道 A 输出 10V。

我目前拥有:


void dac8775_Write(uint8_t cmd、uint16_t 数据);

dac8775_SetVoltage(uint8_t 通道,浮充电压);


dac8775_Write (0x03、0x0020);

dac8775_SetVoltage (0、10.0f);

我有什么问题吗? 或者电路板是否永久损坏? 我对此仍然是新手、因此、我希望提前提供任何帮助。

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

    Muhammad、

    我不确定 EVM 是否已损坏、但我们可以检查器件是否正在响应。 最简单的方法是在原始配置中使用 EVM。 我会将软件 GUI 与 SM-USB-DIG 一起使用、并通过 USB 将其连接到计算机。 使用 EVM GUI 还会显示设置 DAC 输出所需的配置。 如果您有 GUI、可以在几分钟内完成此设置、以测试 EVM 是否仍在工作。

    对于此器件、您应该确保 EVM 具有电源 (PVDD/AVDD 的标称值为 12V)。 使用 GUI、我会启用降压/升压数据转换器、启用基准、设置 DAC 范围、然后启用输出。 设置数据代码只需更改 DAC 输出。

    如果您继续使用自己的 MCU 控制、那么我仍然要确保已连接电源。 我想验证您使用的 SPI 模式。 我还会读回寄存器以确保写入完成。 按照我上面列出的相同配置序列进行操作。

    Joseph Wu

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

    您好、Joseph:

    感谢您的快速答复。 反复使用 GUI 后、我注意到可以获得所需的 0V 至 5V 和 0V 至 10V 输出。

    此外、除非我未正确连接 DMM、否则我似乎无法在任何通道上读取 20mA? 我遵循了 7 年前 Breadboard 制作的 DAC8775EVM YouTube 视频中的步骤、但尽管如此、我似乎无法获得当前值。  

    此时此刻、我希望作出一些澄清。

    1) 根据 DAC8775 的数据表、在/SYNC 变为低电平之前、SCLK 的状态无关紧要、那么我是否正确设置 CPOL = 0、CPHA = 1(第二个转换边沿)?

    2) 如何设置 DAC8775EVM 上的电流输出?

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

    Muhammad、


    1.在/SYNC 变为低电平之前,SCLK 的状态应该是正确的。 该器件寻找 SCLK 下降沿进行转换。 在这种情况下、CPOL=0 和 CPHA=1 用作 SPI 模式。

    2.将器件用作电流输出 DAC 应该与正确设置范围一样简单。 这将是 0x04 处配置 DAC 寄存器中的 RANGE[3:0]。 如果您在测量电流时遇到问题、则可能是设置问题。 通常、我只是将输出设置为具有特定的负载、也许可以通过通道 A 上的 249Ω 电阻器 JP18 使用。然后、您只需测量 VOUT 处的电压即可验证电流。 您还可以将万用表用作电流表、并通过将输出端与地短接(通过万用表)来测量电流。 如果要在将该器件用作电流或电压输出之间进行交换、DAC8775 会在整个电压范围内难以驱动如此低的电阻。

    如果您从电压范围切换到电流范围、则需要再次设置 DAC 代码、可能需要再次启用 DAC 输出。


    Joseph Wu

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

    您好、Joseph:

    感谢您的答复。 我遵循了您在 2.中的建议、我设法获得了 20mA 输出。 我有一个最后的疑问要澄清,这是我需要通过 STM32CubeIDE 发送到 DAC 的配置数据。 我 是否可以确认需要一次发送 24 位(8 位地址、16 位数据)到 DAC、或者是否 单独发送数据?
    例如、我遵循 DAC8775 数据表 8.4.3 写入操作、目前我有:

    CS_EN ();

    uint8_t RESET_REG[3]=0x010x000x01

    HAL_SPI_TRANSMIT (&hspi2RESET_REG、3、HAL_MAX_DELAY)

    HAL_DELAY (50)

    uint8_t RESET_CFG_REG[3]=0x02、0x01、0x01;//启用内部参考且 UBT = 1

    HAL_SPI_TRANSMIT (&hspi2RESET_CFG_REG3HAL_MAX_DELAY)

    HAL_DELAY (50)

    uint8_t SBB_A[3]=0x060x000x01;//设置降压/升压 A

    HAL_SPI_TRANSMIT (&hspi2、SBB_A、3、HAL_MAX_DELAY)

    HAL_DELAY (50)

    Uint8_t CFG_BB_A[3]=0x070x000x03;//配置降压/升压 A

    HAL_SPI_TRANSMIT (&hspi2、CFG_BB_A、3、HAL_MAX_DELAY)

    HAL_DELAY (50)

    uint8_t SEL_CHANNEL_A[3]=0x030x000x02;//选择通道 A

    HAL_SPI_TRANSMIT (&hspi2、SEL_CHANNEL_A、3、HAL_MAX_DELAY)

    HAL_DELAY (50)

    uint8_t CFG_CHANNEL_A[3]=0x04、0x00、0x01;//将通道 A 配置为输出 0-10V

    HAL_SPI_TRANSMIT (&hspi2、CFG_CHANNEL_A、3、HAL_MAX_DELAY)

    HAL_DELAY (50)

    while (1)

    Uint8_t DATA_A[3]=0x050xFF、0xFF;// 10V 的最大值、输入 while 循环以使 10V 保持活动状态

    HAL_SPI_TRANSMIT (&hspi2、data_A、3、HAL_MAX_DELAY)

    }

    但我无法 从通道 A 获得所需的 10V 电压。按照 EVM 数据表、我还移除了分流器 JP9 并对 JP11 进行分流、因为我正在使用 MCU 为 J4-2 处的 DVDD 供电。

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

    Muhammad、


    是的、与器件的通信应针对每个帧发送 24 位通信、其中 8 位用于寄存器地址、16 位用于数据。

    快速查看您的代码、我认为我看到了三个错误。 首先、向 0x02 写入以启动内部基准电压应为 0x0011、而不是 0x0101。 其次、写入 0x03 以选择 DAC 应使用 0x0020 而不是 0x0002。 这将选择通道 A 进行操作。 第三、配置 DAC 对 0x04 的写入还应包括使用 OTEN 位启用 DAC 输出。 对寄存器的写入应是 0x1001、而不是 0x0001。

    我认为这些变化应该会得到正确的输出。 如果没有、我会尝试从寄存器读回以验证写入。 此外、查看与逻辑分析仪的通信以验证 SPI 可能会有所帮助。 它还有助于检查寄存器位、以查看一组时钟脉冲中的所有数据。


    Joseph Wu

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

    您好、Joseph:

    感谢您更正我的错误。 我已 通过示波器获得正确的传输读数、但仍然没有 10V 输出。  根据其他论坛帖子、我还在 TP1 和 TP2 处检查了 VPOS_A 和 VNEG_A、这为我提供了相对于 GND 的 3.3V 和 0.139V 电压、而 JP1 和 JP2 位于 1-2 位置。

    1) 因此,我尝试从寄存器获取读数,以查看 DAC 是否实际接收数据。 对于读取操作、以下代码行是否正确?

    我所做的是向状态寄存器 UBT = 1 写入、并通过让 MSB = 1 来发送读取操作、接下来的 7 位是预期地址 (0x0B)、这将提供我 0x8B。 但是、在运行我的发送接收器之后、我在发送 NOP 命令时没有看到来自 MISO (SDO) 的波形。

    2) 此外、我想确认 DAC8775EVM 用户指南 2.5.1 通信测试点中指示的哪些测试点已连接到我的 NUCLEO MCU 电路板的 GPIO 输出? 我目前连接了所有这些器件、我想知道 LDAC、CLR 或 RESET 是否会影响它们、因为我在代码中未使用它们。

    3) 我还尝试在 SPI 配置中使用硬件 NSS 输出信号、以防 CS 时序影响读取操作(我是逐行运行程序)、但问题仍然存在。



     CS_EN();
     uint8_t write_2_status[3] = {0x0B, 0x10, 0x40};
     HAL_SPI_Transmit(&hspi2, write_2_status, 3, HAL_MAX_DELAY);
     CS_DIS();
     
     CS_EN();
     uint8_t read_tx[3] = {0x8B, 0x00, 0x00};
     HAL_SPI_Transmit(&hspi2, read_tx, 3, HAL_MAX_DELAY); // read status reg command
     HAL_Delay(1);
     CS_DIS();
      
     CS_EN();
     uint8_t no_op[3] = {0x00, 0x00, 0x00}; // No Op
     uint8_t rx[3] = {0,0,0};
     HAL_SPI_TransmitReceive(&hspi2, no_op, rx, 3, HAL_MAX_DELAY); // No Op
     CS_DIS(); 
     

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

    Muhammad、


    代码看起来不错,但我不是一个经验丰富的程序员,所以我可能会想念东西。 代码看起来像是将写入命令发送到 0x0B、并将 0x1040 作为数据。 随后、开始读取寄存器的 0x8B、后跟 0x0000 作为空间占位符。 则实际读取操作通过 NOP 的发送进行。

    从理论上讲、这看起来是可以的。 但是、我认为最好始终查看每个 SPI 波形的传输 (SCLK、DIN、DOUT、CS) 以检查通信是否正确。 您能否使用逻辑分析仪或 4 通道示波器发布波形图? 这可能是最快的调试方法、尤其是因为没有得到输出响应。

    如果您使用不同的微控制器设置 SPI、则可以使用第 2.5.1 节中所示的测试点与器件进行通信。 只需记住名称位于每个测试点的底部(最好将其标记在侧面以更好地阅读)。 我还建议、为了进行调试、将 EVM 设置回默认设置会更容易、使用 SM-USB-DIG 并使用 GUI 与器件通信。 已对其进行了正确设置、您可以使用逻辑分析仪来查看 SPI。 这样、您可以将通信用作模板来比较与器件的通信。

    我假设硬件 NSS 输出信号是 STM32 的/SS、您已将其替换为一些 GPIO 以设置等效信号。 同样、我只需使用逻辑分析仪来检查 SPI。


    Joseph Wu

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

    您好、Joseph:

    与 GUI 和 MCU 的信号进行比较后、我可以确认写入是有效的、但出于某些原因、读取 (MISO) 回传了之前的时钟写入 (MOSI  )、例如、我将写入发送 (0x08B、0x00、0x00、0x00  )、然后当 我发送 NOP (0x00、0x08B) 时、MISO 显示 (0x08B、0x00、0x00、0x00)、而不是先前设置的默认值 (0x0B、0x40、UBT = 1)。 此外、当使用 GUI 时、我的 VPOS_A = 15V、但当我使用 MCU 时、VPOS_A 显示 3.3V。 什么是我的缺失? 从 SM-USB-DIG 到 MCU、我仅更改了 JP9(开路)和 JP13(分流)、如用户指南中所述、但无其他更改。

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

    Muhammad、

    从功能上讲、使用 GUI 与使用您自己的 MCU 之间确实应该没有任何区别。 如果您返回 0x0000 进行读取、而不是默认值或写入值、我想您仍然遇到了传输问题。 当您将器件设置为电压输出模式时、VPOS_IN_A 显示的不是+15V 的东西、我会说写入没有正确、从而导致写入错误。

    您能否发布从 MCU 写入器件的示波器照片? 然后发布 SPI 以进行同一寄存器的读回。


    Joseph Wu

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

    Muhammad、

    我确实检查了设置、如果未启用降压/升压转换器、您将在 VPOS_IN_x 节点上获得大约 3V 的电压。   启用正降压/升压后、您会看到节点变为大约 4.2V。 根据您的设置、设备不会从您的 MCU 接收数据。

    因为它易于监控、我只专注于一个特定的通信以启用内部基准。 您可以测量电路板 TP17 上的内部基准电压、当它启动时、其读数应为 5V。  

    同样、我会发布 SPI 通信的示波器屏幕截图或逻辑分析仪图像、只是为了进行此通信。 我将仅通过向器件写入数据来开始测试通信。 (我认为这只是简单地写入 0x020010)

    Joseph Wu

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

    您好、Joseph:  

    我已设法获得 10V 输出! 在浏览完您提到的所有要点后、我尝试将/SYNC 更改回软件、并在写完之后每行进行切换。 结果表明、每次写入 DAC 后切换 CS 所需的一切时间。 感谢您提供的所有提示和建议。 下面随附了我的 10V 输出的工作代码、以供将来参考。

     CS_DIS();
    
      HAL_GPIO_WritePin(GPIOC, DAC_RESET_Pin, GPIO_PIN_SET); // Set RESET pin to 'HIGH' (active low)
      HAL_GPIO_WritePin(GPIOC, DAC_LDAC_Pin, GPIO_PIN_SET);  // Set LDAC pin to 'HIGH' (active low)
      HAL_GPIO_WritePin(GPIOC, DAC_CLR_Pin, GPIO_PIN_RESET);   // Avoid clearing outputs
      HAL_Delay(10);  // Wait for device to come out of reset
    
      __HAL_SPI_ENABLE(&hspi2);
    
      printf("Sending DAC8775 Config...\r\n");
    
      CS_EN();
    
      uint8_t no_op[3] = {0x00, 0x00, 0x00}; // No Op
    
      uint8_t reset_reg[3] = {0x01, 0x00, 0x01};
      HAL_SPI_Transmit(&hspi2, reset_reg, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t reset_cfg_reg[3] = {0x02, 0x00, 0x10};  // enable Internal ref
      HAL_SPI_Transmit(&hspi2, reset_cfg_reg, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t set_bb_A[3] = {0x06, 0x00, 0x01}; //set Buck Boost A
      HAL_SPI_Transmit(&hspi2, set_bb_A, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t cfg_bb_A[3] = {0x07, 0x00, 0x03}; //configure buck boost A
      HAL_SPI_Transmit(&hspi2, cfg_bb_A, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t sel_channel_A[3] = {0x03, 0x00, 0x20}; // select channel A
      HAL_SPI_Transmit(&hspi2, sel_channel_A, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t cfg_channel_A_10V[3] = {0x04, 0x00, 0x01}; // configure channel A to output 0-10V
      HAL_SPI_Transmit(&hspi2, cfg_channel_A_10V, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t cfg_channel_A_ENO[3] = {0x04, 0x10, 0x01}; // enable output
      HAL_SPI_Transmit(&hspi2, cfg_channel_A_ENO, 3, HAL_MAX_DELAY);
      HAL_Delay(1);
    
      CS_DIS();
    
      CS_EN();
    
      uint8_t data_A[3] = {0x05, 0xFF, 0xFF}; // Half value = 5V
      HAL_SPI_Transmit(&hspi2, data_A, 3, HAL_MAX_DELAY);
    
      CS_DIS();