本文轉自公眾號,歡迎關注
基于DWC2的USB驅動開發-USB連接詳解 (qq.com)
一.前言
之前一直在閱讀手冊,規格書,練習招式,學習心法,從這一篇開始我們就要真刀實槍的干了,當然不是一味蠻干。驅動編寫,調試,實踐的過程會結合閱讀規格書,手冊,理論結合實踐,招式和心法要同步進行。
二.USB連接需要幾步?
進行USB連接需要幾步?我們參考把大象裝進冰箱需要幾步:第一步打開冰箱門,第二步把大象裝入冰箱,第三步關閉冰箱門,完成。USB連接同樣的簡單,第一步插上開發板USB接口到電腦,第二步電腦識別到USB設備,第三步恭喜你獲得一個黃色告警對話框!完美完成!也許很不幸,你沒有獲得黃色告警對話框,那么就是失敗了,后面我們會詳細介紹怎么去分析調試。

三.USB連接原理
前面我們已經完成了USB連接的操作,實踐了師傅教的第一招黑虎掏心,but what?我干了什么?前面我們說過需要理論結合實踐,招式結合心法,招式已經嘗試了,但是到底是什么原理呢?到底是怎么做到的呢?那么就要從心法去探究,USB江湖的最基礎的心法,就是USB2.0的規格書。當然招式也有招式的拳譜劍譜,我們這里就對應的使用的USB控制器IP的規格書(這里是新思的DDC2)和PHY的規格書(microChip的USB334x)。
我們打開USB2.0規格書,翻到141頁看到如下圖,主機(或HUB)端D+和D-均由Rpd=15KΩ的電阻下拉,未接入設備時此時D+和D-都是0V。設備(或者下級HUB)端通過D+或D-上拉Rpu=1.5KΩ來區分是全速還是低速設備,全速設備D+上拉,低速設備D-上拉。設備端的上拉電阻和主機端下拉電阻分壓得到和未接設備時不一樣的電平,主機檢測該電平即可知道有設備插入,原理就是這么簡單,牛逼的武功也往往是很簡單,比如六脈神劍也就那么一彈手指。

為什么是上拉1.5K呢,因為上拉電阻要保證分壓值不小于VIH(min),因為只有滿足該條件才能被識別為高,為什么這個電壓能識別為高呢,那就是硬件電氣特性決定的了,我喜歡死纏爛打的追問的伙伴,可以繼續深挖到收發器,晶體管,半導體.... ,如果能追到這一層的那么肯定是孤獨求敗級別的高手了,膜拜之。VIH在規格書中的要求如下至少要為2V(可以規格書中搜索找到)

除了上述要求,上拉電阻還要保證能夠在2.5μs的最小復位時間內將D+或D-從0V上拉至VIH(min),因為在復位結束時要進行總線狀態評估。
2.5uS的要求在如下表格中說明,即復位最短時間是2.5uS.

綜上要求,具有可拆卸電纜的設備使用1.5 k? ±5%電阻器連接到3.0 V和3.6 V之間的電壓源(VTERM),以滿足這些要求。帶有固定電纜的設備可以使用替代端接方式。但是,任何終端的Thevenin(戴維寧)電阻必須不小于900?.注:終端的Thevenin(戴維寧)電阻不包括主機/集線器上的15 k±5%的電阻。
上拉電阻器上的電壓源必須來源于USB電纜上提供的電源或由USB電纜上的電源控制,以便在移除VBUS時,上拉電阻器不會在其連接的數據線上提供電流。即VBUS斷開時上拉也應該斷開。
上述表中描述的是針對低速和高速設備連接檢測,高速呢,高速設備的連接檢測和全速一樣,只是后面速度枚舉有不同,這個先按下不表,后面再講解。
四.USB連接驅動
驅動編寫我們參考控制器IP的手冊,找到如下寄存器
手冊P529的5.4.48 DCTL,Offset: 0x804,bit1



可以看到默認值是1,即默認是斷開上拉電阻的,注意這里的邏輯,這個bit表示斷開連接。
軟件寫0上拉電阻,這樣在DP或者DM上上拉電阻(根據速度而定,如何設置速度枚舉速度后面再講),這樣主機就可以檢測到了。
注意軟件操作這個bit時不要過于頻繁,一般留個10mS以上充足的間隔時間,大于上述手冊中的描述時間。
注意該位不受控制器軟件復位影響。
我們的驅動代碼如下,寄存器的操作封裝,參考之前的文章,為什么用宏不用結構體,也有專門的文章講解,可以去瞅瞅。
static void usb_dev_crtl_sft_discon(uint8_t dis)
{
if (dis) {
REG_OTG_DCTL |= DCTL_SOFT_DISCONN;
} else {
REG_OTG_DCTL &= ~(DCTL_SOFT_DISCONN);
}
}
我們之前一直強調,要了解根本原理,不管學習招式還是學習心法,一定要追其核心根本原理。那么這個bit寫0就能上拉,到底是怎么實現的呢,
我們這里操作的是控制器即LINK,但是實際工作是由PHY去完成的,所以寫了這個bit之后,
LINK會通過PHY和LINK之間的UTMI或者ULPI接口告訴PHY,最終由PHY去完成這個上拉工作。于是乎我們去翻閱PHY的手冊這里是USB334x,看到如下圖,正是PHY將如下上拉電阻拉高來實現連接,至此我們已經了解了整個過程。

從ULPI的規格書中還可以看到實際是通過PHY對應的寄存器相關位配置為不同的模式來控制的

而UTMI接口中直接對應的是信號線

這里順便提一下,ULPI對UTMI引腳的縮減,實際就是通過將一些信號線直接控制轉為寄存器控制來達到的。
但是有好問者,會問那么LINK是怎么告訴PHY要去上拉電阻的呢,問得很好,高手總是從刨根問底開始的。這個就要了解UTMI和ULPI協議了,可以參考本系列文章,講解了ULPI協議,甚至講解了如何使用邏輯分析儀抓包ULPI,那么你就可以抓到ULPI接口上具體的數據,來調試分析了,比如最終沒能上拉,通過ULPI抓包可以確定是沒有發送到PHY還是PHY沒有執行,進一步縮小范圍。
https://mp.weixin.qq.com/s/e4MCpASUXW4oKzfYOdMRwg
https://mp.weixin.qq.com/s/7oTIgxvrui_ZdjCktFo87g
還有更細致的會問,那么這個上拉電阻是所有芯片都會有嗎,答案是否,有些芯片是沒有的,比如一些STM32的MCU,這個時候需要外部提供上拉電路,使用IO控制。如下(網上隨便找的一張圖),USB_E來控制上拉。

五.調試
上面我們如果能看到電腦彈出黃色告警的對話框,恭喜你,你已經練就了第一招黑虎掏心。如果不幸沒有彈出呢,那么我們就需要進行調試。那么就要派出示波器出來一展身手了。
我們直接使用示波器監控DP和DM的電平,查看初始是否都為0,然后connect后DP,DM是否對應的拉高,拉高的值是否符合要求達到了VIH(min)。如果沒有拉高則從以下方面去分析:
1.硬件檢查,使用萬用表測量DP DM到芯片的相應引腳是否聯通,測試DP,DM是否和地或者VCC短路。如果外置PHY則檢查PHY是否工作,通過時鐘等關鍵引腳判斷。
2.將DP DM配置為普通IO,翻轉IO使用示波器查看硬件連通性。強調下該方式是嵌入式一種常用的測試方法,用于確認IO到硬件上是否正常聯通,有時還可以使用IO做時序分析測試,即在一定的事件發生時翻轉IO,用示波器測量,這比使用軟件定時器和串口打印更精確。多個通道還可以可視化展現相位關系,簡單的一招確是調試的大招。
3.檢查DP DM是否按照芯片手冊配置為了對應的功能,包括輸入輸出模式,功能選擇等,有些芯片可能需要重映射。
4.檢查USB相關的初始化是否正確,包括時鐘使能,IO模塊使能,外設模塊使能,時鐘配置(比如48M時鐘源等),檢查模塊復位,模塊寄存器保護等?;刈x寄存器確認相應的寄存器是否確實配置成功,回讀總是必要的,可靠性編程中需要考慮,寫入不一定成功的,芯片也是有出錯概率的。
我這里針對DWC的IP,測試代碼如下,10mS進行一次斷開和連接使用示波器查看
while(1)
{
usb_dev_crtl_sft_discon(0);
iot_timer_delay_ms(10);
usb_dev_crtl_sft_discon(1);
iot_timer_delay_ms(10);
}
我這里是高速模式,示波器測試DP波形(黃色)如下:

六.總結
以上可以看出USB連接原理很簡單,就是一個上拉電阻,就好比將大象裝進冰箱一樣簡單。招式雖簡單,但是其背后的心法,原理確很重要,細節也很重要。這就是為什么喬峰使出黑虎掏心如此威力巨大,而一些綠林大漢使出來確平平無奇,這是心法和招式理解是否達到了爐火純晴的地步的區別。USB連接也是如此,只是知道上拉,還是知道LINK的寄存器如何配置,還是知道LINK和PHY如何通訊告訴PHY去上拉,甚至知道如何去抓包確認,還是知道上拉電阻為什么是1.5K有什么要滿足的條件,還是知道芯片不帶上拉如何去外置上拉等等,都是對應不同的級別。看來一招USB連接,一招黑虎掏心也可以分為18級,只有練到最高級爐火純青才能所向披靡,遇BUG解BUG,遇fault殺fault。
審核編輯 黃宇
-
usb
+關注
關注
60文章
8053瀏覽量
269030 -
USB驅動
+關注
關注
1文章
137瀏覽量
20528 -
驅動開發
+關注
關注
0文章
133瀏覽量
12207 -
DWC2
+關注
關注
0文章
35瀏覽量
205
發布評論請先 登錄
相關推薦
基于DWC2的USB驅動開發-0x02 DWC2 USB2.0 IP功能特征介紹

基于DWC2的USB驅動開發-高速設備枚舉為全速設備問題案例分析

基于DWC2的USB驅動開發-發送相關的寄存器DMA寄存器詳解

基于DWC2的USB驅動開發-USB包詳解

新思 DWC2 的參考手冊從哪里可以下載
RK3399平臺上USB控制器和PHY的連接方式和配置說明
如何對基于hal庫的DWC2 USB IP進行調試呢
無法讓USB主機正常工作是我做錯了什么嗎?
基于DWC2的USB驅動開發-高速設備速度握手詳解

評論