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