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.

ADS131M04: 任何指令的回复第一个字节都是FF24

Part Number: ADS131M04

大家好,

我们遇到了一个问题,没有解决办法,想请求大家帮忙看看。

经示波器量出供给时钟约为7.3MHz,SPI的速率为2.4MHz。

这些是我们的寄存器配置,其他所有设置均为默认值:

-模式= 0x0510

-时钟= 0x070E

发送复位指令后,正常回复FF24。

配置时回复的也是FF24,这与数据手册上的回复不一致,请问是什么原因呢?

接着发送读取寄存器指令A200,还是回复FF24,请问这是正确的吗?

后面我们全部使用默认配置,还是一样的情况。

  • 您好,

    可能您发reset命令后帧不完整,设备并没有复位。reset 命令由设备在帧的末尾锁定。锁定命令后立即重置。主机必须在重置后等待tREGACQ,然后才能与设备通信,以确保寄存器已采用其默认设置。当ADC正确复位时,设备会发送FF24H确认。如果发送了命令字,设备会响应,但若帧未完成,因此设备不会重置。注意查看下面reset命令时序截图。

    在ADS131M04产品首页提供了example code,您可下载下来参考,不知您是否已经下载:

    ADS131M0x Example C Code (Rev. B)

  • 您好,

    我尝试下载您发的例程,发现其实使用硬件reset引脚复位。我也尝试了reset引脚进行复位,过程是reset引脚高->延时5ms->reset引脚低->延时5ms->reset引脚高->延时5ms,结果也是一样,只有FF24回复。

  • 我的意思是reset命令后需等待整个帧完成,且等待tREGACQ后,主机才能与设备通信。您发送完reset命令后,在进行读写寄存器时不知是否遵循了以上时序?看您的reset命令波形,在收到FF24响应后并没有继续发送时钟信号以完成整个帧使设备锁定该命令。

    通信的帧格式如上截图所示,主机在DIN上发送的输入帧始终以命令开头。设备在DOUT上传输的输出帧上的第一个字word始终对前一个输入帧上写入的命令的响应开头,和四个ADC通道的四个ADC数据字和一个CRC字。命令的响应相当于滞后一个帧。

  • 是的,现在我在发送RESET指令后继续发送多个时钟信号,但是都是在指令刚发出立马收到FF24的回复,并没有像手册上的时序一样需要多个时钟信号采会受到FF24的回复。之后我也尝试了完全移植例程,也是这样的问题

  • 您是否发送了多个RESET指令?这样您立马收到的FF24的响应可能是前一个RESET指令的响应。因为如果发送了RESET命令,若帧未完成设备会响应0011h而不是FF24h:

  • 只发了一次RESET指令,目前出现这种状况

    进行采样后,首字节为下图

  • 稍后我会具体看下您附的时序图

  • 看下面reset 命令响应时序,FF24h响应就是在第一个word响应,但是在帧的末尾锁定:

    图中ENABLE是指什么信号

  • ENABLE是DRDY引脚的信号

  • 采样转换结果是正确的吗?寄存器重置为默认值后,将立即生成转换数据:

  • 不正确,上面有图片显示采样结果不对。我尝试不初始化不给时钟信号,仅仅发出读取寄存器指令,但只有上电后第一次才能读取回寄存器的值,之后都只能读到错误的值,这是正确的吗?

  • 只有上电后第一次才能读取回寄存器的值,

    这里是指读回所有寄存器的值吗?还是哪一个寄存器的值?

    之后都只能读到错误的值”,这与可以正确读回寄存器的值之间还做了哪些操作?建议您用示波器分别看下可以正确读取寄存器值与读到错误的值的通信时序波形,看是时序问题还是通信波形上有干扰导致的?

  • readSingleRegister(CLOCK_ADDRESS);
    for(int i=0;i<15;i++)
    {
    SPI_ReadWrite(0);
    }
    readSingleRegister(CLOCK_ADDRESS);
    for(int i=0;i<15;i++)
    {
    SPI_ReadWrite(0);
    }
    readSingleRegister(CLOCK_ADDRESS);
    for(int i=0;i<15;i++)
    {
    SPI_ReadWrite(0);
    }

    这是我现在的程序。

    目前连续读取寄存器的问题暂时解决了,其必须严格遵循读取的时序,如下图我连续读取CLOCK寄存器

    但是还是有上面的问题,只有在上电后才能读取到正确的值,我在不重新上电的情况下,用编译器重新仿真,读取同一寄存器的值不一样,请问这是哪里出了问题?

  • ADS131M04有 FIFO buffer,但这是保存采样数据的,对寄存器应该没影响。

    编译器不应该改变寄存器的值,是不是编译器在重新编译前在不知道的情况下已经改变了寄存器值?

  • 我已经检查两遍,初始化之后没有其他SPI操作了,但依然会有这个问题。请问除了官网上例程外,还有其他例程作参考吗?

  • ADS131M04寄存器值它自己不会发生改变的,您是否可以换台电脑或换个仿真工具再验证下?看下是否与仿真工具有关?

    很抱歉,没有其他参考例程代码了