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.

[参考译文] ADS7961:无法使用 SPI 与 ADS7961通信。

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1349043/ads7961-not-able-to-communicate-with-ads7961-using-spi

器件型号:ADS7961

我已经添加了代码片段和 SPI 配置以供查看。

在我不熟悉此内容时、请提供帮助。

for 代码片段中的循环是指延迟。 我们已经在没有延迟的情况下测试了代码、仍然不会在接收缓冲区中接收任何数据。

	  uint8_t send_addr[4] = {0x10, 0x80, 0x10, 0x00};
      uint8_t receive_data[4] = {0};
	
	  //----------------xx MANUAL MODE xx --------------------------------------------------------------------
	  //------------------------------------------------------------------------------------------------------
	  DIGITAL_IO_SetOutputLow(&DIGITAL_IO_0);

	  //90,000 10ms
	  //9000 1ms
	  //100 ns
	//  for(uint16_t delay = 0; delay < 2; delay++);

	  SPI_MASTER_Transmit(&SPI_MASTER_0, &send_addr[0], 1);
	  while(SPI_MASTER_0.runtime->tx_busy);
	  SPI_MASTER_Transmit(&SPI_MASTER_0, &send_addr[1], 1);
	  while(SPI_MASTER_0.runtime->tx_busy);

	//  for(uint16_t delay = 0; delay < 100; delay++); //50ns

	  DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_0);

	  //------------------------------------------------------------------------------------------------------

	  DIGITAL_IO_SetOutputLow(&DIGITAL_IO_0);

	  //90,000 10ms
	  //9000 1ms
	  //100 ns
	//  for(uint16_t delay = 0; delay < 2; delay++); //50ns

	  SPI_MASTER_Transmit(&SPI_MASTER_0, &send_addr[2], 1);
	  while(SPI_MASTER_0.runtime->tx_busy);
	  SPI_MASTER_Transmit(&SPI_MASTER_0, &send_addr[3], 1);
	  while(SPI_MASTER_0.runtime->tx_busy);
	  SPI_MASTER_Receive(&SPI_MASTER_0, &receive_data[0], 2);
	  while(SPI_MASTER_0.runtime->rx_busy);

	//  for(uint16_t delay = 0; delay < 100; delay++); //50ns

	  DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_0);

	  //------------------------------------------------------------------------------------------------------

	  DIGITAL_IO_SetOutputLow(&DIGITAL_IO_0);

	  //90,000 10ms
	  //9000 1ms
	  //100 ns
	//  for(uint16_t delay = 0; delay < 2; delay++); //50ns

	  SPI_MASTER_Transmit(&SPI_MASTER_0, &send_addr[0], 1);
	  while(SPI_MASTER_0.runtime->tx_busy);
	  SPI_MASTER_Transmit(&SPI_MASTER_0, &send_addr[1], 1);
	  while(SPI_MASTER_0.runtime->tx_busy);
	  SPI_MASTER_Receive(&SPI_MASTER_0, &receive_data[0], 2);
	  while(SPI_MASTER_0.runtime->rx_busy);

	//  for(uint16_t delay = 0; delay < 100; delay++); //50ns

	  DIGITAL_IO_SetOutputHigh(&DIGITAL_IO_0);

	  //------------------------------------------------------------------------------------------------------

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

    编辑:我们使用数字输出作为芯片选择引脚。

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

    您好、Gauri:

    欢迎来到我们的 e2e 论坛!  在这种情况下,一张图片是值得一千个字。  请提供您的/CS、SCLK、SDI 和 SDO 线路的逻辑分析仪(或范围)图。  与尝试解析代码片段相比、了解正在发生的情况要容易得多。

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

    您好、Tom、

    感谢您的快速回复。

    目前无法提供图解。 我可以通过其他任何方法来测试它吗? 一段时间后、我将分享逻辑分析仪图。

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

    遗憾的是、如果您无法观察到数字输入/输出、则没有"好"的方法来验证您是否已正常运行器件。  尽可能发送图表。

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

    我们没有操作示波器、因此我无法为您提供图。

    我将在手动模式下从0读取到5个通道、其中我将获得 CH0、CH1和 CH3的正确结果(使用前4位 IF 通道编号进行验证)。 对于 CH2、CH4、CH5、我们收到了不正确的数据。

    请参阅下表。

    通道编号 N 帧 N+1帧中观察到的通道号
    0 0
    1 1
    2 3
    3 3
    4 6
    5 7
    6 7
    7 7

    如果我们读取 CH0 (0x1000)、则接收通道号为0x0。

    如果我们读取 CH1 (0x1080)、则接收通道号为0x1。

    但 当 我们读取 CH2 (0x1100)时、我们接收的通道号为0x3 (错误)、而不是0x2。

    是否有必要在 CS 低电平之后和 CS 高电平之前(或在任何其它地方)增加延迟?

    请验证 SPI 配置一次。

    谢谢。

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

    好的-所以您可以与部件交谈并获得转换数据、您只是没有获得预期的结果。  您正在使用什么模式?  与 Auto 1或 Auto 2相比、您是否在手动模式下运行了正确的 Chid 数据?

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

    我正在使用低 IF 无效、在上升沿传输、在下降沿模式接收(我认为是模式0)。

    在手动模式下、ChID 适用于少数通道、而不适用于其他通道(请参阅上表)。 我尚未测试自动模式1和2。

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

    好-尝试更改相位设置,您所描述的是模式1。  对于 ADS7961、数据在 SCLK 上升时有效、在下降时改变。  在下图中、红线是数据的传输和接收位置、以蓝色表示。

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

    正如您所说、更改 SPI 模式确实可以解决我们的问题。 非常感谢。 现在我们将使用 SPI 模式:如果处于非活动状态、则为低电平、在下降沿传输、在上升沿接收。

    我们仍在接收不太准确的数据(与实际电压相差几伏)。 我如何使它更准确?

    此外、 是否需要任何延迟,例如帧间延迟或芯片选择之间的延迟? 如果是,需要添加多少延迟?

    我们使用的是带有144MHz 时钟的 XMC4700、那么您会建议采用哪种 SPI 频率来实现高速数据传输和准确性?

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

    我建议您遵循数据表中注明的时序。  如果无法通过范围或逻辑分析仪实际查看您的物理计时、就很难提供建议。  至于转换结果的准确性、我需要了解您的模拟输入是什么样的。  发送、我们来看一下。