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.

[参考译文] ADS1299:采样问题还是 SPI 通信? 测试信号有奇怪的伪影!

Guru**** 2595770 points
Other Parts Discussed in Thread: ADS1299

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/779998/ads1299-sampling-problem-or-spi-comunication-test-signal-having-strange-artifacts

器件型号:ADS1299

大家好、  

我使用 ADS1299评估模块的子板与其他微控制器进行通信。  我让 SPI 工作、我可以正确读取所有寄存器、现在我想检查8个通道上的测试信号。 我使用的是250SPS 的输出数据速率、这里是寄存器映射:

寄存器映射/值

ADS_ID:3e.
CONFIG1:96
CONFIG2:D0
CONFIG3:E0
LOFF:0
CH1SET:5.
CH2SET:5.
CH3SET:5.
CH4SET:5.
CH5SET:5.
CH6SET:5.
CH7SET:5.
CH8SET:5.
BIAS_SENSP:0
BIAS_SENSN:0
LOFF_SENSP:0
LOFF_SENSN:0
LOFF_FLIP:0
LOFF_STATP:0
LOFF_STATN:0
GPIO:F
MIPSC1:0
MIPSC2:0
CONFIG4:0

首先是问题:

在下图中、您可以在信号上升或下降之前看到一些奇怪的伪影(或弹跳)、但在信号的稳定部分、这是随机的、 有时、某些通道中会出现伪迹、而不是像我用红色箭头所示的那样出现在其他通道中。

信号的振幅看起来很好、因为我使用的增益= 1、所以得到的 Aprox 为3.75mV。

我已经用示波器检查了 SPI、DRDY 如何每4ms 下降一次低电平、唯一吸引我注意的是:

-图 A1显示了数据检索的开始、DRDY 在第一个 SCLK 时变为低电平和高电平、但 MISO 引脚在 CS 变为低电平时立即上升、然后 MISO 线路几乎在第一个 SCLK 时再次变为低电平。

-图 A2显示了该样本的数据检索结束, MISO 线路即使在 CS 变为低电平后也保持高电平。  

-图 B1显示了不同的样本。 但是、这次 MISO 线路变为高电平、直到它为状态字节(CO)

-图 B2显示了相同样本的数据检索结束、但 MOSI 保持高电平、但在需要时变为低电平。

现在,问题是 ,MISO 线路上的这种行为是否正常? 或者、它与 我在测试信号上看到的奇怪的伪影有关?

 这是正常的。 您是否对为什么会发生这种情况有任何了解?

我等待您的回答、如果您需要一些其他信息、我会尽快提供。

Moises。

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

    感谢您的发帖并提供详细信息!

    这看起来像是数据损坏、MISO 信号的行为令人奇怪、这一点您肯定是对的。 您能否提供一些有关所发送命令的附加信息? 是否在发送 RDATA 之前发送 SDATAC? 默认为 RDATAC 模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

    感谢您的快速响应。

    首先、我必须说我正在使用 RDATA 模式的器件、 要快速回答 您的问题、在发送 RDATA 之前发送 SDATAC 命令、方法如下:

    void ads1299_init()
    {
    // ADS1299加电
    ads1299_PWRUP();
    
    //停止配置转换
    ads1299_SDATAC();
    
    // ADS1299 ID 
    CHECK_DeviceID (); // ADS 寄存器配置: ads1299_wreg (config1、0x96); ads1299_wreg (CONFIG2、0xD0); ads1299_wreg (CONFIG3、0xE0); // ADS CHnSET 配置: ads1299_wreg (CH1SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH2SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH3SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH4SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH5SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH6SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH7SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); ads1299_wreg (CH8SET、ADS1299_PGA_GAIN01 | ADS1299_INPUT_TESTSIGNAL | ADS1299_INPUT_PWR_UP); //启动转换 PB6 START 引脚为高电平 GPIO_SetBits (GPIOB、GPIO_PIN_6); }

    正如您在代码的这一部分中看到的、我有一个上电序列函数、然后在发送 SDATAC 命令后不久、如下所示。 然后、我检查器件 ID、配置一些寄存器、然后配置各个通道寄存器、将 START 引脚设置为高电平、就这样。

    void ads1299_SDATAC()


    // CS 低电平
    GPIO_ResetBits (GPIOD、GPIO_PIN_7);


    //发送 SDATAC
    SPI_SEND (_SDATAC);


    // CS 高电平
    GPIO_SetBits (GPIOD、GPIO_PIN_7);


    //等待2*TCLK = 888ns aprox 1us
    延迟(micro (1));

    RDATA 命令以仅用于读取数据的其他函数发送、如下所示:

    void ads1299_RDATA (uint32_t * statusDATA、int32_t * realDATA)//
    
    {
    
    //CS 低电平
    GPIO_ResetBits (GPIOD、GPIO_PIN_7);
    
    //发送读取数据模式
    SPI_SEND (_RDATA);
    
    这是用于读取8个通道的数据 并将其从两个补码转换的代码。 //CS 高 电平 GPIO_SetBits (GPIOD、GPIO_PIN_7); //等待2*TCLK = 888ns = 1us 延迟(micro (1)); }

    我将使用 DRDY 的中断。 在这里、我调用  ads1299_RDATA 函数、然后 每次我有250个样本时、我都会将它们保存在缓冲器中、 然后触发另一个中断、负责通过 UART 向计算机发送数据。我认为发送 SDATAC 和 RDATA 命令的方式不应有任何冲突。

    我希望你们能帮我解决这个  问题、这个问题很难解决。

    再次感谢您的观看、我将等待您的回答。

    Moises。

     

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

    尝试探索 UART 传输。 很可能是在下一轮样品生产之前没有完全传输数据。 尝试更改采样率、看看是否有效果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Alexander、

    我将更改采样率、再次检查 UART 通信并返回给您。
    但是、MISO 线路和 SPI 接口仍然与 UART 通信发生的情况以及我如何处理通过 UART 发送的数据无关。

    最棒的

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

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

    您好、Alexander、

    我一直在讨论这个问题、并给出以下结论:

    - 我尝试更改主设备上的 SPI 端口只是为了放弃端口问题,但 MISO 线路上的行为在数据速率方面保持不变。

    -当 我使用较高的数据速率时,我增加了输出数据速率,结果甚至是最差的,正如你在图像上看到的那样,当我使用较高的数据速率时,会出现更多的伪影。 这是在500SPS 下

    此外、为了消除 UART 在 SPI 上的某种影响、我删除了所有 UART 代码、只让 SPI COM 在 MISO 线路上导致相同的数据损坏。

    为了进行检查,我从其中一个通道中的信号发生器连接了一个外部信号(一个正弦波和一个方波),让其他通道上的内部信号看起来不错(重建的很好),频率很好,但幅度我不确定。 但是 、我只是意识到测试信号的频率错误、一个完整的占空比应该是每250SPS、而不是这样

    这里有很多事情要做,所以我现在不知道如何解决这个问题,是什么原因?

    提前感谢、

    Mois é s

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

    感谢您提供详细信息和可靠的调试步骤!

    根据以下文章查看您的电压转换代码 :e2e.ti.com/.../2856893
    由于您只看到转换附近的问题、也许环路中有一些小问题会导致问题、例如读取25位而不是24位、从1开始计数、而不是0等

    在平均时间内、我将询问一位同事 MISO 线路上看到的行为。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Moises、

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

    您好、Alexander、

    我只是在收到您的消息时给您写信。

    我已经检查了如何转换数据、基本上是在这里:

    void ads1299_RDATA (uint32_t *状态、int32_t *数据)//
    
    {
    
    
    //将 CS 拉为低电平
    GPIO_ResetBits (GPIOD、GPIO_PIN_7);
    
    //发送字节:0x11读取数据模式
    SPI_SEND_ND (_RDATA);
    
    
    uint8_t inByte;
    
    
    //读取状态寄存器(1100 + LOFF_STATP + LOFF_STATN + GPIO[7:4])
    对于(int i = 0;i < 3;i++)
    {
    InByte = SPI_SEND_ND (0x0);
    *STATUS =(* STATUS << 8)| INByte;
    }
    
    //读取8个3字节数据块中的24位通道数据
    对于(int i = 0;i < 8;i++)
    {
    
    对于(int j = 0;j < 3;j++)
    {
    InByte = SPI_SEND_ND (0x0);
    Data[i]=(data[i]<< 8)| inByte;
    }
    
    }
    
    //需要将24位转换为32位;将3字节二进制补码转换为4字节二进制补码
    对于(int i = 0;i < 8;i++)
    {
    
    if (data[i]& 1 << 23){//如果 MSB 为1
    
    数据[i]|= 0xFF000000;//保留符号
    
    
    }
    否则{
    
    数据[i]&= 0x00FFFFFF;//retain the sign}
    
    }
    
    //将 CS 拉为高
    电平 GPIO_SetBits (GPIOD、GPIO_PIN_7);
    
    //等待2*TCLK = 888ns = 1us
    延迟(us (1));
    }
    

    我要将24位转换为32位、只需保留正负符号、我已经按照这里的一些示例进行了操作: 
    https://e2e.ti.com/blogs_/archives/b/precisionhub/archive/2016/04/01/it-s-in-the-math-how-to-convert-adc-code-to-a-voltage-part-1
    请访问 https://e2e.ti.com/support/data-converters/f/73/p/699762/2587855#2587855 。 在调用 RDATA 函数时、我只需将 LSB 相乘、

    但是,如果 MSB=1,您必须首先从十进制等效值中减去2^n,为什么需要这样做?
    从24位转换为32位后、是否需要再次检查 MSB?

    感谢您的指导、非常感谢。
    最棒的

    Moises

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    顺便说一下,您是否有任何关于我在 MISO 线路上看到的内容的信息?

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

    代码最终由客户决定、我不熟悉您的外部 MCU、因此我只能在此处提供有限的支持。

    我不明白为什么您的24位数据被转换为32位、我也对这一行提出质疑:如果(DATA[i]& 1 << 23)。

    有些东西会奇怪地递增代码、这样 MSB 位就会翻转。 这仅在转换中出现、在测量交流信号时、问题可能更加明显。