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.

[参考译文] ADS8686S:ADS8686 ADC 输出第一个序列的重复读数

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/996376/ads8686s-ads8686-adc-outputs-repeated-readings-of-the-first-sequence

器件型号:ADS8686S

我们在其中一个设计中采用了 ADS8686 16通道 ADC。 大多数情况下、ADC 正确读取整个通道序列。 但是、有时它似乎只读取一个序列、并重复该序列读取、而不是读取所有通道。 我不确定是什么导致了这种情况、也不确定如何可靠地重现这种情况。 但是、一旦开始重复中的 seq0读数、就会保持该模式。

背景:

模拟 VDD=5 VDC、数字 VDD=3.3 VDC、随附原理图。

OUT HW 已将 ADS8686配置为在串行 SPI、单线模式下运行。  该芯片在加电时经历了长时间复位。 我们运行 SPI 总线@ 4MHz、并且能够对配置寄存器进行编程、使其以软件配置的5个序列运行、这些序列在突发模式下使用一个 CONVST 回读。  我已通过读回所有已编程寄存器并确认读回的值与编程值匹配来确认序列配置是否正确。 即使 ADC 读数不佳、配置寄存器的内容也会保持正确。 在初始配置后、我们绝不会重置芯片。 在初始 ADC 配置结束时、我们对10个 ADC 通道的整个序列执行虚拟 ADC 读取、并确认数据读取正确。 我们可以告诉这一点、因为 Ch4A 被编程为始终输出0xAAAA、当读数良好时、该通道的读数为预期的0xAAAA。  我有(请参阅随附的 SPI 时序屏幕截图。 BTW:进入 ADS8686的 CLK 信号实际上与 Saleae 屏幕截图中显示的信号相反。)

初始化后、后续 ADC 读数也会产生预期结果。 然而、经过一段时间且由于未知原因、ADS8686开始返回1个序列值的数据、在读取期间重复5次。 实际上、即使是一个序列数据也似乎非常接近 CH_B0重复的 CH_A0数据以及随后的 CH_Ax 和 CH_BX 值。 (当考虑 CH_AS 和 CH_B 具有的不同范围时。)  我已确认,当 ADC 读数错误(重复 CH A0)时,SPI 读数和 CONVST,示波器上的忙时计时与正常读数情况相同。 数据内容是垃圾。  

我的 ADC 初始化和 readADC 函数都已附加。

我们还发现,如果我们生成两个连续的 CONVST 脉冲并等待忙线指示“转换完成”,那么我们的间歇性读取问题频率就更难重现。 但我们不知道为什么,也不能确定这是我们问题的真正解决方案。

感谢你的帮助、

Fred

e2e.ti.com/.../ADS8686.pdfe2e.ti.com/.../ADS8686_5F00_Timing.pdf

 e2e.ti.com/.../ADS8686_5F00_SourceCode.txt

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

    您好、Fred、

    您的原理图丢失、请检查。 我有几个问题:

    1. 当问题发生时、CH_A0和 CH_B0上的数据是否始终重复5次?
    2. 正常 数据 输出和不正确的数据输出/序列之间的 BUSY 高电平是否相同? 在这两种情况下、繁忙的高宽度是多少?
    3. 您的 CONVST 宽度是多少?
    4. 采样率是多少(CONVST 的周期时间)?

    谢谢。

    此致、

    戴尔

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

    您好 Dale、

    以下是您的问题的答案:

    1.是的。 尽管今天我重新运行这个问题时、我看到了一个略有不同的表现、那就是在我的10个读数上重复了一个2字节 vale 和一个6字节值。 有关更多详细信息、请参阅随附的 pdf 文件。

    2.不 读取良好的繁忙信号中的峰值为9us。 在重复读取中、它大约为500nS。

    3.我在断言和取消断言之间插入了各种指令,使该宽度更长一点。 测量值约为400nS。 我认为该规格为50nS。

    4、最终将出现1Hz 周期性读数、但这些错误是在测试仪调用的硬件测试期间发生的。 连续呼叫之间的间隔时间很长。 在产生重复结果的特定测试期间、有两个连续的 ReadADC 调用。 因此、读取之间的时间(_CS 至_CS) 约为12.5us。 但是、第一个调用返回重复的值、第二个调用则返回不同的模式。 (请参阅随附的 ADS8686时序2文件。)

    已重新附加原理图 pdf。

    最后、我注意 到、当重复读数时、我的 ADC 寄存器并不都包含我预期的值。 在 读取 ADC 数据操作期间、数据表似乎对 MOSI 传输到 ADC 的内容保持沉默(无关)。 我担心在读取过程中可能会意外损坏寄存器。 请确认 this.e2e.ti.com/.../ADS8686-timing-2.pdfe2e.ti.com/.../7776.ADS8686.pdf

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

    您好、Fred、

    关于您的问题和开机自检结束时的时序、 您的 SER1W 在原理图中连接到高电平、因此可在 SDOA 和 SDOB (2线制串行模式)上提供串行输出。 从通道 AIN_0A 到通道 AIN_7A 的转换结果出现在 SDOA 上、而从通道 AIN_0B 到通道 AIN_7B 的转换结果出现在 SDOB 上。 但是、SDOB 是浮动的、因此 AIN_XB 的所有数据都将丢失。 时序中 MISO 上的数据仅是 AIN_XA 通道的数据。 此外、我不知道为什么要向 ADC 发送10x (8+8)个 SCLK、实际上检索 AIN_XA 通道的数据只需要8x (8+8)个 SCLK 时钟。 500ns 忙高意味着没有过采样、您可以检查这是否与您的寄存器配置相匹配。 此外、您的测试模拟输入是多少?

    2.您是否更改过采样配置? 500ns 忙高意味着无过采样。 9US 不正确。 我建议所有测试不进行过采样、这将使调试更简单。

    4.我建议使用一致的模式和采样率来简化测试。

    此外、REFIO 引脚上的 C130可使用0.1uF 电容器。

    此致、

    戴尔

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

    您好 Dale、

    1A。 抱歉、我给您发送了一份修订版原理图。 实际上、SER1W 和 SEQEN 引脚都接地、而不是连接到 DVDD。 这说明了我们在 SDOA 上看到真实 CHB 数据的原因。

    1b。 至于感应10个字(8+8)读取、我们使用5个序列(SeqStk0–stk4)来读取 CHA 和 CHB 输入、因此这是10个字的读取。 可能是由于对 SER1W 引脚的混淆导致了这种情况? 如果只读取 CHA 输入、为什么不只读取5个字? 我是否遗漏了其他一些理由,为什么你认为我们应该只读8个字?

    2、我已经用2个样本的 OSR 对配置寄存器进行了编程、适用于所有情况。 当数据有效(10个唯一读数) 时、繁忙时间为~9.2us。 当数据无效(重复值)时、繁忙时间为500 ns。 在500nS 的情况下、我希望仍然存在2的过采样、因为该参数在配置后不会更改。 500 nS 忙且 OSR=2表示实际转换数是多少? 这是否意味着在此期间只转换了一个、两个或10个通道?  我也不知道您所谓的“9US 不正确”。 OSR = 2时、10个样本的时间是否过长?  请详细说明。

    我们以前在没有过采样(OSR = 0)的情况下运行、但仍然遇到同样的问题。 我不认为 OSR 与此有关,但既然您说它可以使故障排除更加直接,我就会这样做。 您希望我向您报告哪些数据?

    5.我把你的0.1 μ F 参考电容推荐给了我们的硬件团队。 感谢您对此提供反馈。

    6.最后,您没有回答我的问题,即在数据回读过程中传输缓冲区内容为0或被保留为垃圾。 回读期间意外写入配置寄存器是否有任何变化?

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

    您好、Fred、

    1. 10字(8+8)数据读取意味着您仅使用总共16个通道中的10个通道。 我试图与您确认。

       除了 SER1W、 将 SEQEN 接地是正确的、因为您在软件模式下使用串行接口。

    2和4。 没有 OSR 时500ns 忙高电平是错误的、OSR 2时为9us 是正确的。 我道歉使你感到困惑。 请参阅 EVM 上捕获的 SCLK、/CS、SDOA 和/BUSY I 的以下时序图:串行接口、软件模式、仅 SDOA、5通道对的突发序列发生器。

    繁忙高电平在没有 OSR 的情况下为4.328us、而 OSR 2的繁忙高电平为9.156us。

    6. 由于您可以获得正确的结果,我想知道一些可能的原因有时会导致您的问题,请您检查一下

    • 不使用突发序列发生器进行检查?
    • 向 ADC 发送连续 SCLK 时钟或每字时钟?

    此外、有多少个器件或电路板显示了这种行为?

    谢谢、 此致、

    戴尔

    无 OSR:


    OSR=2:

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

    您好、Fred、

    我认为您的序列发生器配置发生更改和丢失的原因是、当问题发生时、序列发生器无法按预期工作、仅选择和转换了 CHA0。 6中的 SCLK 时钟可能不是根本原因、而只是想进行验证。 谢谢。

    此致、

    戴尔

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

    您好 Dale、

    感谢您的回答。 当我查看您的值时、它们会非常密切地反映我在系统上的测量值、如下所示:

    BUSY_TIME_OSR2: 9.22us 和1.52us (分别用于良好和不良情况。)

    BUSY_TIME_OSR0: 1.52us 和0.52us (分别用于良好和不良情况。)

    我之所以选择 OSR2、是因为我的 SPI 比您的 SPI 慢得多、而且我的大部分时间都是数据传输(对于好的和坏的情况、分别为77.25us 和75.75us)。 我不认为 OSR 选择是这里的问题。

    我们看到的问题并非一个单元所独有、而是出现在我们当前拥有的全部3个 ADC PCB 上。

    我同意您的观点、即我的序列发生器配置因某种原因而损坏。 但不确定如何操作。 您能否将芯片 SDI 系列添加到您的 Saleae 数据读取屏幕快照中? 我想知道您的 SPI TXBuf 是否提前归零或未初始化。 您甚至可以使用不同的序列发生器重新整理 TXBuf (例如将 SSREN 位添加到第一个序列中)、并查看序列寄存器是否受 CONVST 之后的数据读取命令的影响。 这将确认未初始化的 TXBuf 可能会意外地对序列寄存器重新编程。

    谢谢、

    Fred

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

    Fred、

    建议 OSR 0的目的是简化测试时序、我认为问题与 OSR 选择无关。 出于同样的原因、我建议仅使用不具有突发模式的序列发生器进行测试。

    下面是在 SDI 上发送命令以启用突发序列发生器模式的时序、供参考。

    此致、

    戴尔

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

    您好 Dale、

    在读取 ADC CONVST 结果之前、您似乎没有将 MOSI 数据归零。 (您写入0x8464回读0x1A51)。 您能否将 ADC 通道15和16配置为回读0xAAAA 7 0x5555、然后对所有16个通道执行重复突发序列回读、并确保这些通道按预期继续回读。 这再现了我们的使用场景。

    将 MOSI TX buf 归零似乎是我们唯一解决问题的方法、但现在您显示的数据似乎表明这不应该有所帮助。

    感谢您上次为我尝试此操作、

    Fred

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

    您好、Fred、

    将0x8464写入 ADS8686S 用于选择突发序列发生器并配置 OSR=2、没错、由于无法在同一帧中执行命令、因此不使用数据回读来读同一寄存器。  我使用 EVM GUI 进行了非常有限的测试、因此我无法进行任何我们想要的测试、包括您预期的测试。 我不知道您所说的"Zero Out"是什么、但请务必使用软件检查您电路板上的时序捕获、以便我们能够发现不正确的情况。  谢谢。

    此致、

    戴尔

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

    您好 Dale、

    在 CONVST 之后回读 SPI 线路上转换的数据时、必须在 MOSI (SDI)线路上传输数据、而在 MISO 线路(SOA)上回读。 当我谈论将传输线路归零时、我所说的是在尝试读回 SDOA 线路上的转换数据时、确保传输缓冲器(SDI)只包含0。 正是这个 SPI 序列读回我感兴趣的转换数据、而不是芯片的配置。 很抱歉、以前没有清楚。 显示芯片配置步骤对我没有帮助。

    根据您的说法、您使用 EVM GUI 读回转换数据。 我不明白为什么您无法将 Salaea 引脚保留在8686 SDI、SDOA、_CS 和 Clk 线路上、并且仍然捕获 EVM GUI 发送到芯片的内容。

    或者、您可以共享执行 ADC 读取的 EVM 源代码、我可以对正在执行的操作进行逆向工程。 这可能是包含在 EVM 套件(我也购买了该套件)中的一件好事、因此终端用户可以看到一个有关如何正确连接芯片的示例。 向您的客户隐藏这些内容毫无意义。 最后、如果您有任何处理器的示例代码、其中显示了如何从 ADS8686 (或其系列中以相同方式运行的任何其他芯片)中正确提取转换数据的示例、这也将非常有用。

    Fred

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

    您好、Fred、

    您所讨论的"零输出"是"NOP"命令、用于向 ADC 发送时钟、通常用于从 ADC 中读取时钟。 我刚才展示的仅用于写入配置 ADC 的命令的时序。 下面是为将命令连接到 ADC 而捕获的另一个时序、命令是寄存器读取命令、第二个帧显示的寄存器数据符合预期。 在第1个帧中、我们无法向 ADC 发送"NOP"命令(零输出)、因为我们必须向 ADC 发送寄存器读取命令。 在第2个帧中、使用"NOP"(零输出)时钟输出寄存器数据。

    2.如果您看一下 EVM GUI、它包含用于捕获数据和寄存器写入/读取的独立页面、因此可以在不需要向 ADC 发送命令的时域页面中完成捕获数据、 或寄存器写入/读取可在"Register Map"页面中完成。 两者不能组合在一起。 这就是您想要的实验无法在 GUI 中实现的原因。

    3. GUI 没有源代码,因为它是使用 LabVIEW 开发的。  

    因此、最好 使用最少的配置来简化计时、 然后运行它们进行检查。

    此致、

    戴尔

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

    您好 Dale、

    感谢您的快速回复。 我对此表示赞赏。 遗憾的是、我无法使用"无突发"计时数据寄存器提供简化的时序配置、因为我的 ADS8686通过有线连接很难启用突发模式(请参阅先前发送的原理图)、这是它在最终产品中必须使用的模式。  但是、我无法理解为什么您认为简化的时序会告诉我们任何不同于我们已经知道的情况:我们已经确认两个单元上的转换(高电平占线)时间对于具有不同 OSR 的单个序列和多个序列是相当的。

    我的看法是、唯一的问题是:在 CONVST 之后以及在数据读取期间、是否有可能意外地对配置寄存器重新编程? 通常、这在器件数据表中指定。 在本例中不是。 解决该问题的另一种方法是为客户提供一个示例接口代码、据我所知、TI 并不是这样做的。 我仍然不明白为什么无法共享 LabVIEW 代码?

    如果我们继续缩短读取长度(简化代码)、那么意外覆盖配置寄存器的机会就会减少。 因此、我建议您使用错误的初始化代码特意填充您的"读取数据"传输缓冲区、看看它是否会破坏配置。

    您几乎展示了我在11天前的一个主题中查找的数据、其中您展示了 OSR0和 OSR2的 SDOA 数据。 (请参阅下图)如果您只能在这些示例中捕获 SDI 数据线以及 SDOA 和 CLK、这也可以回答我的问题。

    感谢您的帮助、

    Fred

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

    您好、Fred、

    如果您的时序符合对寄存器进行编程的要求、则可能会发生"意外重新编程"。 例如、写入10000100 000000000000b 将禁用序列发生器和突发、这只需要 SCLK 时钟在适当位置上产生两个脉冲。 您应该会遇到这种情况、因为您的 ADC 在开始时工作良好、并且问题在工作一段时间后发生。 它可能是由您的案例中的干扰信号引起的。

    正如我说过的、LabVIEW 不 是用代码编写的、您可以理解是否 熟悉代码 。 我使用 GUI 软件捕获数据、可以从 此处下载 GUI、但无法修改 GUI。

    我昨天分享的时序图包括了在 SDI 和 SDOA&SCLK 上捕获的数据、这不是您想要的吗?  我无法修改时序以进行更多实验、因为无法修改 GUI。

    由于您的 ADC 和软件在开始工作时受到干扰信号的影响、因此 ADS8686S 上的硬件模式应该是您的最佳模式、因为它更可靠。  

    此致、

    戴尔

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

    您好 Dale、

    你是对的。 2天前的时序图中确实包含 SDI 和 SDOA、但它仅显示器件配置、而不显示 CONVST、后跟 ADC 数据读取。 我感兴趣的是数据读取期间的 SDI。

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

    您好、Fred、

    正如我3天前解释的、我无法修改 GUI 以生成您想要的时序。 捕获数据可以在"Time Domain"页面中完成、也可以在 GUI 的"Register Map"页面中完成寄存器写入/读取。

    此致、

    戴尔

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

    您好、Fred、

    提醒一下、仅在写入或读取寄存器时才需要 SDI。 读取转换数据时不需要该参数、请参阅数据表中图73和74中的时序。 通常、控制器只需要在 SDI 上发送"NOP"(全零)、以便在 SCLK 上发送时钟。 因此、在读取转换数据时、您将仅在 SDI 上看到所有零。

    此致、

    戴尔

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

    您好 Dale、

    数据表的图73和74未显示 SDI 线。 实际上、在数据表中、我没有发现在 转换数据读取期间需要对 SDI 线路进行 NOP 操作。 因此、读者会认为读取期间的 SDI 内容是"无关"的、而不是 NOP、因为您建议控制器"通常"发送。

    如果在转换数据读取期间需要在 SDI 上传输 NOP、并 保证配置寄存器不会损坏、我希望您确认、然后我们可以关闭线程。 但我不想假设这是根本原因、然后发现我的配置寄存器再次损坏是出于不同的原因。

    感谢你能抽出时间、

    Fred

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

    您好、Fred、

    这些图不显示信号、因为它们在读取转换数据时不需要信号。 数据表将来可能会更加清晰。

    我们的 ADC (包括 ADS8686S)不需要 NOP (全零)命令。 您必须发出 NOP 命令的唯一原因是您的微控制器或 CPU、它们需要发送一些东西以在 SCLK 上发出时钟。 如果使用 FPGA、则无需发送 NOP (全零)命令、因为 FPGA 可以发送时钟而无需在 SDI 线上发送任何数据或命令。

    配置寄存器的内容可能会因 SDI 的干扰信号或干扰而发生变化、如果您的电气环境恶劣、这是可能的。

    此致、

    戴尔

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

    我想为将来可能遇到同样问题的人解决这个问题。 我们发现了两个问题、这两个问题源于导致我们出现问题的含糊不清的数据表规格。 这些是:

    1.在 CONVST 信号被置为有效且正在读取数据(在我们的1通道 SPI 接口中)后、必须清除 SPI 发送缓冲区。 如果未写入、且任何字节上的 MSB 位置位、则 ADC 可能会将其解释为写入命令、并可能损坏先前编程的芯片配置。 在任何读取尝试前、将发送缓冲区清零。

    2.芯片配置寄存器的读操作不能与实际寄存器的读操作终止、因为可以完成数据表状态。 如果这样做、该寄存器的内容将保留在 ADC 芯片输出缓冲器上、从而破坏下一个 ADC 读取结果。 必须使用 NOP cmd 来读取最后一个寄存器内容。 这是下一次读取不受影响的唯一方式。 (提醒一下、寄存器读取结果将在 registerread 命令后面滞后一条命令。 因此、必须通过 NOP cmd 读取最后一个寄存器读取的数据。)