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:通过 SDOA 返回垃圾进行 SPI 通信

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1401514/ads8686s-spi-communication-via-sdoa-returning-garbage

器件型号:ADS8686S
主题中讨论的其他器件: ADS8681DP83640

工具与软件:

我在软件串行模式下使用 ADS8686S、具有1线数据输出、仅限 SDOA。

我使用以下 SPI 设置将 STM32H723ZGT6作为全双工主器件进行连接:

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 0x0;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;

在尝试使用 SPI 读取寄存器时、我将执行以下操作:

	uint16_t rx = 0;
	uint16_t tx = (0 << 15) | ((ADS_DEVICE_ID & 0x3F) << 9) | 0x0;
	HAL_StatusTypeDef ret;

	HAL_GPIO_WritePin(ADC_CONVST_GPIO_Port, ADC_CONVST_Pin, GPIO_PIN_SET);
	while (HAL_GPIO_ReadPin(ADC_BUSY_GPIO_Port, ADC_BUSY_Pin) == GPIO_PIN_SET)
	{
	
	}
	HAL_GPIO_WritePin(ADC_CONVST_GPIO_Port, ADC_CONVST_Pin, GPIO_PIN_RESET);
	
	// Send read register command
	HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET);
	ret = HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&tx, (uint8_t*)&rx, 2, 10000);
	HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET);

	// Don't care
	ret = HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&tx, (uint8_t*)&rx, 2, 10000);
	
	// Receive register result
	HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET);
	ret = HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&tx, (uint8_t*)&rx, 2, 10000);
	HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET);

如果我注释掉通过将 CONVST 设置为高电平来启动转换的部分、则 ADC 不会返回任何结果。 只返回0x0、如图所示:

在最后一个 ReceiveTransmit 命令(我应该在该命令的默认状态下接收寄存器)上(如果我不注释掉 CONVST 部分)、我会获得如下所示的读数:

或以下内容:

如果我们看一下 Rx 缓冲区中值的8个最低有效位、我始终会看到值0x35 (十进制的53):

我在做什么错? 有人能在这里指出我的正确方向吗? 我很高兴在我的电力系统保护继电器中使用这款 ADC ...

这篇帖子还附有我的设计的原理图。

e2e.ti.com/.../protection_2D00_relay_2D00_schematics.PDF

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

    尊敬的 Gabriel:

    您能否提供屏幕截图或两条 SPI 读写命令?  代码片段很有用、但图片值一千行代码。  

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

    抱歉、您的意思是我发出读取命令时逻辑分析仪界面的屏幕截图吗?

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

    我的意思与戴尔在原始帖子中发布的内容类似:

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

    我明白了。 我没有逻辑分析仪可用的 ATM。 同时,有没有任何办法,你可以给我一些关于什么可能是错误的提示? 也许原理图有什么问题? 明天我将能够接触到具有逻辑分析仪的示波器。

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

    原理图中唯一让我暂停的是引脚49和51上的红色 X (表3?) 至关重要。  您可能正在使用 Altium、红色 X 有时表示没有连接-它也可能是网格错误(警告、不是实际问题)、因此您可能想要验证这些连接是否实际建立。

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

    它们确实是联系在一起的。 在 Altium 中、红色的 X 并不表示无连接。 它用于抑制编译器可能指出的警告和错误。 不确定我为什么仍然有这些、但它们在布局和实际 PCB 中是连接的。

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

    酷-将等待时间从洛杉矶然后。

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

    好的。 请不要关闭该主题帖。 我犯了一个不幸的错误、就是没有在电路板上放置这些信号的测试点、因此我在 tp 探针的路上直接在 IC 引脚上有一些 Pomona Electronics 测试夹。 幸运的是它是 LQFP 封装...

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

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

    大家好、这是时序。

    我将执行对前七个寄存器的读取、请参阅以下代码:

    	ads8686s_setup(&dev);
    	ads8686s_read(&dev, 0x2, &ret);
    	ads8686s_read(&dev, 0x3, &ret);
    	ads8686s_read(&dev, 0x4, &ret);
    	ads8686s_read(&dev, 0x5, &ret);
    	ads8686s_read(&dev, 0x6, &ret);
    	ads8686s_read(&dev, 0x7, &ret);
    	ads8686s_read(&dev, 0x8, &ret);

    现在、它似乎返回了正确的值、但我仍不确定。 您能检查波形并告诉我吗?

    我将使用 CPOL = 1 (时钟空闲高电平)和 CPHA = 0 (在第一个边沿采样)

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

    尊敬的 Gabriel:

    这对我来说很好!

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

    您好、Tom。

    我现在遇到另一个问题。 我无法将我的 SPI 频率提高到高于2 MHz。 到2 MHz 之前、所有特性运行正常、但是之后、ADC 丢弃垃圾、甚至未通过自检。

    这里的信号完整性很可能不是问题、因为 LA 捕获了我要完美传输的数据。 此外、以下是信号的示波器视图:

    请不要介意示波器捕获的过冲。 这是因为我将使用6 MHz 1x 探头、在4 MHz 处、边缘开始衰减、因此我已将其设置为10倍、但由于输入阻抗较高、我能够在示波器上看到振铃。 我很确定这种振铃不是来自 SPI 信号、因为我在使用来自非常昂贵的信号发生器的4 MHz 时钟向示波器馈送时看到它们的幅度完全相同。

    此外、只有 ADC 传输的数据看起来很糟糕。 STM32/ ADC 接收的数据在任何频率下都看起来正常。

    在这种情况下、您有什么建议吗? 我应该怎么做才能获得至少30个或40 MHz SPI 时钟? 2 MHz 没有问题、但我想最大程度地减少传输时间。

    PS:也可能与 PCB 布局无关、因为我在同一电路板上将以太网 RMII 连接到了 DP83640、性能非常出色、接近100Mbps。

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

    尊敬的 Gabriel:

    我怀疑 CH3是您的命令、CH2是 ADS8686S 中的 SDO。  很难判断边沿与 SCLK 对齐的位置、但在我看来、您似乎有一些相移可能会导致您出现问题。

    看看我圈出的区域。  这是 SDO 和 SDI 上的单个位、您可以看到它们之间1/2个 SCLK 周期的差异。

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

    大家好、我找出了这个问题:

    • 发出复位和 写入/读取寄存器以配置 器件后、器件可以处理的最大时钟似乎约为2 MHz;
    • 为了读取转换结果、器件可以高达数据表中通告的50 MHz 电压;
    • 此外、我遇到的另一个问题是、如果您尝试在保持 MOSI 线路为高电平时读取转换结果、那么下次您尝试读取转换结果时、ADC 将仅输出零。 您必须将 MOSI 线路保持为低电平(NOP)或发送有效命令。

    现在、我在48MHz 处完全启用 ADC、它运行得很好。 性能留下了很深刻的印象、但数据表对于这些方面不是很清楚。

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

    好消息!  感谢您让我们知道。  以便您了解可以采取哪些措施来增强数据表说明。