請問 我是用的晶片是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管脚没有输出。