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.

[参考译文] ADS1220:ADS1220 SPI 总线上的数据对齐问题

Guru**** 2390755 points
Other Parts Discussed in Thread: ADS1220

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/877281/ads1220-data-alignment-problem-on-spi-bus-of-ads1220

器件型号:ADS1220

我使用 ADS1220的时间很长、并且面临一种非常奇怪的行为。

我的 ADC 通过 DRDY 线连接到 Cortex M0。 我尝试使用不同的方式读取数据。
  1. 将 ADC 设置为连续模式
  2. 在下降沿、DRDY 中断触发 DMA SPI 传输、以同时发送命令和接收数据。 在 DMA 传输完成时、我调用我的处理程序  

这种方法在相当长一段时间内有效、没有发现问题。 将某些 DMA 完成处理移至基于计时器的处理程序后、情况变得不好。 我观察到数据保持稳定了一秒钟、然后就一去不复返了。 在某些情况下、它在中间稳定、而在其他测试中则不稳定。 测试后、我认为调试器被确定为问题的根源。 由于它可能会停止时钟、这可能会导致 SPI 通信超时。 因此、我断开了调试器、并通过 CAN 总线传输了样本并对其进行了记录。 在13小时内、我读取了大约500万个样本、这些样本都很好。

第二天、如果没有发生任何变化、通信就不会保持稳定、甚至长达10秒。 在多次尝试修复后、我发现切换到温度测量和返回生成的数据很可能开始干草。 当让 ADC 仅在 T 或输入模式下运行时、数据读数正常。

现在、我将 ADC 重新配置为单次模式并逐个读取样本、传输 DMA 已被移除、而 SPI 控制器中的4字节传输队列更是如此。 仍然使用 DMA 完成接收。 现在可以观察到、字节对齐会混淆。 初始化后、第一次读数正确。 连同读出(在 DRDY 处于低电平时、不使用 RDATA 命令时基于中断)一起发送到零字节和一个 START/SYNC 命令。

在下一个中断时、在 DMA 设置之前清除 SPI FIFO、我得到 MSB 之前添加的一个字节。 在下一个传输中、我先将 LSB 移出、然后是0xFF、而不是 MSB。 在这个机制之后、预期结果被旋转24位。

我无法确认 SCLK 线路上的瞬态、尤其是这会很奇怪、因为为什么要始终有8个加边沿来移位数据? 在 DMA 传输3个字节后、SPI 接收器报告为空。

不同版本之间的代码发生概率不同这一事实并没有改变、至少在驾驶员层面上没有改变、这完全让我感到困惑。
有人知道我为什么要进行这种持续的转变。
此致
Christoph
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christoph、

    欢迎来到 E2E 论坛!  您是否始终保持 CS 低电平?  这似乎是由于您使用的时序而出现帧错误。  有两种方法可以检索转换结果。  一种方法是在 DRDY 从高电平转换为低电平后通过发送24个 SCLK 进行直接读取。  ADS1220数据表第37页的图61显示了这种方法、最好在 DRDY 受到监控且 DRDY 从高电平转换为低电平后尽快读取结果时使用。  第二种读取转换结果的方法是使用 RDATA 命令。  当 DRDY 未受到监控且使用通用计时器定期读取结果时、该方法很有用。

    如果您使用计时器方法并更改输入通道、则在重置计时器时需要非常小心。  原因基于两个方面。  第一个是内部振荡器可能不是您用于计时器的确切频率、而且振荡器也可能漂移。  第二个原因是转换将在寄存器写入后重新开始。  如果计时器跳闸并立即复位、计时将开始尝试在下一次更新发布之前捕获结果。  如果您使用我刚才所述的计时器方法并按照数据表第38页的图66中的示例进行操作、您最终会看到数据损坏的点、因为新的转换结果将在 WREG 命令完成之前不会开始。

    您正在尝试使用正确的故障排除方法、即使用单次模式并等待 DRDY 从高电平转换为低电平、然后发送 RDATA 命令。  将返回的结果是一个混合结果。  在接收到的第一个字节上、(MSB)将首先出现、因为这个字节已经在来自已完成转换结果的输出缓冲区中。  因此、当发送 RDATA 命令时、将传输此 MSB。  在 RDATA 命令解码后、最后完成的转换结果将传输 MSB-MID-LSB。  传输将如下所示:

    MOSI = RDATA (0x10)、0x00、0x00、开始(0x08)

    MISO = MSB、MSB、MID、LSB

    在我看来、您在使用 DMA 进行数据采集方面遇到了一些问题。  我建议使用示波器、更好的逻辑分析仪来捕获通信、以验证传输的内容是您的代码在 DMA 之后显示的内容。  如果传输的字长大于8位(如16或32位)、您还需要确保数据解析在接收缓冲区中正确进行。  使用字节传输会更容易。  ADS1220始终首先传输 MSB。  如果您可以验证代码是否在单次模式下工作、则可以进入连续模式。

    此致、

    Bob B

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

    Bob、您好!

    更新了: 确认了24 SCLK 的示波器测量、数据为0x44、0xD0、正如编程的那样。 但 DRDY 上没有响应、CS 也测量为低电平

    感谢您的回复。 首先、我从未使用 RDATA 命令(有意)。

    真正让我感到困惑的是、该方法确实适用于该方法(由于调试、该方法现在完全不同)。 状态/过程如下:

    1. 启动硬件
    2. 配置所有寄存器、使用2KSPS 和单次模式、TS=0
    3. 我每毫秒发送一条0x08 START/SYNC 命令

    =>数据被正确读取

    我不发送启动/同步、而是使用不同的波特率(测试目的)和 TS=1、CM=0向寄存器1发送一个 WREG。

    我选择在第8个 SCLK 之后或第16个 SCLK 之后发送命令、以确保 DRDY 处于低电平、即数据可用且转换完成。

    根据...

    8.4.2.1单次模式
    在单次模式下、器件仅在发出 START/SYNC 命令时执行转换。 。
    因此、器件执行一次单次转换、并在之后返回到低功耗状态。 内部
    振荡器和所有模拟电路(激励电流源除外)在器件等待期间关闭
    在该低功耗状态下运行、直到开始下一次转换。 此外、对任何配置的每次写入访问
    寄存器也会启动新的转换。 在转换过程中写入任何配置寄存器
    作为一个新的 START/SYNC 命令运行、可停止当前转换并重新启动一个新的转换
    转换。 每次转换都完全稳定(假设模拟输入信号在之前稳定至最终值
    转换开始)、因为器件数字滤波器在单个周期内稳定下来。

    我希望发送0x44、0xC2时会启动新的转换、但它没有启动。 如果我在 CM=1时尝试这个、波特率将不会改变。

    我出了什么问题。 目前、我忽略读回数据、我有另一个与奇数 SPI 相关的行为。 我清空 SPI
    并将三个字节写入 FIFO。 我在总线上得到2个脉冲。

    有什么想法吗?

    此致

    Christoph

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

    您好、Christoph、

    您能否将您的示波器图发送给我进行审核?

    第8.4.2.1节以"在单次模式下、器件仅在发出 START/SYNC 命令时执行转换"开头。  因此、您不能依赖该语句下面的写入部分在寄存器被写入时自动开始转换。  本节实际上说明的是、如果在发出 START/SYNC 命令后在进行中的转换过程中重新配置 ADS1220、则转换将使用新的配置信息重新启动。

    在一些非常独特的情况下、ADS1220尚未完全进入低功耗状态、寄存器写入可能触发转换、但您不能依赖这种情况始终发生。  此外、START/SYNC 命令还有一些其他内部命令、这些命令必须通过发出才能获得有效的转换结果。  因此、在单次模式下、应始终发出 START/SYNC 命令、以从低功耗状态启动转换。

    您应该能够直接读取转换结果并同时发送 WREG 和 START/SYNC 命令。  当接收到3个字节的转换数据时、发送数据看起来像0x44、0xD0、0x08。  请向我发送此交易的范围照片。

    此致、

    Bob B

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

    Bob、您好!

    在大约12年后、我再次按示波器进行了调试。 我可以确认您刚才所说的内容、并在重新配置 ADC 后添加 START/SYNC。

    感谢您成为 我的稀疏合作伙伴

    此致

    Christoph