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.

[参考译文] ADS8638:读取ADC值和配置时出现问题

Guru**** 2518760 points


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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/603988/ads8638-having-issues-with-reading-adc-values-and-configuration

部件号:ADS8638

大家好,我在读取芯片时遇到了问题。缺少了一些东西。我在下面分享我的代码。有人能帮我,并与我分享他的代码吗。非常感谢。

#define ADC_TI_CHANNELS 8 //每个ADS8638 ADC上的通道总数
#define MAX_NUMBER_ADC_TI_CHIPS 5 // ADS8638 ADC总数

#define ADS8638_INTERNAL_VREF_ON 0xC
#define ADS8638_REG_AUX_config 0x06
#define ADS8638_REG_MANUAL 0x04
//重置LTC DAC上的相应芯片选择引脚
// TiAdcChips将保存
其每个信道结构TiAdcInfo
{
	uint16_t ADC_TI_value[ADC_TI_Channels]的值和范围;//这将保存
	所有DAC值uint16_t ADC_TI_RANGE[ADC_TI_CHANGE]; //这保持了所有DAC范围(电压范围),范围只能在DAC芯片上更改,在STM32F7上,它始终为0-2.5V

};

//将所有DAC步进大小初始化为零
//创建多个LTC芯片
结构TiAdcInfo TiAdcChips[MAX_NUMBER_ADC_TI_CHIPS];


//此set命令可用于为上面cmdbCodeDataList中的所有命令(注释的除外)生成命令。
char* adc_setCmdlicon(uint8_t adcNumber, uint8_t channelNumber, uint16_t命令Word)
{//
	adc_number_ti_value[number% adc_ti_channel]=值;
	if; adf_adc_creln; asp_crecurbe_c_adc_name=


	函数</t_adc_cannelnumber/add_adc_adcut_adc_extrecurb_ad_ad_adc

	


char* adc_setChannelandRange(uint8_t adcNumber,uint8_t adelNumber, uint8_t range,uint8_t tempreeSelector )
{//
	对于命令
	uint8_t channelNumber =0; uintREG Word_LSB
	=(dchannelNumber <<4)|(tem_recurb_ad=<_cad_cad_cref;

	
	
	

	//形成一个命令并发送它
	ADC_SPI_Transmit (adcNumber,channelNumber,ADS8638_internal_VREF_ON,ADS8638_REG_AUX_config);

	ADC_SPI_Transmit (adcNumber, ChannelNumber,cmdWord_LSB,cmdWord_MSB);

//	ADC_setCmdlGeneric (adcNumber,commandWord);


//更新ADC范围
	TiAdcChips[adcNumber].adc_TI_range[channelNumber % ADC_TI_channel]=范围;

	返回"OK";
}

int adc_getChannel(uint8_t adcnumber,uint8_t Number elNumber)
{
	返回TiAdcChips[adcNumber].adc_ti_value[inch_adc_adc_channelint_adc_adc_adc_self_self8
;<_adc_channelnumber/adc_adc_adc_adc_adc_self_self_self_self_self_self_8




	

IF (adcNumber > MAX_NUMBER_ADC_TI_CHIPS)返回"错误索引";
	IF (VALUE!= 0 && value!= 1)返回"值必须为二进制";

	SWITCH (value)
	{
	案例0:PinState = GPIO _PIN_RESET;break;
	CAFIN_GPIO_GPIO
	= GPPHO_PI_SE_CA0;PIN_CASE_CASE_CA0
	
	
	
	
	PinState);中断;
	案例2:HAL_GPIO写入引脚(GPIOG,NCS_ADC2_Pin,PinState);中断;
	案例3:HAL_GPIO写入引脚(GPIOG, NCS_ADC3_Pin,PinState);中断;
	案例4:HAL_GPIO_WritePin (GPIOG,NCS_ADC4_Pin,PinState);中断;
	默认值:break;
	}

	返回“确定”\n;
}//

打开和关闭ADC芯片
char* adc_powerup(uint8_t adcNumber, int value)
{
	gPIO_PinState PinState;

IF (adcNumber > MAX_NUMBER_ADC_TI_CHIPS)返回“BAD INDEX”;
	IF (VALUE!= 0 && VALUE!= 1)返回“Value must be Binary”;

	SWITCH (value)
	{
	案例0:PinState = GPIO _PIN_RESET;中断;
	CAPHA_AGPIO_GPCH_AGPI_SE_CASE_AGP_AGO_AGP_AGP_AGP_AGP_AGP_AGP_AGO_AGP_AGP_AGNO_0
	;//
	在电路板上添加更多案例
	
	0,插件数:插件,插件,插件数:插件,插件,
	插件,插件,
	插件,插件1:插件,插件,插件,插件, PinState);中断;
	案例2:HAL_GPIO写入引脚(GPIOG,ADC_EN_Pin,PinState);中断;
	案例3:HAL_GPIO写入引脚(GPIOG, ADC_EN_Pin,PinState);中断;
	案例4:HAL_GPIO写入引脚(GPIOG,ADC_EN_Pin,PinState);中断;
	default:break;
	}

	返回“确定”\n;
}//

在SPI上传输到选定的芯片
char* adc_spi_transmit (uint8_t adcNumber, uint8_t channelNumber, uint8_t cmdlsb, uint8_t cmdlbytes MSB)
{//
	四字节数组保留DAC的32位命令
UINT8_t DATA_array[2]={0};

	IF (adcNumber >= MAX_NUMBER_ADC_TI_CHIPS)返回"Bad DAC Number";

	//打开芯片
	ADC_POWERUP(adcNumber,1);//


	将相应的芯片选择引脚NCS拉至LOW,以在选定的DAC上开始传输
//然后拉低以执行命令
	//在所有芯片上重置NCS
	(int ii =0;i<MAX_NUMBER_ADC_TI_CHIPS;i++)ADC_NCS_SET (ii,1);
	ADC_NCS_SET (adcNumber,0);////



//		data_array[0]= cmdMSB <<1; //仅32字节回读事务需要
//		data_array[1]= cmdlsb; // build命令/地址字节
		cmdbMSB = cmdbMSB << 1;

		data_array[0]= cmdbMSB; // MS Byte
		data_array[1]= cmdlsb;

		//将bytes命令发送到ADC

//		HAL_SPI_Transmit_DMA(&hspi6,&data_array,2);
//			HAL_SPI_Transmit (&hspi_spi_transmit)(&hcmdl6,&2,spi_spi_transmit)
			
			
			
		//使用以下命令阻止传输
		// HAL_SPI_TRANSMEARE(&hspi4,&data_array,4,10);//HAL_DELAY

(10);
		//将相应的芯片SELECT引脚NCS拉高,以在选定的DAC
		ADC_NCS_SET (adcNumber,1)上执行命令;
//		adc_NCS_set(adc,0);
//		adcset
		

		//芯片等待32个时钟周期,然后才响应并回显相同的命令
		// todo:在调用接收
		IF (cmdbMSB == 0x8) ADC_SPI_receive (adcNumber,channelNumber)之前在此处添加延迟;


	返回"OK";
}//

在SPI上向选定的芯片
char* ADC_SPI_receive (uint8_t adcNumber, uint8_t channelNumber)发送
{//
	four bytes数组保留DAC的32位命令
UINT8_t DATA_array[2]={0};
volatile uint16_t ADC_readValue = 0;
UINT8_t b0,B1;

	IF (adcNumber >= MAX_NUMBER_ADC_TI_CHIPS)返回"错误的DAC编号";

	ADC_NCS_SET (adcNumber,0);
	HAL_SPI_receive (&hspi6,&b0,1,0);
	HAL_SPI_receive (&hspi6,&b1,1,0);
		ADC_NCS_SET (adcNumber,1);

	ADC_NCS_SET (adcNumber,0);
	HAL_SPI_receive (&hspi6,&b0,1,0);
	HAL_SPI_receive (&hspi6,&b1,1,0);
		ADC_NCS_SET (adcNumber,1);

// 	ADC_NCS_SET (adcNumber,0);
//		HAL_SPI_Receive (&hspi6,&data_array,2,10);
//		ADC_NCS_SET (adcNumber,1);


	//更新ADC值
		ADC_readValue = b0 & 0xF;
		ADC_readValue = ADC_readValue <8;
		ADC_readValue = ADC_readValue | B1;

//readValue1		= data_array[1]& 0x0F;
//		ADC_readValue = ADC_readValue1 <8;
//		ADC_readValue = ADC_readValue= Ti_ADC_ADC_ADC_ADC_ADC_ReadValue0

		

	返回“确定\n";
}////

如果启用接收完成中断,则HAL_UART_RxCpltCallback将被称为示例,如下所示
//void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi){//

//	if (hspi->instance ==SPI6)/{/}/
	

	

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Esam:
    您能否提供有关您输入和接收的输出内容的更多详细信息?
    您能否提供数字通信线路的示波器:SDI,SCLK,SDO,CS?

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



    感谢您的回复。 我现在得到了合理的读数,我稍后会提到,但仍然有问题。 根据第40页的数据表,转换读数在n+2处提供。 但是,这对我来说不起作用!!,有效的是从帧n+1读取。 不仅如此,为了按照数据表使用内部引用,还必须在refgnd和reference之间设置一个上限。 在我通过10欧姆电阻器将电流盖连接到板上的模拟接地之前,这也会产生不准确的读数!

    我现在感到困惑。 到目前为止,我一次读取一个信道,但当我开始在信道之间手动切换时,我应该从哪个帧中读取?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现的另一个错误是通道7。 我可以在所有频道上设置范围,但如果我在频道7上设置范围,则不起作用,并在频道6上重置范围!不确定是什么问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    艾斯姆

    听起来您遇到了计时问题,示波器呼叫确实有助于调试。您使用的SCLK频率是多少?
    每个帧在发生下降边缘 CS时开始。 数字通信取决于SCLK。 16位输出数据从4位通道地址开始,最后12位是会话结果,MSB优先,每个都是SCLK的下降边缘。 输出与数字输入通信同时提供,尽管DIN是在SCLK的上升沿读取。 下图84显示了帧的变化,有效数据何时可用以及何时读取数字输入通信。  数据表中的图85也将很有帮助。

    -辛西娅