本文轉自公眾號,歡迎關注
基于DWC2的USB驅動開發-高速設備速度握手詳解 (qq.com)
前言
前面我們分析了USB連接和復位的過程, 也知道低速和全速/高速的USB設備分別是上拉DM和DP,主機通過不同的上拉區分接的是低速還是全速/高速設備的。但是怎么區分全速和高速呢? 這就需要額外的一些握手過程,本篇就來詳細介紹該過程。
高速握手過程
USB連接檢測過程見如下
https://mp.weixin.qq.com/s/T6pbLP83IIeJDvM_6ogQDA
USB復位過程見
https://mp.weixin.qq.com/s/8xKca-XPjZXAiO6MOQVGAQ
對于低速設備上拉DM,主機檢測到該上拉,然后發送復位就完了
對于全速和高速設備上拉DP,主機檢測到該上拉,然后發送復位,接下來是速度握手過程。
老規矩我們從規格書入手,USB2.0規格書P154中《High-speed Detection Handshake (not performed if low-speed device detected by hub):》有描述整個過程,但是這都是文字描述,不是很直觀,所以我們理論結合實踐,直接根據真實的波形和規格書的描述對照進行分析。
在速度握手中,主機(集線器)和設備都需要檢測擁有最小持續時間的Chirp J和K, 涉及到兩個關鍵信號Chirp J和K(參見規格書7.1 Signaling或者本系列文章)。
整個過程如下
(1)設備使能DP上拉1.5K,如下圖的(1)處,此時DP大概3V左右
(2)主機檢測到DP拉高,檢測到設備連接,發送SE0進行復位
如上圖的(2),因為時間很短,下面是細節圖,可以看到下圖SE0狀態只維持了8uS,后面就是藍色線(DM)高于黃色線即Chirp K信號,對應上圖的(3)部分。
回顧一下復位分析那一篇文章,發送放復位會持續50mS,但是接收方在最低2.5uS就可以識別到復位,這里實測是8uS設備就識別到復位然后開始發送Chirp K信號了。
保持D+上的1.5K上拉電阻使能,設備發送Chirp K信號是通過,禁用高速終端電阻,并將高速信號電流驅動到D-線完成的。
這里有點不理解禁用了終端電阻,電流驅動到D-線,電流環路是什么?
并且如下可以看到DM有1.2V左右,這個電壓是如何來的?
該Chirp K信號必須持續不少于1.0 ms(TUCH),并且在高速復位時間T0點(即主機發出的SE0開始)后不超過7.0 ms(TUCHEND)結束。
Chirp K持續時間如下所示,這里是2mS,滿足上述要求
參數TUCH和TUCHEND的值在手冊中的描述如下
上述可以看到Chirp K的信號,DM大概是1.1V左右,比后面的KJ序列高一點。
(3)主機(集線器)必須在看到chirp K信號持續2.5μs(TFILT)時間以上,后認為檢測到設備發出的ChirpK,這里的2.5uS的要是實際是相當于濾波避免干擾。如果主機(集線器)未檢測到設備發出的chirp K信號,則必須繼續發送SE0,直到復位結束(持續50mS)。
TFILT參數見規格書如下處說明
在Chirp K狀態結束后不超過100μs(TWTDCH),主機(集線器)必須開始發送Chirp K和Chirp J的交替序列,J和K之間不得存在空閑狀態。此序列必須持續到復位結束前不超過500μs且不少于100μs的時間(TDCHSE0)(這樣的目的是保證總線保持活動狀態,防止設備進入高速掛起狀態。)。每個單獨的Chirp K和Chirp J必須持續不少于40μs且不超過60μs(TDCHBIT)。
TWTDCH,TDCHSE0,TDCHBIT的參數上圖。
如下圖(4)處
細節圖如下
如下可以看到要求Chirp K結束100μs(TWTDCH)以內開始后面的KJ序列,實際10uS左右就開始了,滿足要求。
如下圖所示,主機發送的KJ序列持續了約50mS,即約復位的時間,實際要求是發送到復位結束前的100μs~500uS,這里示波器能力有限就不展示下圖右邊紅色圈處的細節了。
在K-J序列之后,主機(集線器)發送SE0,直到復位結束,即上面說的KJ序列之后100~500uS復位結束。復位結束時,主機(集線器)必須轉換到高速啟用狀態,而不會在數據線上引起任何轉換。
(4)設備這端發送完Chirp K之后監控主機發送的K-J序列。設備端需要至少看到3對K-J序列,即序列Chirp K-J-K-J-K-J才認為是有效的KJ序列。每個單獨的Chirp K和Chirp J必須檢測不少于2.5μs(TFILT)。
我們這里看到有持續50uS滿足要求
如果設備檢測到序列Chirp K-J-K-J-K-J,則檢測后不超過500μs(TWTHS),設備需要斷開D+上拉電阻器,啟用高速終端,并進入高速默認狀態。
如下圖所示,這里剛好約500uS左右進行了上述切換,上述切換也導致了DP和DM的電平的變化,原來KJ序列大概是0.8V左右,即主機發送KJ是通過電流17.78mA驅動45歐終端電阻實現的,17.78mA*45即0.8V。而我們又看到后面箭頭處的電壓下降,是因為正好是上述的設備切換到了高速模式,使能了45Ω終端電阻,所以設備的終端電阻和主機的終端電阻并聯只有一般電阻,所以電壓就只有一般0.4V左右了。
如果設備在完成其自己的Chirp K之后,在不小于1.0ms且不大于2.5ms(TWTFS)的時間內未檢測到有效KJ序列,則設備需要恢復到全速默認狀態并等待復位結束。
以上就是整個速度握手的過程,比較細節,我們再做一些總結
關于整體電壓的變化,如下圖,有4個等級,圖中(1)和(2)之間還有個復位的SE0電平這里就略掉了。
(1)即設備通過DP上拉,即15K和1.5k的分壓,3.3x15/(1.5+15) DP大概3V.
(2)設備發送Chirp K,DP 1.5K上拉還在,設備終端電阻禁用,實測D-上的電壓是大概1.2V,這里的電流路徑是什么? 待確定。
(3)主機發送KJ序列,主機通過驅動17.78mA電流到對應45歐終端電阻,發送KJ,所以DP DM是0.8V
(4)設備也進入了高速模式,1.5k上拉斷開,設備使能了45歐終端電阻,和主機的終端電阻并聯,主機繼續在發KJ序列,此時主機的17.78mA電流驅動只能產生0.4V的電壓。
驅動編寫
手冊P522 5.4.47 DCFG的bit[1:0]DevSpd用于配置設備期望工作過的速度,注意這里是期望,而不是一定,因為還需要速度握手過程,比如這里配置為高速,則還需要看主機是否支持高速。
所以我們需要在初始化時配置該位,告訴控制器后面以該速度去進行速度握手。那么握手結束之后實際是什么速度呢,手冊P539的5.4.49 DSTS寄存器的位[2:1]EnumSpd可以看到
在速度握手完成之后還會產生中斷,
手冊P369寄存器5.4.7 GINTMSK的位13 EnumDoneMsk設置為1使能,速度握手完成中斷。
相應的手冊P357寄存器5.4.6 GINTSTS的位13EnumDone為中斷標志,寫1清除標志
所以驅動的基本過程是
1.初始化配置DevSpd設置期望的工作速度
2.配置EnumDoneMsk使能中斷,清除標志EnumDone
3.等待中斷,查詢實際握手的速度EnumSpd,根據該速度再次重新配置DevSpd設置工作過速度。并清除標志EnumDone。
以上就完成了整個速度握手過程。
實際以上邏輯如果是非標主機,可能會存在BUG,后面會有一個實際案例進行分享,先賣個關子以后再單獨寫一篇文章分享該案例。
如下圖兩個箭頭處分別對應的是復位中斷,和速度握手完成中斷
我們通過中斷服務函數中打印時間戳(注意要用非阻塞方式),看到Reset_Intr和High speed之間的時間剛好是50mS(打印的是uS單位),和圖中對應
而我們在usb_dev_crtl_sft_discon(0);使能DP上拉時也加一個打印,即上面connect后打印的時間戳和Reset_Intr之間是50mS,如下圖
總結
以上介紹了整個速度握手過程,以及設備驅動的編寫。重點是結合手冊的描述對照波形去看和分析,要了解沒以一個實踐段,每一個信號,每一個電平的含義和原理,知道那個信號是誰驅動的,為什么是這個波形,一定要自己親自用示波器去抓波形,而不要使用別人的波形,因為不同的設備可能略有差異,如何去觸發,如何去抓波形,也會加深自己的理解。
-
嵌入式
+關注
關注
5086文章
19141瀏覽量
305976 -
usb
+關注
關注
60文章
7955瀏覽量
264989 -
USB2.0
+關注
關注
2文章
186瀏覽量
46120 -
USB驅動
+關注
關注
1文章
137瀏覽量
20214 -
DWC2
+關注
關注
0文章
35瀏覽量
140
發布評論請先 登錄
相關推薦
評論