哪些網(wǎng)站可以用來(lái)做百科參考西安關(guān)鍵詞優(yōu)化軟件
一、 前言
斷斷續(xù)續(xù)做了不少USB相關(guān)開(kāi)發(fā),但是沒(méi)有系統(tǒng)去了解過(guò),遇到問(wèn)題就很被動(dòng)了。做這個(gè)USB轉(zhuǎn)UART的項(xiàng)目就是,于是專(zhuān)門(mén)花了一天的時(shí)間學(xué)習(xí)USB及CDC相關(guān),到寫(xiě)這文章時(shí)估計(jì)也忘得差不多了,趁項(xiàng)目收尾階段記錄一下,方便后面翻閱。
本文內(nèi)容(包括圖片)絕大多數(shù)來(lái)源網(wǎng)絡(luò),侵刪。參考鏈接:
USB官網(wǎng)
USB通用串行總線基礎(chǔ)知識(shí)詳述
USB端點(diǎn)和傳輸協(xié)議(數(shù)據(jù)包、事物)詳解
二、 總線
USB歷代接口
經(jīng)過(guò)多年發(fā)展,USB速率越來(lái)越高,總線由最初4根線,半雙工發(fā)展到多根線,全雙工。本文是基于 USB 2.0 版本,記錄最初最基礎(chǔ)的知識(shí),了解了這些基礎(chǔ),后面的版本就很容易了。
USB總線
USB全速(高速)接線圖
信號(hào)名稱(chēng) | 說(shuō)明 |
---|---|
Vbus | 電源,DC 5V |
D+ | 叉分信號(hào)線,正 |
D- | 叉分信號(hào)線,負(fù) |
GND | 電源地 |
由上面可知,USB 2.0 只有4根線,兩根數(shù)據(jù)線是高速串行叉分線,半雙工。電源線用來(lái)主機(jī)給從設(shè)備供電,最大500mA, 5V * 500mA = 2.5W, 功率不是很高。后來(lái)的快速充電技術(shù)要么提升了電壓和電流,例如9V * 2A = 18W, 再后來(lái)USB接口增加了電源和數(shù)據(jù)線的數(shù)量,傳輸速率和供電功率都大大提升。
數(shù)據(jù)編解碼和位填充
USB采用NRZI(非歸零編碼)對(duì)發(fā)送的數(shù)據(jù)包進(jìn)行編碼 。輸入數(shù)據(jù)0, 編碼成“電平翻轉(zhuǎn)” ;輸入數(shù)據(jù)1, 編碼成“電平不變” ;(NRZI遇0翻轉(zhuǎn),遇1不變)。
USB NRZi編碼格式
三、 USB總線系統(tǒng)中的設(shè)備
可以分為三種類(lèi)型:
- 主機(jī):?只能有一個(gè),管理USB系統(tǒng);
- 集線器(USB HUB):?用來(lái)擴(kuò)展設(shè)備;
- 設(shè)備:?終端設(shè)備,如下圖的鼠標(biāo)鍵盤(pán)打印機(jī);
USB設(shè)備拓?fù)?/p>
四、 端點(diǎn)(Endpoints)
在USB規(guī)范中,設(shè)備端點(diǎn)是唯一可尋址可通信的基本單元,端點(diǎn)是有通信方向的。物理上一個(gè)USB總線(4根線)連接一個(gè)設(shè)備終端,這個(gè)設(shè)備終端邏輯上可以有多個(gè)接口,每個(gè)接口可以有多個(gè)端點(diǎn),從而在主機(jī)的系統(tǒng)上看該設(shè)備終端可能有多個(gè)設(shè)備。例如本項(xiàng)目,一個(gè)USB口擴(kuò)展7個(gè)UART設(shè)備。
端點(diǎn)0:?每個(gè)終端設(shè)備肯定會(huì)有一個(gè)端點(diǎn)0,用于剛連接到主機(jī)時(shí)的初始化和枚舉。想象一下,一個(gè)USB設(shè)備終端可能有10個(gè)8個(gè)端點(diǎn),剛插到主機(jī)時(shí),主機(jī)并不清楚,所以規(guī)定了一定要有一個(gè)端點(diǎn)0,主機(jī)最開(kāi)始只與端點(diǎn)0通信,然后把其它的設(shè)備,接口,端點(diǎn)枚舉出來(lái)。
端點(diǎn)類(lèi)型
USB規(guī)范定義了四種端點(diǎn)類(lèi)型:
- 控制端點(diǎn): 收發(fā)控制信息,也可以傳輸數(shù)據(jù)。
- 中斷端點(diǎn): 用于傳輸少量的數(shù)據(jù),實(shí)時(shí)時(shí)效性比較好,例如鍵盤(pán)鼠標(biāo)。
- 批量端點(diǎn): 用于傳輸大批量數(shù)據(jù),實(shí)時(shí)時(shí)效性沒(méi)要求,例如U盤(pán)文件傳輸。
-
等時(shí)端點(diǎn): 連續(xù),實(shí)時(shí)的傳輸,例如音頻。
?不同端點(diǎn)類(lèi)型比較
五、 數(shù)據(jù)傳輸
USB通信包含一系列的幀,USB在2.0時(shí)代,分為低速設(shè)備(1.5Mbps),全速設(shè)備(12Mbps)和高速設(shè)設(shè)備(480Mbps).這些設(shè)備使用的幀的時(shí)間間隔是1±0.0005ms,而對(duì)于高速設(shè)備,又將每個(gè)幀分成了8個(gè)微幀,這樣每個(gè)微幀的時(shí)間間隔變成了125±0.0625us。
每一幀包含一個(gè)起始幀(Start of Frame, SOF), 然后是若干個(gè)事務(wù)(Transaction)。每個(gè)事務(wù)由一系列數(shù)據(jù)包(packet)組成。每個(gè)數(shù)據(jù)包以同步標(biāo)識(shí)(SYNC)開(kāi)始,以結(jié)束標(biāo)識(shí)(EOP)結(jié)束。有三種類(lèi)型的包:令牌包,數(shù)據(jù)包,握手包。幀,事務(wù),包關(guān)系如下圖:
USB幀事務(wù)數(shù)據(jù)包關(guān)系圖
包(package)
包是USB系統(tǒng)中信息傳輸?shù)幕締卧?#xff0c;所有數(shù)據(jù)都是經(jīng)過(guò)打包后在總線上傳輸?shù)?。USB包由五部分組成,即同步字段(SYNC)、包標(biāo)識(shí)符字段(PID)、數(shù)據(jù)字段、循環(huán)冗余校驗(yàn)字段(CRC)和包結(jié)尾字段(EOP),包的基本格式如下:
同步域(SYNC)
由8位/32位組成,作為每個(gè)數(shù)據(jù)包的前導(dǎo),用來(lái)產(chǎn)生同步作用,使USB設(shè)備與總線的包傳輸率同步,它的數(shù)值固定為000000001。作用:
- 通知USB串行接口引擎數(shù)據(jù)要開(kāi)始傳輸;
- 同步主機(jī)和設(shè)備之間的時(shí)鐘。
標(biāo)識(shí)符字段(PID)
包標(biāo)識(shí)符PID是用來(lái)標(biāo)識(shí)一個(gè)包的類(lèi)型。PID共有8位,目前USB協(xié)議僅使用4位(PID0 - PID3),另外4位(PID4 - PID7)是PID0 - PID3的取反,用來(lái)校驗(yàn)PID。傳輸?shù)捻樞驗(yàn)镻ID0,PID1,PID2,PID3,...,PID7。
令牌包(token packet, PID1~0為01)、數(shù)據(jù)包(data packet, PID1~0為11)、握手包(handshake packet, PID1~0為10)、特殊包(special packet, PID1~0為00):
令牌類(lèi)型.
特殊包是一些在特殊場(chǎng)合使用的包??偣灿?種:PRE、ERR、SPLIT和PING。其中PRE、SPLIT和PING是令牌包,ERR是握手包。這里不打算展開(kāi)講。
幀傳輸過(guò)程
如下圖,所有通信都由主機(jī)定時(shí)發(fā)起,幀頭一定是SOF,然后包含多個(gè)事務(wù),每個(gè)事務(wù)有多個(gè)包,每個(gè)包都是SYNC開(kāi)頭,EOP結(jié)束。要注意每個(gè)事務(wù)是有應(yīng)答的,即一個(gè)幀里面數(shù)據(jù)傳輸?shù)姆较蚴遣粩嗲袚Q的。下圖中,主機(jī)先發(fā)一個(gè)SOF,然后發(fā)一個(gè)SETUP包,這個(gè)包帶有DATA0,設(shè)備端收到后返回ACK。然后主機(jī)連續(xù)發(fā)了3個(gè)IN令牌包,前2個(gè)從設(shè)備端都回復(fù)NAK,表示無(wú)數(shù)據(jù)上傳。第3個(gè)IN回復(fù)數(shù)據(jù)了,主機(jī)收到后回復(fù)了ACK。然后下一幀,主機(jī)發(fā)送SOF后,發(fā)了個(gè)OUT令牌包,跟著又發(fā)送了數(shù)據(jù)DATA0,從設(shè)備端回復(fù)ACK。
USB幀時(shí)間數(shù)據(jù)傳輸過(guò)程.
舉一個(gè)實(shí)際的例子,全速USB傳輸每一個(gè)幀為1ms。首先會(huì)發(fā)送一個(gè)SOF包(幀起始包),此時(shí)USB主機(jī)檢測(cè)到總線沒(méi)有事務(wù)可以傳輸,則總線進(jìn)入idel(空閑狀態(tài)),這里的空閑時(shí)間996.917us,3us左右是EOP占用的時(shí)間。
5個(gè)idle后,有事務(wù)了,分析一下這次傳輸。同樣的首先會(huì)發(fā)送一個(gè)SOF包(幀起始包),等了176.817us后,緊接著USB主機(jī)會(huì)發(fā)送一個(gè)SETUP令牌包,收到ACK后繼續(xù)SETUP包和數(shù)據(jù)包,從設(shè)備端也返回了ACK包。下一個(gè)是IN的事務(wù),不詳細(xì)講。兩個(gè)事務(wù)傳輸完成后,主機(jī)檢測(cè)到?jīng)]有事務(wù)了,總線同樣會(huì)進(jìn)入空閑狀態(tài),這里空閑了478.767us。所有的時(shí)間開(kāi)銷(xiāo)加起來(lái)差不多1ms。然后后面又有幾個(gè)沒(méi)有事務(wù)的幀。
全速USB幀內(nèi)容
實(shí)際開(kāi)發(fā)中,當(dāng)MCU做從設(shè)備時(shí),一般MCU的軟件架構(gòu)都是在中斷中響應(yīng)主機(jī)端各種交互,例如可配置每個(gè)SOF都產(chǎn)生一個(gè)中斷,或者收到SETUP包后產(chǎn)生中斷,在中斷中處理相應(yīng)事務(wù),軟件不能做太耗時(shí)的處理,一般產(chǎn)生事件標(biāo)志然后異步處理。數(shù)據(jù)IN是預(yù)先拷貝到指定的緩存(或者DMA緩存),當(dāng)主機(jī)輪詢(xún)時(shí),硬件自動(dòng)上傳,沒(méi)有數(shù)據(jù)就回復(fù)NAK。數(shù)據(jù)OUT也是硬件先接收到指定的緩存(或DMA緩存),回復(fù)ACK,接收完后產(chǎn)生中斷,通知軟件處理。
(END)