劉清明,方 毅,王 永
(1.中國科學技術大學 電子科學與技術系,安徽 合肥230027;2.中國科學技術大學 信息科學實驗中心,安徽 合肥230027)
通用串行總線USB(Universe Serial Bus)的出現大大簡化了計算機與外設間的互聯,USB具有使用方便、支持多種速率傳輸、高可靠性以及價格低廉等非常優秀的特點[1]。USB發展非常迅速,目前已經成為最常用的接口方式。USB的發展歷史從最初的只支持低速(1.5 Mb/s)和全速(12 Mb/s)的 USB1.0、USB1.1,發展到支持全速(12 Mb/s)和高速(480 Mb/s)的 USB2.0,最新標準 USB3.1于2013年發布,USB3.1支持全速和高速傳輸,并在USB3.0超高速模式(5 Gb/s)基礎上把速度提升到10 Gb/s。鑒于USB3.0、USB3.1的主機和集線器向下兼容 USB2.0全速、高速設備,設計開發一款USB2.0設備控制器有重要的實際意義[2]。USB2.0的設備連接到主機或者集線器之后,默認以全速方式連接,之后主機發出復位信號給所連接的設備,設備控制器需要檢測到復位信號并作出相應的動作,同時進行高速握手,高速握手成功后設備以高速傳輸模式與主機通信。同樣,USB總線一定時間沒有動作,為了省電設備需進入掛起(suspend)狀態,當總線有動作會把掛起的設備喚醒。這些都在USB2.0設備控制器的工作模式控制電路中完成。
圖1所示為USB2.0系統的功能框圖,由USB主機和USB PHY、USB SIE、應用四部分組成。其中USB2.0設備控制器包含物理層(PHY)和串行接口引擎SIE(Serial Interface Engine)兩部分。

圖1 USB2.0系統功能模塊圖
文中設計的USB SIE包括:工作模式控制、數據包處理、USB 事務處理、枚舉控制、TX buffer、RX buffer、設備描述符存儲器。其中工作模式控制模塊完成復位檢測、高速握手、掛起和喚醒。設備與主機建立高速連接后,在通信之前,主機需要了解設備并為設備分配驅動程序,枚舉實現這個過程[3]。枚舉過程首先是主機向默認地址發送Get Desriptor以獲取設備的描述信息,主機了解設備的基本信息后給設備分配新地址。完成地址分配后,主機向分配的新地址發送請求獲取設備能力,以給設備加載適合的驅動程序,驅動程序對設備進行配置。枚舉過程由枚舉控制、USB事務處理、數據包處理、設備描述符存儲器等模塊共同完成。例如,枚舉開始階段主機發送Get Desriptor以獲取設備描述信息,這個控制傳輸事務包含 3個階段:令牌包、數據包、握手包[4]。USB2.0 SIE的數據包模塊檢測接收到的令牌包的包標識(PID)并進行校驗;校驗無誤后接收數據包,并進行PID校驗和對數據的CRC校驗;校驗無誤后向主機返回握手包ACK,以表明一個控制傳輸事務的完成,否則丟棄接收到的數據包并向主機發送NAK握手包。枚舉控制模塊根據這個事務判斷接收到的是Get Desriptor,讀取存儲在描述符存儲器的設備描述符,以IN事務發送給主機。這樣枚舉過程的Get Desriptor控制傳輸完成。工作模式控制電路的正常工作是設備控制器與主機通信并進行數據交互的前提,本文重點介紹此電路的設計。
為判斷設備應該工作在何種狀態,通過檢測USB總線上的狀態及其持續時間來確定。因此程序中設計使用了兩個計數器timer1和timer2,通過使用cleartimer1和cleartimer2兩個變量來靈活控制兩個計數器的計數,進而實現精確定時。
圖2為工作模式控制電路的狀態轉換圖,主要實現4個主要功能:高速握手(highspeed handshake、設備掛起(suspend)、掛起恢復(resume)、復位檢測。

圖2 工作模式控制電路狀態圖
USB2.0設備連接到主機后,主機給設備供電并發送復位信號復位設備,之后設備進入全速模式工作,由圖 2所示在 fullspeed狀態檢測到 SE0(linestate[1:0]=00)持續2.5 μs后,高速握手開始,設備控制器進入 sendchirp狀態,設備向主機發送一個持續時間大于1 ms的K(linestate[1:0]=01)信號以檢測主機是否支持高速模式。設備進入recvchirp狀態并準備接收來自主機的JK序列。主機支持高速并檢測到K之后,向設備發送JKJKJK序列以檢測設備是否支持高速模式。設備控制器在recvchirp狀態成功檢測到3對JK序列后高速握手成功,進入到highspeed模式工作;否則,設備以全速模式工作。
根據USB2.0協議,為了減小功耗,當總線3 ms沒有動作時,設備需進入掛起(suspend)狀態,設備在掛起狀態只能消耗小于500 μA的電流,并且進入掛起后設備需要保留原來的狀態。
(1)全速模式掛起:檢測到總線狀態為SE0達到 3 ms,設備從fullspeed狀態進入suspend狀態。
(2)高速模式掛起:設備工作在高速模式時,由于高速復位和高速掛起都是發送一個大于3 ms的總線空閑信號,因此設備需要區分這兩個事件。如圖2,處于highspeed狀態時,設備檢測到總線空閑(SE0)3 ms,進入hsrevert狀態。之后檢測總線狀態不為SE0,此后設備掛起。假如在 hsrevert狀態后還檢測到 SE0持續 100 μs,則判斷為高速復位,clrtimer2=1。設備狀態轉換到sendchirp狀態,開始設備的高速握手。
設備處于掛起狀態時,在它的上行口接收到任何非空閑信號時可以使設備恢復工作[5]。
(1)全速掛起恢復:設備從掛起狀態起檢測到的不是持續的J,則恢復到fullspeed狀態,以全速模式工作。
(2)高速掛起恢復:掛起時保留著高速連接狀態,highspeed=1且hssupport=1,掛起恢復需要判斷是由總線動作引起還是系統復位引起。設備中測到總線狀態為SE0,說明是由復位引起的掛起恢復,設備狀態進入suspreset,然后檢測到 SE0持續 2.5 μs后,進入高速握手過程sendchirp狀態;反之,檢測到掛起恢復信號 K,則設備從掛起恢復到高速模式。
集線器通過在端口驅動一個SE0狀態向所連接的USB設備發出復位信號。復位操作可以通過USB系統軟件驅動集線器端口發出復位信號,也可以在設備端RESET信號置1,進行硬件復位。
(1)設備是從掛起狀態復位:在suspend狀態檢測到SE0時,設備跳轉到suspreset狀態,檢測總線狀態為超過2.5 μs的SE0后設備啟動高速握手檢測,即進入sendchirp狀態。
(2)設備從非掛起的全速狀態復位:設備在檢測到2.5 μs<T<3.0 ms的 SE0狀態后啟動高速握手檢測。
(3)設備從非掛起的高速狀態復位:設備在highspeed狀態檢測到總線上持續時間3.0 ms的SE0后,設備狀態轉換到hsrevert,以移除高速終端并重連D+的上拉電阻,此時為全速連接狀態;之后設備需要在 100 μs<T<875 μs的時間內采樣總線狀態,檢測到SE0持續2.5 μs后,進入sendchirp狀態,開始高速握手過程。
編寫Testbench,在ModelSim中對設計的SIE進行仿真驗證,結果符合USB2.0協議規范要求。在此簡述工作模式控制電路中關于高速握手的仿真過程和結果。當設備連接到集線器后,進入init狀態,通過timer2計數到OxFFFF(即 17 ms),使設備跳轉 fullspeed狀態。在 fullspeed狀態,timer2計數到 OxA6(即 2.5 μs),設備進入到高速握手的sendchirp階段。Sendchirp代碼如下,對應仿真結果圖3所示。

圖3 發送chirpK檢測主機是否支持高速

支持高速傳輸的主機接收到K后,發送3對KJ序列檢測設備是否支持高速傳輸。設備進入recvchirp狀態,判斷是否接收到符合要求的3對JK序列。Recvchirp狀態對應代碼如下:

檢測到linestate為持續時間達到2.5 μs(timer1計數到OxA6)10或 01時,判斷為檢測到 J或 K chirp。每檢測到一個 K或 J,賦 clrtimer1=1來清零 timer1,同時 chirpcnt加1。設備支持高速傳輸模式,且成功檢測到KJKJKJ,同時chirpcnt計數到6,則設備高速握手成功,進入高速工作模式。假如在chirp檢測等待時間(1.1 ms)內沒有等到檢測到3對KJ信號,則握手失敗,設備以全速模式工作。高速模式下的部分發送波形如圖4所示。

圖4 接收來自主機的JKJKJK握手信號
本文先介紹了USB2.0設備控制器總體架構及各模塊功能,之后詳細分析了USB2.0設備控制器工作模式控制電路需要實現的功能及設計細節,并在系統中進行了仿真驗證。結果表明,所設計的工作模式控制電路功能正確,能配合其他模塊一起進行USB設備開發。
[1]劉志華,郭付才,彭新偉,等.基于 CY7C68013A的FPGA配置和通信接口設計[J].電子技術應用,2013,39(2):18-19.
[2]AXELSON J.USB開發大全(第四版)[M].李鴻鵬,鄭瑞霞,陳香凝,等譯.北京:人民郵電出版社,2011.
[3]蕭世文,宋延清.USB 2.0硬件設計[M].北京.清華大學出版社,2002.
[4]USB serial bus specification revision 2.0[EB/OL].(2002-04)[2014-03].http://www.usb.org.
[5]沈小磊,張曉彤,李占才.USB設備控制器的硬件實現與研[J].計算機工程,2007,33(24):247-249.