
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");
} // 读取并打印一帧
}
}