標題: 奇怪的XPT2046_ADC芯片的SPI時序! [打印本頁]

作者: SHANWAZI    時間: 2021-11-11 20:56
標題: 奇怪的XPT2046_ADC芯片的SPI時序!
今天在寫XPT2046的ADC芯片程序時發(fā)現(xiàn)的一個問題對芯片使用SPI方式寫入指令時的時序問題下面上邏輯分析儀波形圖:

請看圖一:
0通道為時鐘信號
1通道為單片機寫入信號(數(shù)據(jù))
2通道為ADC    輸出信號(數(shù)據(jù))
3通道為片選信號(略)

根據(jù)數(shù)據(jù)手冊得知:控制字節(jié)的位在時鐘的上升沿時鎖存進去。
問題1:就是在對于的邏輯分析儀2通道可以看到在寫入控制字節(jié)時(因為時鐘出現(xiàn)下降沿???)也出現(xiàn)了讀出的時序,寫入的同時就在輸出???? 而且在讀的時候同時也在寫入(是因為讀的時候時鐘產(chǎn)生了上升沿嗎????)

問題2:特別是BUSY忙時腳位到底時干嘛的?控制字節(jié)寫完后此腳產(chǎn)生一個時鐘周期的高電平???(是不是可以認為是等待ADC轉(zhuǎn)換完畢的時間??)
DOUT引腳會送出ADC轉(zhuǎn)換的數(shù)字量的最高位?

虛心向論壇老鐵請教一下。。。。。。。。!


CS_N:芯片選中信號,當CS_N被拉低時,用來控制轉(zhuǎn)換時序并使能串行輸入/輸出寄存器以移出或移入數(shù)據(jù)。當該引腳為高電平時,芯片(ADC)進入掉電模式。
DCLK:外部時鐘輸入,該時鐘用來驅(qū)動SARADC的轉(zhuǎn)換進程并驅(qū)動數(shù)字IO上的串行數(shù)據(jù)傳輸。
DIN:芯片的數(shù)據(jù)串行輸入腳,當CS為低電平時,數(shù)據(jù)在串行時鐘DCLK的上升沿被鎖存到片上的寄存器。
DOUT:串行數(shù)據(jù)輸出,在串行時鐘DCLK的下降沿數(shù)據(jù)從此引腳上移出,當CS_N引腳為高電平時,該引腳為高阻態(tài)。

BUSY:忙輸出信號,當芯片接收完命令并開始轉(zhuǎn)換時,該引腳產(chǎn)生一個DCLK周期的高電平。
當該引腳由高點平變?yōu)榈碗娖降臅r刻,轉(zhuǎn)換結(jié)果的最高位數(shù)據(jù)呈現(xiàn)在DOUT引腳上,
主控可以讀取DOUT的值。當CS_N引腳為高電平時,BUSY引腳為高阻態(tài)。

2.PNG (45.91 KB, 下載次數(shù): 126)

完整時序圖

完整時序圖

作者: rayin    時間: 2021-11-12 08:42
2046這個電阻觸控IC上個月用過, clcok 信號要輸入8+1+16個,前面8個是寫入控制字節(jié)0x90,0xd0, 再給一個clcok用于清除busy信號, 后面16個clock是用來接收12位AD轉(zhuǎn)換xy的坐標。
問題1: 寫入0x90,0xd0的時候,2046是不會發(fā)送AD信號的。要等busy信號清除之后,才發(fā)送。我用的過程中,寫入0x90,0xd0的時候,miso上是沒有信號跳變的,清除busy信號之后,2046才外發(fā)數(shù)據(jù)。
問題2:busy信號是AD轉(zhuǎn)換過程需要花費時間,完成了2046會清除。

以上是我的一點經(jīng)驗共享。
作者: SHANWAZI    時間: 2021-11-12 10:24
rayin 發(fā)表于 2021-11-12 08:42
2046這個電阻觸控IC上個月用過, clcok 信號要輸入8+1+16個,前面8個是寫入控制字節(jié)0x90,0xd0, 再給一個clc ...

非常感謝分享經(jīng)驗!我現(xiàn)在只是使用此芯片作為ADC模塊 且并沒有把BUSY管腳到單片機上。
現(xiàn)在的這個時序好奇怪并沒有讀取DOUT的數(shù)據(jù),
寫的同時也會有數(shù)據(jù)返回。。。。。!一時半會弄不明白。。。。!
作者: 188610329    時間: 2021-11-12 14:42
DOUT 一般需要10K上拉,你的MISO 低電平肯定有問題,沒有信號的時候,即使IO高阻也應該高電平。
作者: SHANWAZI    時間: 2021-11-12 18:12
188610329 發(fā)表于 2021-11-12 14:42
DOUT 一般需要10K上拉,你的MISO 低電平肯定有問題,沒有信號的時候,即使IO高阻也應該高電平。

有的!根據(jù)數(shù)據(jù)手冊所說此腳是AD串行數(shù)字量輸出供單片機讀取 而我單片機IO腳是有對應上拉電阻的10K應該沒什么問題吧? 依您所說即使沒有信號時 和此腳IO高阻也應該出現(xiàn)高電平狀態(tài)!但是現(xiàn)在恰恰相反! 而且出現(xiàn)電平跳變的地方也正是在寫入控制字節(jié)時的CLOCK脈沖下出現(xiàn)的?我現(xiàn)在就是因為這個才感到疑惑。按手冊所說DOUT引腳是在BUSY引腳出現(xiàn)下降沿時ADC轉(zhuǎn)換結(jié)果的最高位會出現(xiàn)在DOUT引腳。現(xiàn)在恰恰是在寫入控制字節(jié)時DOUT就已經(jīng)在輸出了?在邏輯分析儀上可以看出。
作者: SHANWAZI    時間: 2021-11-12 21:33
人工置頂員 發(fā)表于 2021-11-12 18:57
頂一下

感謝!
作者: 188610329    時間: 2021-11-12 22:27
你試試看 調(diào)整一下時序,

拉低CS 之后,拉高DI, 給1微秒的延時之后,再拉高時鐘線,看你的時序圖  時鐘和DI幾乎同時拉高了,是不是這個原因造成你的DOUT 又拉低了呢?因為沒有收到有效信號?
作者: SHANWAZI    時間: 2021-11-14 00:02
188610329 發(fā)表于 2021-11-12 22:27
你試試看 調(diào)整一下時序,

拉低CS 之后,拉高DI, 給1微秒的延時之后,再拉高時鐘線,看你的時序圖  時鐘 ...

以按照您建議操作也并未有啥改善  反倒直接沒有輸出了!尷尬
作者: TTQ001    時間: 2021-11-14 03:48
感謝分享有關(guān) SPI 時序
作者: rayin    時間: 2021-11-14 09:56
用示波器抓下波形相對邏輯分析儀要準確一點, 邏輯分析儀對速度快點的信號可能不準確,給你造成誤導. 希望對你有用.
作者: SHANWAZI    時間: 2021-11-14 11:25
TTQ001 發(fā)表于 2021-11-14 03:48
感謝分享有關(guān) SPI 時序

一起學習
作者: SHANWAZI    時間: 2021-11-14 11:26
rayin 發(fā)表于 2021-11-14 09:56
用示波器抓下波形相對邏輯分析儀要準確一點, 邏輯分析儀對速度快點的信號可能不準確,給你造成誤導. 希望對 ...

感謝提出建議!
作者: 188610329    時間: 2021-11-14 12:49
SHANWAZI 發(fā)表于 2021-11-14 00:02
以按照您建議操作也并未有啥改善  反倒直接沒有輸出了!尷尬

是這個東西吧?



按時序圖上看, CS拉底后,DI 必須置1,然后再給時鐘,此時Dout會為低,所以你說的沒“輸出”如果指為低,那么就對了。
唯一不確定的,就是下面那兩條線Dirver1 and 2,是否必須在第五個時鐘拉高,是不是必要條件,但是感覺,拉高的時機來看,必須拉高了,后面才會有Busy, Dout才會有回傳。你現(xiàn)在橫豎不成功,可以試試。

作者: SHANWAZI    時間: 2021-11-14 13:22
188610329 發(fā)表于 2021-11-14 12:49
是這個東西吧?

是的是的他的真正在處于轉(zhuǎn)換是不是在BUSY變成高電平后的八個時鐘周期或者是12個?
作者: 188610329    時間: 2021-11-14 14:05
SHANWAZI 發(fā)表于 2021-11-14 13:22
是的是的他的真正在處于轉(zhuǎn)換是不是在BUSY變成高電平后的八個時鐘周期或者是12個?

真正轉(zhuǎn)換,應該在busy為高,表示在轉(zhuǎn)換。
此時你再給一個時鐘,之后,就安靜等待Busy為低,等到busy 為低了,DOUT就會輸出,可能是1可能是0這個不用管,反正給夠12個時鐘,收足12個位數(shù)據(jù),然后再算到底是多少。
作者: SHANWAZI    時間: 2021-11-14 14:39
188610329 發(fā)表于 2021-11-14 14:05
真正轉(zhuǎn)換,應該在busy為高,表示在轉(zhuǎn)換。
此時你再給一個時鐘,之后,就安靜等待Busy為低,等到busy 為 ...






實際上籃筐這里才是才是真正的AD轉(zhuǎn)換對不???也就是BUSY變?yōu)楦唠娖胶蟮?nbsp; 前面的控制字節(jié)寫完后BUSY就是高電平了,
是不是可以考慮使用一點延時等一下過去????BUSY的下降沿時刻會把ADC結(jié)果最高位出現(xiàn)在DOUT供外部讀取。。。!

作者: 188610329    時間: 2021-11-14 16:32
當Dout開始輸出的時候,轉(zhuǎn)換已經(jīng)完畢了,
所以,你唯一需要等待的,只是BUSY 變低電平。
代碼上來講,你只需要在發(fā)完P(guān)D0之后, BUSY == 1 之后,
再給一個時鐘 即第9時鐘,之后,
while(BUSY);  傻等BUSY為0即可
然后,就是接受12位數(shù)據(jù)。
按時序圖上看,收完11位數(shù)據(jù)后,收最后一位數(shù)據(jù)時 Driver 2 需要給低電平,然后再給3個空時鐘,然后CS拉高。
作者: SHANWAZI    時間: 2021-11-14 16:59
188610329 發(fā)表于 2021-11-14 16:32
當Dout開始輸出的時候,轉(zhuǎn)換已經(jīng)完畢了,
所以,你唯一需要等待的,只是BUSY 變低電平。
代碼上來講,你 ...

感謝指導。。。!  似乎明白這時序圖了。。!原來一直是我看錯時序圖了。
作者: SHANWAZI    時間: 2021-11-14 20:57
SHANWAZI 發(fā)表于 2021-11-14 16:59
感謝指導!。。!  似乎明白這時序圖了。。!原來一直是我看錯時序圖了。



但是看起來時序也不太對  和實際輸出值差異大讀取錯誤。。。。。。。。!

作者: 188610329    時間: 2021-11-14 22:07
你試試看極端值,比如最低,或者最高,是不是給你全0,全1,是的話,就說明,通訊肯定是對的,如果不是的話,那么還是分析分析Driver 1 & 2 這里是不是有什么問題。 手冊我沒仔細看。畢竟這芯片我也沒有,研究了也沒啥用,但是,比較確定的是,Driver 1 & 2 肯定是有一定用處的。 也許是觸控板的控制,也許是ADC控制,細讀手冊吧, 按IO的標注來看,通信協(xié)議有點類似 MicroWire 非常接近SPI 但不是SPI的協(xié)議,比如第一個1, 以及等待Busy, 都是MicorWire 協(xié)議的特征,所以,如果真是MicroWire協(xié)議的話,那么,時序要求是非常嚴格的,你再仔細對照手冊看看吧。不排除,要ADC之前,要額外發(fā)個什么指令初始化之類的。
作者: SHANWAZI    時間: 2021-11-15 21:58
188610329 發(fā)表于 2021-11-14 22:07
你試試看極端值,比如最低,或者最高,是不是給你全0,全1,是的話,就說明,通訊肯定是對的,如果不是的話 ...

非常感謝提出建議和思路我再細看一下芯片手冊。。。。。。。
作者: 孫燁    時間: 2024-4-25 14:24
SHANWAZI 發(fā)表于 2021-11-15 21:58
非常感謝提出建議和思路我再細看一下芯片手冊。。。。。。。

你好,我也遇到這個問題,不知道能否給一下后面您的進一步探究結(jié)果




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1