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.

[参考译文] ADS124S06:无法在连续模式下读取数据、DRDY 引脚始终为高电平。

Guru**** 2557520 points
Other Parts Discussed in Thread: ADS124S06, ADS124S08EVM

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1559412/ads124s06-unable-to-read-data-on-continuous-mode-drdy-pin-is-being-high-all-the-time

器件型号:ADS124S06
主题中讨论的其他器件: ADS124S08EVM

工具/软件:

晚安、团队、  

我正在处理一个需要从传感器连续读取数据的工程。 要从传感器读取数据、我使用的是 ADS124S06。  

 

ADS124S06_Handle adc1 = { 
		.hspi = &hspi1,
		.cs_port = ADC1_CS_GPIO_Port, 
		.cs_pin = ADC1_CS_Pin,
		.start_port = ADC1_START_GPIO_Port, 
		.start_pin = ADC1_START_Pin,
		.reset_port = ADC1_RST_GPIO_Port, 
		.reset_pin = ADC1_RST_Pin 
};

bool ADS124S06::WriteRegister(ADS124S06_Handle *dev, uint8_t reg, uint8_t data) {
	uint8_t cmd[3]= {0};
	cmd[0] = (WREG | (reg & 0x1F)); //WREG = 0x40
	cmd[1] = 0x00;
	cmd[2] = data;
	cs_low(dev);
	bool ok = HAL_SPI_Transmit(dev->hspi, cmd, 3, ADS_TIMEOUT) == HAL_OK;
	cs_high(dev);
	return ok;
}

void ADS124S06::Init(ADS124S06_Handle *dev)
{
    HAL_GPIO_WritePin(dev->reset_port, dev->reset_pin, GPIO_PIN_RESET);
	HAL_Delay(1);
	HAL_GPIO_WritePin(dev->reset_port, dev->reset_pin, GPIO_PIN_SET);
    WriteRegister(dev, 0x03, 0x00); // GAIN: PGA=1, 20SPS
    WriteRegister(dev, 0x02, 0x54); // I/p MUX: AIN5-AIN4 0x54
    WriteRegister(dev, 0x04, 0x14); // DataRAte : 20SPS, osc-4.096MHz
    WriteRegister(dev, 0x05, 0x0A); // REF : internal 2.5V On always.
    WriteRegister(dev, 0x06, 0x00); // IDACMAG
    WriteRegister(dev, 0x07, 0xFF); // IDACMUX
    WriteRegister(dev, 0x08, 0x00); // VBIAS
    WriteRegister(dev, 0x09, 0x10); // SYS
    WriteRegister(dev, 0x0A, 0x00);
    WriteRegister(dev, 0x0B, 0x00);
    WriteRegister(dev, 0x0C, 0x00);
    WriteRegister(dev, 0x0D, 0x00);
    WriteRegister(dev, 0x0E, 0x00);
    WriteRegister(dev, 0x0F, 0x40);
    WriteRegister(dev, 0x10, 0x00);
    WriteRegister(dev, 0x11, 0x00);
}

使用上述参数初始化 ADS124S06 之后、我将读回寄存器。  

void ADS124S06::ReadRegisters(ADS124S06_Handle *dev) {
	uint8_t txData[20];
	uint8_t rxData[20];
	/*Prepare RREG command*/
	txData[0] = RREG; //RREG = 0x20
	txData[1] = 0x11;
	for (int i = 2; i < 20; i++) {
		txData[i] = 0xFF;
	}
	/* Pull CS low to start communication*/
	cs_low(dev);
	HAL_SPI_TransmitReceive(dev->hspi, (uint8_t*) txData, (uint8_t*) rxData, 20,
			100);
	cs_high(dev);
	}
	

我将按预期获取所有寄存器值。 一切顺利到这里。

phReadings ADS124S06::ReadData(ADS124S06_Handle *dev) {
	uint8_t tx_buf[1];
	static bool st = true;
	tx_buf[0] = RDATA; // 0x12
	cs_low(dev);
	if (st) {
		HAL_SPI_Transmit(dev->hspi, tx_buf, 1, 100);
		st = false;
	}
	HAL_SPI_Receive(dev->hspi, rx_buf, 3, 100);
	cs_high(dev);
	return calculate_voltage(rx_buf, 2.495, 1);
}

现在、我尝试使用 START_PIN 在连续模式下读取数据(通过硬件,未使用启动命令“0x08")“)  

将 DRDY_PIN 配置为中断模式(下降沿触发)。 只要 DRDY_PIN 变为低电平 、ADC1_DRDy 标志就会为高电平。

我开始对话一次、并使用 ReadData 函数连续读取数据(循环中每 100ms 运行一次)。  

能够读取几个读数的值、之后 DRDY_PIN 始终处于高电平 、这会导致 ADC1_DRDy  标志为低电平、现在我无法读取数据。  

如果我再次复位控制器、我能够读取几次读数的数据、然后重复上一个问题。  


该怎么办? 请帮帮我。  
提前感谢。

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

    尊敬的 Pawan Kalyan:

    这听起来像是硬件问题、您能否发送系统原理图? DRDY 引脚保持低电平意味着 ADC 不再进行转换、前提是您当然没有以某种方式驱动 DRDY、因此其无法切换

    此外、您是否已检查以确保代码未向 ADC 写入任何您不打算导致 ADC 停止转换的内容?

    -布莱恩

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

    早上好 Bryan Lizon86 ,  

    我不确定这是硬件问题还是固件问题、因为硬件和固件在上电后不久都会按预期工作、所以我可以成功从 ADC 读取数据。 我通过将 START 引脚拉高来启动转换、数据可正确读取。 但是、几次转换后、DRDY 引脚会持续保持高电平、从而防止进一步读取。

    我不驱动 DRDY 引脚、它配置为在其下降沿触发的中断输入。 由于 DRDY 保持高电平、因此中断永远不会触发、从而停止数据检索。

    固件在启动时按预期运行、并在最初读取 ADC 数据时没有出现问题。 这个问题只在几次转换后才出现,这表明问题出在其他地方——可能是配置问题还是时序问题?



    您可以看到原理图  

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

    尊敬的 Pawan Kalyan:

    今天是美国的国庆节、请在接下来的 1-2 天内回复您的帖子。 感谢您的耐心。

    -布莱恩

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

    尊敬的 Pawan Kalyan:

    您应该能够为 ADC 上电、将 START 引脚拉至高电平、然后监控 DRDY 引脚以查看 ADC 是否处于“活动“状态。 无需向 ADC 发送任何命令即可使此行为正常工作。 这假定 ADC 已正确通电、时钟正常工作、并且 RESET 引脚为高电平。 您展示了 CLK 引脚上的手动接地电阻、因此我不确定这是您在系统中手动添加的电阻器、还是仅在其他原理图页面中包含该电阻器。 无论哪种方式、如果您打算使用 ADC 内部振荡器、则应至少包含一个接地的下拉电阻。 此外、如果手动安装、则重新检查连接/焊接。 糟糕的时钟信号可能会导致您描述的问题

    您可以在 START 引脚上添加一个上拉电阻器、因此 ADC 默认采用此行为。

    请告诉我您是否能够看到 DRDY 引脚以默认数据速率 (20SPS 或~50Hz) 持续切换。 同样、该操作应会一直持续、直到您通知 ADC 停止转换。 如果没有看到这种行为、则表示电源和/或时钟出现问题。

    我还将为 RESET 引脚添加一个上拉电阻、以便 ADC 在已知状态下启动

    -布莱恩

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

    HII Bryan Lizon86 ,  

    您应该能够为 ADC 上电、将 START 引脚拉至高电平、然后监控 DRDY 引脚以查看 ADC 是否处于“活动“状态。

    这非常有效、ADC 处于活动状态。 drdyPin 会持续切换。  

    void ADS124S06::ReadData(ADS124S06_Handle *dev, char *buf) {
    	uint8_t tx_buf[1];
    	tx_buf[0] = RDATA; // 0x12 START
    	cs_low(dev);
    
    	HAL_SPI_Transmit(dev->hspi, tx_buf, 1, 100);
    	HAL_SPI_Receive(dev->hspi, rx_buf, 3, 100);
    
    	cs_high(dev);
    }

    如果我这样做、我就能够连续读取数据。 但我正在发送  0x12  和接收 24 位数据时发出命令。  

    然而、在 ADS124S08EVM 中、我在 SPI 线路上连接了逻辑分析仪、并且我仅观察到一次  0x12  正在发送命令、并且能够连续读取 MISO 线路上的数据。

    当我尝试对固件执行相同操作时、
    void ADS124S06::ReadData(ADS124S06_Handle *dev, char *buf) {
    	static bool st = true;
    	uint8_t tx_buf[1];
    	tx_buf[0] = RDATA; // 0x12 START
    	cs_low(dev);
    
    	if(st)
    	{
    	    HAL_SPI_Transmit(dev->hspi, tx_buf, 1, 100);
    	    st = false;
    	}
    	HAL_SPI_Receive(dev->hspi, rx_buf, 3, 100);
    
    	cs_high(dev);
    }

    我面临着读数问题。 捕获到几个读数(莫雷森 2)后、Drdy 引脚始终处于高电平状态。

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

    尊敬的 Pawan Kalyan:

    感谢您提供所需的信息。 很高兴您可以确认 DRDY 信号在上电时正常工作、并且您能够在发送 RDATA 命令时读取数据

    您能否通过逻辑分析仪向我们展示通信信息、看看我们能否诊断问题? 请包括 CS、SCLK、DIN、DOUT 和 DRDY。 还请显示问题发生之前、期间和之后的数据

    您能否向我们发送您正在使用的 ADC 寄存器设置?

    -布莱恩

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

    HII Bryan Lizon86 ,  

    我们分析了单次数据传输的逻辑分析仪输出、捕获的数据符合我们的预期。

    在采样期间监控 EVM SPI 线路时、我们观察到 RDATA (0x12) 命令 仅在之后发出一次 START 引脚 会被拉高。 之后、器件会持续输出转换数据、直到指定的样本计数完成、然后是 START 引脚 会被拉低。

    但是、在我们的例子中、行为是不同的。 我们需要发送 重复执行 RDATA 命令 以便接收连续转换数据。 如果没有每次发送 RDATA 命令、则不会接收到转换数据。

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

    尊敬的 Pawan Kalyan:

    您能否向我们发送整个数据事务的.Sal 文件? 包括好数据、坏数据等。 还请包含 START 引脚

    我也认为 ADS124S08EVM 上根本没有发出 RDATA 命令。 我看到 START 引脚一直被拉至低电平。 这是必要的、因为 EVM 使用启动/停止命令来控制转换。 除了开始/停止命令外、我在 DIN 上看不到任何其他活动、这意味着该 EVM 使用的是读取数据直接模式。 您能否在最后一篇文章中阐明您所指的内容? 是否使用您自己的软件与我们的 EVM 进行通信?

    -布莱恩

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

    HII Bryan Lizon86 ,  

    我也没有看到在 ADS124S08EVM 上发出 rdata 命令。 我看到 START 引脚一直被拉至低电平。 这是必要的、因为 EVM 使用启动/停止命令来控制转换。

    是、EVM 在采集数据时不发送任何 RDATA 命令、而是发送启动/停止命令。  

    ]除开始/停止命令外、我在 DIN 上看不到任何活动、这意味着 EVM 正在使用读取数据直接模式

    是、在采集数据时、除了启动/停止命令外、DIN (MOSI) 引脚上没有活动。  

    您是否使用自己的软件与我们的 EVM 进行通信?

    不、我们使用的是 Δ — Σ ADC 评估软件  系统。  

    您能否在最后一篇文章中阐明您指的是什么?

    是的! 在上一篇文章中、我提到了“在采样期间监控 EVM SPI 线路时、我们观察到了  RDATA (0x12) 命令  仅在之后发出一次  START 引脚  会被拉高。 之后、器件会持续输出转换数据、直到指定的样本计数完成、然后是  START 引脚  被拉低。“  重新检查后、我意识到这是我负责解释 EVM SPI 数据的职责。 正确观察结果是通过 START 引脚保持低电平 、设备将发送 启动 (0x08) 命令 停止 (0x0A) 命令 差分信号以控制转换。

    我正试图弄清楚 从 ADS124S06 收集连续数据的正确方法

    在我的项目中:

    • ADC 需要从传感器连续收集数据。

    • 同一条 SPI 总线与显示器共享、我将使用单独的方式进行处理 芯片选择 (CS) 引脚 编程。

    • 上电后、ADC 应该开始连续转换、并将结果推入队列中进行进一步处理。

    所以、我的主要问题是:
    配置 ADS124S06 以通过 SPI 进行连续数据收集、同时确保同一总线上显示内容的平滑运行的建议方法是什么?



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

    尊敬的 Pawan Kalyan:

    两种读取数据的方法(RDATA 命令和直接读取数据)都应该 可以使用。 我倾向于使用 RDATA 命令、因为一旦对命令进行解码、就会执行该命令、而您需要小心、避免在直接读取数据期间 DIN 上出现任何干扰、否则回读可能 会损坏。 但同样可以看到、该 EVM 使用读取数据直接模式、一切都运行良好。

    如果您能够 使用 RDATA 命令读取连续数据、那么只需继续 使用该方法、就没有理由切换

    -布莱恩

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

    感谢您, 布莱恩·里藏 86 ,您宝贵的时间和支持。 我期待在今后的测试中也能得到同样的指导和帮助。