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:串行通信无法正常工作

Guru**** 2487425 points
Other Parts Discussed in Thread: ADS8686S

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1557324/ads8686s-serial-communication-not-working

器件型号:ADS8686S


工具/软件:

大家好、我尝试制作自己的 DSP(数字信号处理器)板、而我使用的是 ADS8686S。 我遵循了数据表上的电源建议和布局示例(第 106-107 页)。 下图展示了我在 PCB 上进行的连接。 我尝试使用 1MHz、500kHz 和 100kHz 的时钟频率来进行 SPI 通信。 我打算使用软件模式。

   

我尝试读取寄存器配置 (ADDR:0x02)。 下图是以 100kHz 时钟频率输出信号的逻辑分析仪图、对于所测试的其他频率、响应是相同的。

在上图中、我不明白的一点是、当我发送地址时、位会在下降沿发生变化、以便在上升沿读取。 但是、当 ADC 发送数据时、它会在上升沿改变值。 这使得逻辑分析仪显示上述值、但微控制器 (MCU) 的读数始终为 0x00FF。 数据表显示此寄存器的复位值为 0x0400。

在我的代码中、我完全复位了 20us、然后等待 30ms。 之后、我开始通信。 在将 CS 置于低电平之间等待 2us、然后开始传输。

有人能告诉我我出了什么问题吗?  

我已经测量了电源引脚上的电压、所有引脚都具有预期电压。 我使用的是无相位 (CPHA=0) 且无极性 (CPOL=0) 的 SPI、但我已经尝试了所有可能的组合、这个配置是唯一一个从 ADC 获得应答的配置。

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

    您好、Rui、  

    欢迎来到 TI 的 E2E 论坛!  

    感谢您提供所有共享的信息、器件配置(共享引脚排列)看起来不错、并且似乎与所述的配置相匹配。  

    我认为在共享的逻辑图像中发生的情况是数据被移动、器件似乎正在注册一条命令来读取寄存器 0x4 (0x0800)、而不是寄存器 0x2 (0x0400)。 下一帧中的数据输出与寄存器 0x4 匹配、因为它似乎输出 0x00FF。  寄存器数据读数的格式为 D[15:8]= 0x00、D[7:0]=寄存器数据。   

    从 ADC 读取 (SCLK 和 SDOx):

    • CS 变为低电平后、SDOx 上的有效数据需要 t0_CKDO (< 16ns、取决于 DVDD)。
    • 数据必须在 SCLK 上升沿之前至少 3 ns 有效。
    • 一旦有效、数据将在上升沿之后保持 TD_CKDO (~20ns)、然后再更改。
    • 这会针对 16 个时钟重复进行。 在最后一个上升沿、SDOx 在 20ns 内返回到 Hi-Z。

    含义:数据在 SCLK 的上升沿变化、因此控制器应在下降沿采样、以避免丢失数据。

    写入 ADC (SCLK 和 SDI):

    • ADC 在 SCLK 的下降沿锁存 SDI。
    • 时序需要:
      • TSU_DINCK 在下降沿之前≥10ns(建立)
      • TH_CKDIN 在下降沿之后≥8ns(保持)

    因此、SDI 应在上升沿发生变化、从而在整个下降沿保持稳定。

    建议的 SPI 模式:CPOL=0、CPHA=1 或 CPOL=1、CPHA=0

    您提到使用 CPOL=0、CPHA=0、这有以下两个风险:

    1. 如果控制器不够快、从 CS 低电平→第一个 SCLK 上升沿开始的延迟可能会导致 SDO 数据移位一位。
    2. 对于 SDI、如果数据变化太接近下降沿、ADC 可能会锁存不稳定的数据、这也会导致位移位。

    在本例中、您提到控制器正在读取 0x00FF、它可能足够快、无法正确读取 SDO 数据、但反过来可能会太快、以至于 ADC 可能会过早地在 SDI 上锁存数据。  

    您提到了尝试所有 SPI 模式、是使用逻辑分析仪还是也使用控制器使用?

    此致、  

    Yolanda

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

    您好、

    非常感谢您的及时答复。

    我测试了您建议的模式、问题已解决。 我的问题是我期望读取具有寄存器的位、而不是 8 个 MSB 始终为 0。 例如、数据表显示地址 0x2 的复位值为 0x400、因此我期望在复位后读取 0x400。 我建议更明确的一点是、8 MSB 在阅读时总是为零。

    我注意到的一点是 、通信需要 CPOL=1、CPHA=0。 否则,我有一个位移。

    下面是逻辑分析仪的图像、读取寄存器、然后向该寄存器写入不同的值、之后再次读取以确认写入命令。 MCU 也会读取相同的值。

    非常感谢你们的帮助!!!