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.

ADS131M02: DRDY引脚不可控,无法正确掌握需要读出数据的时刻。

Part Number: ADS131M02

TI工程师您好,很希望如下问题可以得到您的技术支持。如上图所示是我通过MODE寄存器所配置的DRDY,按照正常逻辑应该是当drdy引脚为低时读取数据,但实际情况是在数据没有准备好时也会没有预料的出现一些负脉冲,并且负脉冲的脉冲宽度不固定,这就导致了对于数据准备状态的误判,导致我的输出结果混入了大量的0值。为了改变这种情况的出现,我想通过MODE寄存器将DRDY_FMT更改为1,使得转化数据可用时产生一个脉冲宽度固定的负脉冲,但我配置后DRDY的输出并没有相应的改善,甚至看不出和默认配置有什么区别。我通过读出寄存器的值确定我已经成功将寄存器写入,所以不存在寄存器未成功写入的情况出现。因为实验室并没有逻辑分析仪,所以我将提供几张示波器单步触发(下降沿)所得到的图片让您充分了解我的情况。绿色为DRDY输出引脚,黄色为DOUT输出引脚,紫色为SPICLK。很明显第一张图片中drdy为错误触发,drdy为低但是spiclk对应的第二个24位数据并没有相应数据;第二张图片可知,drdy为正确触发,spiclk对应的第二个24位数据正是我想要的通道0的数据。补充一下,我的MCU是rak4631,支持1M,2M,4M,8M的spi时钟,我目前所使用的spiclk为4Mhz,我看到手册中示例所使用的是8.192Mhz的spiclk,不知道这一点会不会成为影响因素。下面也附上了我目前代码的执行逻辑。非常感谢您的帮助,祝您生活工作顺利。期待您尽早的回复!

void loop() {
  // 如果很长时间没见到 DRDY 可以考虑重同步
  static unsigned long lastDrdyTime = 0;
  unsigned long t = millis();
  if (digitalRead(DRDY_PIN) == LOW) {
    lastDrdyTime = t;
    dataReady = true;
  }
  if(dataReady) {
    // 进入临界区保护标志位
    noInterrupts();
    bool ready = dataReady;
    dataReady = false;  // 清除标志必须在临界区内
    interrupts();
    if(ready) {
      // 读取通道0数据
      int32_t rawData = readChannel0Data(STATUS); // 使用STATUS寄存器触发连续读取
      
      // 转换为电压值(假设VREF=1.2V)
      float voltage = (rawData * 1.2) / 8388608.0;  // 24bit有符号数范围:-8388608 ~ +8388607

      // 输出原始数据和电压值
      Serial.print("Raw: 0x");
      Serial.print(rawData, HEX);
      Serial.print(" | Voltage: ");
      Serial.print(voltage, 6);
      Serial.println(" V");
    }           // 读取并打印一帧
  }
 }