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.

[参考译文] DAC81416EVM:无法突然读取/写入寄存器

Guru**** 2466550 points
Other Parts Discussed in Thread: DAC81416

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1360567/dac81416evm-unable-to-read-write-registers-suddenly

器件型号:DAC81416EVM
主题中讨论的其他器件:DAC81416

大家好!

我正在 处理一个项目、我尝试通过 SPI 通信使用 Arduino UNO R3控制 DAC81416芯片。 浏览过这些论坛后、我成功建立了通信和读/写寄存器。 但是、我在使用 DAC 时遇到了一些我无法解决的问题。

问题:

  • 虽然写入/读取操作工作正常、但我无法更改 DAC 输出、这可能是编程错误。  
  • 在尝试找出问题时、我最终遇到了所有寄存器开始返回0x0000 而不是其预期值的情况。 我尝试恢复对代码的任何更改、但这未解决问题。
  • 现在、读取寄存器返回0xFFFF、而不是0x0000。

设置:

电源配置:

  • J7.3:GND
  • J7.4和 J7.5:5V 电源
  • J7.7:12V 电源

跳线配置:

  • J2:开路
  • J3:开路
  • J9:关闭
  • J10:2-3
  • J11:1-2
  • J12:1-2

SPI 引脚:

  • J8.2:CS (Arduino 引脚10)
  • J8.3:SDI (Arduino 引脚12)
  • J8.4:SDO (Arduino 引脚11)
  • J8.8:SCLK (Arduino 引脚13)
  • J8.7:5V 电源

SPI 设置:

  • SPI 时钟频率:4 MHz
  • SPI 模式:CPOL = 0并且 CPHA = 1
  • SPI 数据顺序:MSBFIRST

采取的故障排除步骤:

  1. 已重新检查连接并已验证电路板测试点上的电压。
  2. 已尝试使用软件和硬件方法复位 DAC、但未成功。
  3. 确保 CS 信号可适当切换。
  4. 通过尝试 打开/关闭内部基准来测试写入命令功能。 此操作通过将0x3F00写入 GENCONFIG 寄存器并移除 J11跳线来完成。 但是、没有任何变化的迹象、因为 VREF 总是 2.4-2.5V 电压。
  5. 由于可能存在热关断、因此尝试通过向触发寄存器写入0x0100来设置 ALM-RESET 位、但这没有任何变化。
  6. 将 SPI 引脚连接到示波器并检查数据传输是否正确进行。

意见和关切:

  • 内部基准电压始终开启、即使下拉 RESET 信号也是如此。 根据数据表、复位器件应启动 POR 事件、之后器件处于断电模式、内部基准应断电。 然而,这一点没有被发现。
  • ALMOUT 引脚读数为4V。 这是否表示热关断?
  • SDI 很高、这就是我当前把所有内容读取为0xFFFF 的原因。 (请参考下面的屏幕截图)

示波器读数:  

(只有3个探头,因此没有 CS )

[颜色代码: 蓝色- SCLK、 青色- SDO、 洋红色- SDI]

  1. 读取 DEVICEID 寄存器:

     '
  2. 将0x0A84写入 SPIC138寄存器:

查询:

我不确定如何进一步调试此器件。 是否可能是我不小心损坏了芯片? 是否有其他方法可以验证我的写入操作是否正常工作?  

我们非常感谢您对如何开展工作的任何见解或建议。 如果您需要任何其他信息、请告诉我。

提前感谢大家的支持和指导。

代码:

#include <Arduino.h>
#include <SPI.h>

// Registers
#define  R_NOP        0x00
#define  R_DEVICEID   0x01
#define  R_STATUS     0x02
#define  R_SPICONFIG  0x03
#define  R_GENCONFIG  0x04
#define  R_BRDCONFIG  0x05
#define  R_SYNCCONFIG 0x06
#define  R_TOGGCONFIG 0x07 // 0x07 to 0x08
#define  R_DACPWDWN   0x09
#define  R_DACRANGE   0x0A // 0x0A to 0x0D
#define  R_TRIGGER    0x0E
#define  R_BRDCAST    0x0F
#define  R_DAC        0x10 // 0x10 to 0x1F
#define  R_OFFSET     0x20 // 0x20 to 0x23

// Read Mask
#define READ_MASK     0x80 

int cs_pin = 10;
int rst_pin = 4;
SPISettings spi_settings = SPISettings(1000000, MSBFIRST, SPI_MODE1);
SPIClass *spi = &SPI;

void cs_ON();
void cs_OFF();

void writeRegister(uint8_t reg, uint16_t wdata);

uint16_t readRegister(uint8_t reg);

void reset();

void setup() {
    Serial.begin(115200);
    pinMode(cs_pin, OUTPUT);
    spi->begin();
    cs_OFF();
    writeRegister(R_SPICONFIG, 0x0A84);
    writeRegister(R_GENCONFIG, 0x3F00);
}

void loop() {
    readRegister(R_DEVICEID);
}

inline void cs_ON() { 
    digitalWrite(cs_pin, LOW); 
}

inline void cs_OFF() { 
    digitalWrite(cs_pin, HIGH); 
}

// void reset() {
//     // Reset through HW
//     if (rst_pin != -1) {
//         digitalWrite(rst_pin, LOW);
//         delay(10);
//         digitalWrite(rst_pin, HIGH);
//         delay(1);
//     }
//     // Reset through SW
//     else {
//         writeRegister(R_TRIGGER, 0x000A);
//         delay(10);
//         writeRegister(R_TRIGGER, 0x0000);
//         delay(1);
//     }
// }

void writeRegister(uint8_t reg, uint16_t wdata) {
    uint8_t lsb = (uint8_t) wdata;
    uint8_t msb = (uint8_t) (wdata >> 8);
    spi->beginTransaction(spi_settings);
    cs_ON();
    spi->transfer(reg);        // 23: W bit, 22: X, 22-16: Register Address
    spi->transfer(msb);        // 15-8: 8 MSBs of the data
    spi->transfer(lsb);        // 7-0: 8 LSBs of the data 
    cs_OFF();      
    spi->endTransaction();
}

uint16_t readRegister(uint8_t reg) {
    uint8_t echo, msb, lsb;
    // SDI
    spi->beginTransaction(spi_settings);
    cs_ON();
    spi->transfer(READ_MASK | reg);        // 23: R bit, 22: X, 22-16: Register Address
    spi->transfer(0x00);
    spi->transfer(0x00);
    cs_OFF();            
    
    // SDO
    cs_ON();
    echo = spi->transfer(0x00);
    msb = spi->transfer(0x00);
    lsb = spi->transfer(0x00);
    cs_OFF();                 
    spi->endTransaction();

    // Serial.println(echo, HEX);
    uint16_t res = (msb << 8) | lsb;
    return res;
}

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

    Aniket 您好、

     

    您能否澄清 几点-  

    1. DAC81416电源引脚 VCC、VSS、VDD 和 VIO 的电源值是什么?

    2.当您说 SDI 和 SDO 时,是使用 DAC81416还是 Arduino? 我假设它应该与 Arduino .
    3.我在您分享的图表中看到 SCLK 电压电平会上升到6V。 请检查为什么会发生这种情况?

    • 内部基准电压始终开启、即使下拉 RESET 信号也是如此。 根据数据表、复位器件应启动 POR 事件、之后器件处于断电模式、内部基准应断电。 然而,这一点没有被发现。
      • 尝试将 DAC81416下电上电(确保在进行下电上电时未写入 SPI 命令)、然后检查 REF 输出电压。
    • ALMOUT 引脚读数为4V。 这是否表示热关断?
      • 这可能是热关断 、也可能是 CRC 报警、

      
    谢谢。

    桑贾伊

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

    尊敬的 Sanjay:

    非常感谢您的及时响应。

    1. VCC = 12V
      VSS =接地
      VAA/VAC= 5V VDD
      VIO = 5V
      (在原帖子中指定了连接)

    2. 它是. r.t Arduino。 换句话说、SDO 是 MOSI、SDI 是 MISO。 由于某种原因、MISO 始终为高电平。

    3. 将检查这是否只是范围的问题。

    4. 如何对 DAC 进行下电上电? 我已经尝试了软件复位(发送0x000A 以触发寄存器)和硬件复位(将 J8.1引脚拉至低电平)、但我在 VREF (J1.7引脚是否正确?)上没有看到任何变化。 是否有其他方法可以对其进行复位?

    5. 为了退出热关断模式、我尝试向触发寄存器写入0x0100、但没有任何变化。 我从不启用帧错误校验(CRC-EN)、因此我认为不是 CRC 警报。

    我将谈谈 SCLK 过冲问题。 如果还有其他细节需要说明、敬请告知。

    谢谢!
    阿尼基特

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

    Aniket 您好、

    • 如何对 DAC 进行下电上电? 我已经尝试了软件复位(发送0x000A 以触发寄存器)和硬件复位(将 J8.1引脚拉至低电平)、但我在 VREF (J1.7引脚是否正确?)上没有看到任何变化。 是否有其他方法可以对其进行复位?

      • 您需要使所有电源的电源电压值为0V、然后将电源电压值设置为之前的值。
        VCC = 12V
        VSS =接地
        VAA/VAC= 5V VDD
        VIO = 5V
    • 为了退出热关断模式、我尝试向触发寄存器写入0x0100、但没有任何变化。 我从不启用帧错误校验(CRC-EN)、因此我认为不是 CRC 警报。

      • 写入0x0100无任何作用。 写入0x000A 以复位 DAC81416、写入0x0010以复位 触发寄存器中的 ALM 复位。 请查看下面的详细信息。

      
    谢谢。

    桑贾伊