TI中文支持网
TI专业的中文技术问题搜集分享网站

ADS1293 SPI 讀值都為0

請問 我是用的晶片是STM32F429,我要使用SPI訊號讀取ADS1293的暫存器,
但是回傳值很奇怪,在Logic Analyzer上看到的,ADS129似乎是會有一些反應
但是時間都想當短,跟SCLK都對應不上(如下圖),圖中DRDYB也是都只有小小的一個訊號突然出現而已。
 

我現在只是單獨測試ADS1293的操作,我只有接IN1、IN2為輸入訊號,也沒有使用到右腿驅動,
故我將SDM2、3及INA2、3都關閉,其餘設定也是參考DataSheet的範例設定去做。
我也有測試過只單獨讀取ADS1293的REVID暫存器,回傳值也都為0。

void getADS1293_ID(SPI_HandleTypeDef *hspi)
{
		uint16_t ID[] = {REVID};
		uint16_t IDr[]= {0};
		SPI1_CS_L();	
		HAL_SPI_TransmitReceive(hspi,ID,IDr,1,5000);/*Read Data*/
		SPI1_CS_H();
}

 底下是我初始化ADS1293的設定,及讀取ADS1293時的程式碼,麻煩大家幫我看一下了,謝謝


void ADS1293_Init(){unsigned char lengh = 7;
	
	uint16_t REG[lengh];
	uint16_t Value[lengh];
	
	REG[0] 		= FLEX_CH1_CN;		
	Value[0] 	= POS_CH_IN1|NEG_CH_IN1;
	REG[1] 		= OSC_CN;				
	Value[1]  = STRTCLK;
	REG[2] 		= AFE_SHDN_CN;
	Value[2]  = SHDN_SDM_CH3|SHDN_SDM_CH2|SHDN_INA_CH3|SHDN_INA_CH2;
	REG[3]		= R2_RATE;
	Value[3]  = R2_RATE_5;REG[4]		= R3_RATE_CH1;
	Value[4]  = R3_RATE_6;
	REG[5] 		= DRDYB_SRC;
	Value[5]  = DRDYB_CH1_ECG;
	REG[6] 		= CH_CNFG;
	Value[6]  = E1_EN|STS_EN;
		
	for(int i=0;i<lengh;i++){
		write_register(&hspi1,REG[i],Value[i]);
	}
}

uint16_t* Read_register(SPI_HandleTypeDef *hspi,unsigned char address)
{
	uint16_t add[] = {(Read|address)<<8};
	static uint16_t Rx[]={0};
	
	SPI1_CS_L();
	HAL_SPI_TransmitReceive(hspi,add,Rx,1, 5000); /*send Address&Command*/
	SPI1_CS_H();
	
	return Rx;
}

uint16_t* Read_ECG_Data(SPI_HandleTypeDef *hspi,uint16_t channel){
	channel = channel | Read;
	uint16_t ch[] = {channel<<8,(channel+1)<<8,(channel+2)<<8};
	static uint16_t ECG_Data[] = {0};

	SPI1_CS_L();	
	HAL_SPI_TransmitReceive(hspi,ch,ECG_Data,3, 5000);/*Read Data*/
	SPI1_CS_H();
	
	return ECG_Data;
}

 
user151383853:

我看你这个工具的采样速率是不是不够快, 来不及采样 SCK 那么快的速度了, 可以考虑升级你的 Logic Analyzer 吧, 别让工具误导你走入歧途.

user151383853:

我看你的Logic Analyzer 采样率不够吧, 应该升级你的Logic Analyzer了

Martin:

请检查你的硬件连接是否有问题!

zhang yanrong:

回复 user151383853:

您好

目前已經可以正確的寫入跟讀取暫存器了 謝謝

只是一樣是照上面的設定值

輸入分別是 IN 1對channel 1的positive   IN2對應negative

我把channel 2,3的SDM INA都關閉了

connon及右腿也都是關閉沒有使用

設定DRDYB的來源是channel 1 ECG

我只想先測試讀取ADC的數值 所以我只在IN1接了DC 1v IN2接地

但是ch1-ECG的值不管我輸入怎麼變都不會有變化

DRDYB也都不會為High

我試著讀取data status(0x30) 讀到的都是0x02 或 0x26

但讀到的數值都是一樣的沒有變化

我按照datasheet的ADCout=((3.5(vin-vim)/2Vref)+0.5)*ADCmax

以輸入1v來算應該是((3.5(1-0)/2*2.4)+0.5)*12150000=14934375=0xE3E167

Vref為內部2.4v 可調濾波器喔設定是R1=4 R2=5 R3=6 對應的ADCmax為0xB964F0=12150000

這樣計算應該做正確的吧? 我讀到的數值都是為77FExx  或 5CB2xx 後兩位會小有變動

是我哪裡設定沒注意到了嗎?

sheng tao:

回复 zhang yanrong:

您好,我用stm32也碰到了类似的问题,具体表现为:

1.可以读出Reg中的数据,但是并不是每次都对。我stm32的spi寄存器设置为:CPOL=High,CPHA=2Edge。也就是spi idle时clk为高,在clk的第2个沿(上升沿)锁存数据。

2.无法向Reg中写入数据。尝试向0x00寄存器中写入0x00总是无法成功。

请问您的spi是怎样设置的?望赐教。

zhang yanrong:

回复 sheng tao:

照datasheet的設定,你應該是設CLK載idle的時候為LOW,在第一個上升沿存取資料

sheng tao:

回复 zhang yanrong:

非常感谢您的回复,这个状态我也试过,发现也不能正确写入…已经要崩溃了…

zhang yanrong:

回复 sheng tao:

你可以試試在初始化前讓CS先 H ->  L -> delay -> H  你說你讀資料就不是每次都對 也許是你CPOL跟CPHA設定不正確,從datasheet可以看到CS ->L 之後的第一個CLK的上升沿讀取資料,CLK的速度必須在20MHz以內當然也有很大的可能是你的電路設計不正確

sheng tao:

回复 zhang yanrong:

非常感谢回复。我现在在CS L之后加入了比较长的延时(约10us),发现读取已经稳定了。也能够将数据写入寄存器。但是按照ads1293的datasheet上的流程,配置为3联导之后,发现DRDYB管脚没有输出。

赞(0)
未经允许不得转载:TI中文支持网 » ADS1293 SPI 讀值都為0
分享到: 更多 (0)