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.

[参考译文] ADS8681:由于 Arduino 而导致器件中断 SPI

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/921278/ads8681-device-disrupting-spi-on-arduino-due

器件型号:ADS8681
主题中讨论的其它器件: 、DAC8830

我正在尝试通过 Arduino 的 SPI 接口与 ADS8681配合使用、以便能够在到期时获得16位 A/D 分辨率。   但是、我遇到了很大的问题。   我无法从 ADS8681获得准确的读数、此外、它会破坏其他 SPI 器件的功能。

我尽可能准确地遵循了数据表(图53、71)、并使用 ADS8681EVM-PDK 电路图(图21)确认了我的理解。   Due 上的 SPI 接口使用3.3V 逻辑、而我将 Due 的5V 电源用作 ADS8681的 AVDD 和 DVDD。   I LEFT 引脚10 (RVS)和11 (SDO-1)悬空、9 (RST)连接高电平。   SPI 线路上有50欧姆电阻器。

我使用示波器监测 Due 的 SPI 输出、当 ADS8681断开连接时、所有输出均按预期工作。   也就是说、当芯片选择(CS)变为低电平时、MOSI 也变为低电平(我理解这是读取命令)、并且 SCK 有16个3.3V 脉冲。   但是、当我连接 ADS8681时、在 SCLK 引脚上测量的电压具有100mV 的偏移、每个峰值脉冲小于1V。  在50 Ω 电阻器的到期侧、SCK 具有偏移(500mV)、当 CS 变为低电平时、该偏移变为0。 并且时钟峰值保持3.3V。   这让我认为 ADS8681上的 S_CLK 引脚是一条接地的低电阻路径、这很奇怪。   这似乎不是电源问题:接地和5V 保持稳定。   此外、ADS8681上的 SDI (引脚15)似乎始终处于悬空状态、我猜这是"三态"。

我还使用 TI DAC8830来获得16位 D/A 分辨率。   该器件仅在连接到 SPI 时就能正常工作。   我可以指定我需要的输出、它会执行它。   当 ADS8681被连接时、DAC8830停止工作、这可能是因为 SPI 输出下降到 TTL 以下。

如果能帮助您找出问题所在、我将不胜感激。   现在、我的理论可能是芯片被炸、或者我焊接到它的分线板增加了一些致命的杂散电容或其他东西。   我尝试了第二块芯片、用比我更好的手焊接、但它也有同样的问题。  提前感谢、

Matthew

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

    您好、Matthew、

    您与 ADS8681 ADC 的连接错误、请参阅原理图、引脚定义以及引脚9与引脚16之间的连接完全错误。 例如、引脚10不是 SDI 引脚15、引脚15实际上是 RVS 输出、引脚13是 SDO-0而不是引脚12、引脚12实际上应该是 SCLK 输入。 请参阅以下正确的引脚定义和连接:

    此致、

    戴尔

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

    我多么愚蠢!  我检查并重新检查了多少次!  或者、我可能不应该承认这一点。   感谢您的观看。

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

    您好、Matthew、

    不用担心、如果您需要此 ADS8681 ADC 的任何进一步支持、敬请告知。

    此致、

    戴尔

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

    这确实解决了我的问题、现在我可以从器件中读取。  但现在我有一个新问题。  既然您提供了进一步的支持、您能为编程提供帮助吗?  我想设置 RANGE_SEL_REG 寄存器、以将位0-3设置为1001b (即范围0..10.24V)。  据我所知、这意味着执行半字写入命令、在数据流中、我将写入:

    [将 CS 置为低电平]

    写入<11010_00_0><00010100><00000000000><00001001>

    (即0xD014 0x0009)

    [将 CS 置于高电平]

    但是、该范围不会从-12...+12变化。  我出了什么问题?  我是否将 MSB 和 LSB 反向?  我是否需要发送另一个(虚拟?) 32位帧才能使该命令生效?  我是否需要写入寄存器的其他位?  (我曾尝试向0xD016添加第二个写入命令、但这没有影响。)  或者、我应该使用一次只改变一个字节的半字写入命令的其他变体吗?  感谢你的帮助。

    Matthew

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

    您好、Matthew、

     您的命令正确。 当在特定数据帧 F 中提供这些命令中的任何一个时、该命令将在 CONVST/CS 信号的上升沿执行。 您如何验证器件的输入范围是否已更改? 您是通过转换相同的模拟直流输入来检查输出代码还是在下一帧读回寄存器内容? 您能否提供两个帧的时序、包括 CONVST/CS、SCLK、SDO 和 SDI?

    此致、

    戴尔

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

    好的!  我想您怀疑命令发送不正确。  确实是这样。  我正在使用 Arduino Due、而 SPI 库没有完整的文档记录。  在第一个 SPI.transfer16命令结束时、它尝试将 CS 线路设置回高电平、这会中断整个32位通信、我想 ADS8681将中断的命令视为 NOP。  transfer16命令可以采用单独保留 CS 线路的可选参数。  我添加了它、并进行了预分频!  现在增益正确。  非常感谢您的帮助和耐心!  已解决!

    Matthew

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

    您好、Matthew、

    感谢您的更新。

    此致、

    戴尔