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