劉清明,方 毅,王 永
(1.中國(guó)科學(xué)技術(shù)大學(xué) 電子科學(xué)與技術(shù)系,安徽 合肥230027;2.中國(guó)科學(xué)技術(shù)大學(xué) 信息科學(xué)實(shí)驗(yàn)中心,安徽 合肥230027)
通用串行總線USB(Universe Serial Bus)的出現(xiàn)大大簡(jiǎn)化了計(jì)算機(jī)與外設(shè)間的互聯(lián),USB具有使用方便、支持多種速率傳輸、高可靠性以及價(jià)格低廉等非常優(yōu)秀的特點(diǎn)[1]。USB發(fā)展非常迅速,目前已經(jīng)成為最常用的接口方式。USB的發(fā)展歷史從最初的只支持低速(1.5 Mb/s)和全速(12 Mb/s)的 USB1.0、USB1.1,發(fā)展到支持全速(12 Mb/s)和高速(480 Mb/s)的 USB2.0,最新標(biāo)準(zhǔn) USB3.1于2013年發(fā)布,USB3.1支持全速和高速傳輸,并在USB3.0超高速模式(5 Gb/s)基礎(chǔ)上把速度提升到10 Gb/s。鑒于USB3.0、USB3.1的主機(jī)和集線器向下兼容 USB2.0全速、高速設(shè)備,設(shè)計(jì)開(kāi)發(fā)一款USB2.0設(shè)備控制器有重要的實(shí)際意義[2]。USB2.0的設(shè)備連接到主機(jī)或者集線器之后,默認(rèn)以全速方式連接,之后主機(jī)發(fā)出復(fù)位信號(hào)給所連接的設(shè)備,設(shè)備控制器需要檢測(cè)到復(fù)位信號(hào)并作出相應(yīng)的動(dòng)作,同時(shí)進(jìn)行高速握手,高速握手成功后設(shè)備以高速傳輸模式與主機(jī)通信。同樣,USB總線一定時(shí)間沒(méi)有動(dòng)作,為了省電設(shè)備需進(jìn)入掛起(suspend)狀態(tài),當(dāng)總線有動(dòng)作會(huì)把掛起的設(shè)備喚醒。這些都在USB2.0設(shè)備控制器的工作模式控制電路中完成。
圖1所示為USB2.0系統(tǒng)的功能框圖,由USB主機(jī)和USB PHY、USB SIE、應(yīng)用四部分組成。其中USB2.0設(shè)備控制器包含物理層(PHY)和串行接口引擎SIE(Serial Interface Engine)兩部分。
圖1 USB2.0系統(tǒng)功能模塊圖
文中設(shè)計(jì)的USB SIE包括:工作模式控制、數(shù)據(jù)包處理、USB 事務(wù)處理、枚舉控制、TX buffer、RX buffer、設(shè)備描述符存儲(chǔ)器。其中工作模式控制模塊完成復(fù)位檢測(cè)、高速握手、掛起和喚醒。設(shè)備與主機(jī)建立高速連接后,在通信之前,主機(jī)需要了解設(shè)備并為設(shè)備分配驅(qū)動(dòng)程序,枚舉實(shí)現(xiàn)這個(gè)過(guò)程[3]。枚舉過(guò)程首先是主機(jī)向默認(rèn)地址發(fā)送Get Desriptor以獲取設(shè)備的描述信息,主機(jī)了解設(shè)備的基本信息后給設(shè)備分配新地址。完成地址分配后,主機(jī)向分配的新地址發(fā)送請(qǐng)求獲取設(shè)備能力,以給設(shè)備加載適合的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序?qū)υO(shè)備進(jìn)行配置。枚舉過(guò)程由枚舉控制、USB事務(wù)處理、數(shù)據(jù)包處理、設(shè)備描述符存儲(chǔ)器等模塊共同完成。例如,枚舉開(kāi)始階段主機(jī)發(fā)送Get Desriptor以獲取設(shè)備描述信息,這個(gè)控制傳輸事務(wù)包含 3個(gè)階段:令牌包、數(shù)據(jù)包、握手包[4]。USB2.0 SIE的數(shù)據(jù)包模塊檢測(cè)接收到的令牌包的包標(biāo)識(shí)(PID)并進(jìn)行校驗(yàn);校驗(yàn)無(wú)誤后接收數(shù)據(jù)包,并進(jìn)行PID校驗(yàn)和對(duì)數(shù)據(jù)的CRC校驗(yàn);校驗(yàn)無(wú)誤后向主機(jī)返回握手包ACK,以表明一個(gè)控制傳輸事務(wù)的完成,否則丟棄接收到的數(shù)據(jù)包并向主機(jī)發(fā)送NAK握手包。枚舉控制模塊根據(jù)這個(gè)事務(wù)判斷接收到的是Get Desriptor,讀取存儲(chǔ)在描述符存儲(chǔ)器的設(shè)備描述符,以IN事務(wù)發(fā)送給主機(jī)。這樣枚舉過(guò)程的Get Desriptor控制傳輸完成。工作模式控制電路的正常工作是設(shè)備控制器與主機(jī)通信并進(jìn)行數(shù)據(jù)交互的前提,本文重點(diǎn)介紹此電路的設(shè)計(jì)。
為判斷設(shè)備應(yīng)該工作在何種狀態(tài),通過(guò)檢測(cè)USB總線上的狀態(tài)及其持續(xù)時(shí)間來(lái)確定。因此程序中設(shè)計(jì)使用了兩個(gè)計(jì)數(shù)器timer1和timer2,通過(guò)使用cleartimer1和cleartimer2兩個(gè)變量來(lái)靈活控制兩個(gè)計(jì)數(shù)器的計(jì)數(shù),進(jìn)而實(shí)現(xiàn)精確定時(shí)。
圖2為工作模式控制電路的狀態(tài)轉(zhuǎn)換圖,主要實(shí)現(xiàn)4個(gè)主要功能:高速握手(highspeed handshake、設(shè)備掛起(suspend)、掛起恢復(fù)(resume)、復(fù)位檢測(cè)。
圖2 工作模式控制電路狀態(tài)圖
USB2.0設(shè)備連接到主機(jī)后,主機(jī)給設(shè)備供電并發(fā)送復(fù)位信號(hào)復(fù)位設(shè)備,之后設(shè)備進(jìn)入全速模式工作,由圖 2所示在 fullspeed狀態(tài)檢測(cè)到 SE0(linestate[1:0]=00)持續(xù)2.5 μs后,高速握手開(kāi)始,設(shè)備控制器進(jìn)入 sendchirp狀態(tài),設(shè)備向主機(jī)發(fā)送一個(gè)持續(xù)時(shí)間大于1 ms的K(linestate[1:0]=01)信號(hào)以檢測(cè)主機(jī)是否支持高速模式。設(shè)備進(jìn)入recvchirp狀態(tài)并準(zhǔn)備接收來(lái)自主機(jī)的JK序列。主機(jī)支持高速并檢測(cè)到K之后,向設(shè)備發(fā)送JKJKJK序列以檢測(cè)設(shè)備是否支持高速模式。設(shè)備控制器在recvchirp狀態(tài)成功檢測(cè)到3對(duì)JK序列后高速握手成功,進(jìn)入到highspeed模式工作;否則,設(shè)備以全速模式工作。
根據(jù)USB2.0協(xié)議,為了減小功耗,當(dāng)總線3 ms沒(méi)有動(dòng)作時(shí),設(shè)備需進(jìn)入掛起(suspend)狀態(tài),設(shè)備在掛起狀態(tài)只能消耗小于500 μA的電流,并且進(jìn)入掛起后設(shè)備需要保留原來(lái)的狀態(tài)。
(1)全速模式掛起:檢測(cè)到總線狀態(tài)為SE0達(dá)到 3 ms,設(shè)備從fullspeed狀態(tài)進(jìn)入suspend狀態(tài)。
(2)高速模式掛起:設(shè)備工作在高速模式時(shí),由于高速?gòu)?fù)位和高速掛起都是發(fā)送一個(gè)大于3 ms的總線空閑信號(hào),因此設(shè)備需要區(qū)分這兩個(gè)事件。如圖2,處于highspeed狀態(tài)時(shí),設(shè)備檢測(cè)到總線空閑(SE0)3 ms,進(jìn)入hsrevert狀態(tài)。之后檢測(cè)總線狀態(tài)不為SE0,此后設(shè)備掛起。假如在 hsrevert狀態(tài)后還檢測(cè)到 SE0持續(xù) 100 μs,則判斷為高速?gòu)?fù)位,clrtimer2=1。設(shè)備狀態(tài)轉(zhuǎn)換到sendchirp狀態(tài),開(kāi)始設(shè)備的高速握手。
設(shè)備處于掛起狀態(tài)時(shí),在它的上行口接收到任何非空閑信號(hào)時(shí)可以使設(shè)備恢復(fù)工作[5]。
(1)全速掛起恢復(fù):設(shè)備從掛起狀態(tài)起檢測(cè)到的不是持續(xù)的J,則恢復(fù)到fullspeed狀態(tài),以全速模式工作。
(2)高速掛起恢復(fù):掛起時(shí)保留著高速連接狀態(tài),highspeed=1且hssupport=1,掛起恢復(fù)需要判斷是由總線動(dòng)作引起還是系統(tǒng)復(fù)位引起。設(shè)備中測(cè)到總線狀態(tài)為SE0,說(shuō)明是由復(fù)位引起的掛起恢復(fù),設(shè)備狀態(tài)進(jìn)入suspreset,然后檢測(cè)到 SE0持續(xù) 2.5 μs后,進(jìn)入高速握手過(guò)程sendchirp狀態(tài);反之,檢測(cè)到掛起恢復(fù)信號(hào) K,則設(shè)備從掛起恢復(fù)到高速模式。
集線器通過(guò)在端口驅(qū)動(dòng)一個(gè)SE0狀態(tài)向所連接的USB設(shè)備發(fā)出復(fù)位信號(hào)。復(fù)位操作可以通過(guò)USB系統(tǒng)軟件驅(qū)動(dòng)集線器端口發(fā)出復(fù)位信號(hào),也可以在設(shè)備端RESET信號(hào)置1,進(jìn)行硬件復(fù)位。
(1)設(shè)備是從掛起狀態(tài)復(fù)位:在suspend狀態(tài)檢測(cè)到SE0時(shí),設(shè)備跳轉(zhuǎn)到suspreset狀態(tài),檢測(cè)總線狀態(tài)為超過(guò)2.5 μs的SE0后設(shè)備啟動(dòng)高速握手檢測(cè),即進(jìn)入sendchirp狀態(tài)。
(2)設(shè)備從非掛起的全速狀態(tài)復(fù)位:設(shè)備在檢測(cè)到2.5 μs<T<3.0 ms的 SE0狀態(tài)后啟動(dòng)高速握手檢測(cè)。
(3)設(shè)備從非掛起的高速狀態(tài)復(fù)位:設(shè)備在highspeed狀態(tài)檢測(cè)到總線上持續(xù)時(shí)間3.0 ms的SE0后,設(shè)備狀態(tài)轉(zhuǎn)換到hsrevert,以移除高速終端并重連D+的上拉電阻,此時(shí)為全速連接狀態(tài);之后設(shè)備需要在 100 μs<T<875 μs的時(shí)間內(nèi)采樣總線狀態(tài),檢測(cè)到SE0持續(xù)2.5 μs后,進(jìn)入sendchirp狀態(tài),開(kāi)始高速握手過(guò)程。
編寫(xiě)Testbench,在ModelSim中對(duì)設(shè)計(jì)的SIE進(jìn)行仿真驗(yàn)證,結(jié)果符合USB2.0協(xié)議規(guī)范要求。在此簡(jiǎn)述工作模式控制電路中關(guān)于高速握手的仿真過(guò)程和結(jié)果。當(dāng)設(shè)備連接到集線器后,進(jìn)入init狀態(tài),通過(guò)timer2計(jì)數(shù)到OxFFFF(即 17 ms),使設(shè)備跳轉(zhuǎn) fullspeed狀態(tài)。在 fullspeed狀態(tài),timer2計(jì)數(shù)到 OxA6(即 2.5 μs),設(shè)備進(jìn)入到高速握手的sendchirp階段。Sendchirp代碼如下,對(duì)應(yīng)仿真結(jié)果圖3所示。
圖3 發(fā)送chirpK檢測(cè)主機(jī)是否支持高速
支持高速傳輸?shù)闹鳈C(jī)接收到K后,發(fā)送3對(duì)KJ序列檢測(cè)設(shè)備是否支持高速傳輸。設(shè)備進(jìn)入recvchirp狀態(tài),判斷是否接收到符合要求的3對(duì)JK序列。Recvchirp狀態(tài)對(duì)應(yīng)代碼如下:
檢測(cè)到linestate為持續(xù)時(shí)間達(dá)到2.5 μs(timer1計(jì)數(shù)到OxA6)10或 01時(shí),判斷為檢測(cè)到 J或 K chirp。每檢測(cè)到一個(gè) K或 J,賦 clrtimer1=1來(lái)清零 timer1,同時(shí) chirpcnt加1。設(shè)備支持高速傳輸模式,且成功檢測(cè)到KJKJKJ,同時(shí)chirpcnt計(jì)數(shù)到6,則設(shè)備高速握手成功,進(jìn)入高速工作模式。假如在chirp檢測(cè)等待時(shí)間(1.1 ms)內(nèi)沒(méi)有等到檢測(cè)到3對(duì)KJ信號(hào),則握手失敗,設(shè)備以全速模式工作。高速模式下的部分發(fā)送波形如圖4所示。
圖4 接收來(lái)自主機(jī)的JKJKJK握手信號(hào)
本文先介紹了USB2.0設(shè)備控制器總體架構(gòu)及各模塊功能,之后詳細(xì)分析了USB2.0設(shè)備控制器工作模式控制電路需要實(shí)現(xiàn)的功能及設(shè)計(jì)細(xì)節(jié),并在系統(tǒng)中進(jìn)行了仿真驗(yàn)證。結(jié)果表明,所設(shè)計(jì)的工作模式控制電路功能正確,能配合其他模塊一起進(jìn)行USB設(shè)備開(kāi)發(fā)。
[1]劉志華,郭付才,彭新偉,等.基于 CY7C68013A的FPGA配置和通信接口設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2013,39(2):18-19.
[2]AXELSON J.USB開(kāi)發(fā)大全(第四版)[M].李鴻鵬,鄭瑞霞,陳香凝,等譯.北京:人民郵電出版社,2011.
[3]蕭世文,宋延清.USB 2.0硬件設(shè)計(jì)[M].北京.清華大學(xué)出版社,2002.
[4]USB serial bus specification revision 2.0[EB/OL].(2002-04)[2014-03].http://www.usb.org.
[5]沈小磊,張曉彤,李占才.USB設(shè)備控制器的硬件實(shí)現(xiàn)與研[J].計(jì)算機(jī)工程,2007,33(24):247-249.