USB海量設(shè)備通信程序開發(fā) - 圖文-_第1頁
USB海量設(shè)備通信程序開發(fā) - 圖文-_第2頁
USB海量設(shè)備通信程序開發(fā) - 圖文-_第3頁
USB海量設(shè)備通信程序開發(fā) - 圖文-_第4頁
USB海量設(shè)備通信程序開發(fā) - 圖文-_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 目錄第一章 緒論 (11.1PC接口簡介 11.2USB接口分析11.3USB器件的選擇 11.4M ASS S TORAGE協(xié)議與FAT16文件系統(tǒng) 2第二章 USB總線結(jié)構(gòu) (32.1總線拓?fù)浣Y(jié) 32.2USB設(shè)備 32.3USB主機(jī) 62.4USB數(shù)據(jù)流72.5USB的端點(diǎn)9第三章 協(xié)議 (123.1M ASS S TORAGE 協(xié)議123.2B ULK-O NLY傳輸協(xié)議163.3SCSI指令集183.4FAT16文件系統(tǒng)21第四章 程序?qū)崿F(xiàn)與調(diào)試 (294.1固件程序的實(shí)現(xiàn)294.2固件調(diào)試42 結(jié)論 (46致謝 (47參考文獻(xiàn) (48附錄 (49附錄A USB接口芯片命令總匯49

2、A1.初始化命令 (50A2.數(shù)據(jù)流命令 (54A3.數(shù)據(jù)流命令 (59附錄B U盤固件程序源碼清單60 第一章 緒論1.1 PC接口簡介1.2 USB 接口分析通用串行總線(Universal Serial Bus USB,是一種快速、靈活的總線接口。與其它通信接口比較,USB接口的最大特點(diǎn)是易于使用,這也是USB的主要設(shè)計(jì)目標(biāo)。作為一種高速總線接口,USB適用于多種設(shè)備,如數(shù)碼相機(jī)、MP3播放機(jī)、高速數(shù)據(jù)采集設(shè)備等。易于使用還表現(xiàn)在USB接口支持熱插拔,并且所有的配置過程都由系統(tǒng)自動(dòng)完成,無需用戶干預(yù)。USB接口支持1.5Mb/s(低速、12Mb/s(全速和高達(dá)480Mb/s(USB 2.

3、0規(guī)范的數(shù)據(jù)傳輸速率,扣除用于總線狀態(tài)、控制和錯(cuò)誤監(jiān)測(cè)等的數(shù)據(jù)傳輸,USB的最大理論傳輸速率仍達(dá)1.2Mb/s 或9.6Mb/s,遠(yuǎn)高于一般的串行總線接口。USB接口芯片價(jià)格低廉,一個(gè)支持USB 1.1 規(guī)范 的USB接口芯片價(jià)格大多在人民幣(2004年1530元之間,這也大大促進(jìn)USB設(shè)備的開發(fā)與應(yīng)用。1.3 USB 器件的選擇在進(jìn)行一個(gè)USB設(shè)備開發(fā)之前,首先要根據(jù)具體使用要求選擇合適的USB控制器。目前,市場上供應(yīng)的USB控制器主要有兩種:帶USB接口的單片機(jī)(MCU或純粹的USB接口芯片。帶USB接口的單片機(jī)從應(yīng)用上又可以分成兩類,一類是從底層設(shè)計(jì)專用于USB控制的單片機(jī)另一類是增加了

4、USB接口的普通單片機(jī),如Cypress公司的EZ-USB(基于8051,選擇這類USB控制器的最大好處在于開發(fā)者對(duì)系統(tǒng)結(jié)構(gòu)和指令集非常熟悉,開發(fā)工具簡單,但對(duì)于簡單或低成本系統(tǒng)。但價(jià)格因素也是在實(shí)際選擇過程中需要考慮的因素。純粹的USB 接口芯片僅處理USB通信,必須有一個(gè)外部微處理器來進(jìn)行協(xié)議處理和數(shù)據(jù)交換。典型產(chǎn)品有Philips公司的PDIUSBD11(I2C接口、PDIUSBD12(并行接口,NS公司的USBN9603/9604(并行接口,NetChip公司的NET2888 等。USB接口芯片的主要特點(diǎn)是價(jià)格便宜、接口方便、可靠性高,尤其適合于產(chǎn)品的改型設(shè)計(jì)(硬件上僅需對(duì)并行總線和中

5、斷進(jìn)行改動(dòng),軟件則需要增加微處理器的USB中斷處理和數(shù)據(jù)交換程序、PC機(jī)的USB接口通信程序,無需對(duì)原有產(chǎn)品系統(tǒng)結(jié)構(gòu)作很大的改動(dòng)。1.4 Mass Storage協(xié)議與FAT16文件系統(tǒng)USB組織定義了海量存儲(chǔ)設(shè)備類(Mass Storage Class的規(guī)范,這個(gè)類規(guī)范包括四個(gè)獨(dú)立的子類規(guī)范,即:1. USB Mass Storage Class Control/Bulk/Interrupt (CBI Transport 2. USBMass Storage Class Bulk-Only Transport 3. USB Mass Storage Class ATA Command Blo

6、ck 4.USB Mass Storage Class UFI Command Specification。前兩個(gè)子規(guī)范定義了數(shù)據(jù)/命令/狀態(tài)在USB上的傳輸方法。Bulk- Only傳輸規(guī)范僅僅使用Bulk端點(diǎn)傳送數(shù)據(jù)/命令/狀態(tài),CBI傳輸規(guī)范則使用Control/Bulk/Interrupt三種類型的端點(diǎn)進(jìn)行數(shù)據(jù)/命令/狀態(tài)傳送。后兩個(gè)子規(guī)范則定義了存儲(chǔ)介質(zhì)的操作命令。ATA命令規(guī)范用于硬盤,UFI 命令規(guī)范是針對(duì)USB移動(dòng)存儲(chǔ)。Microsoft Windows中提供對(duì)Mass Storage協(xié)議的支持,因此USB移動(dòng)設(shè)備只需要遵循Mass Storage協(xié)議來組織數(shù)據(jù)和處理命令,即可

7、實(shí)現(xiàn)與PC機(jī)交換數(shù)據(jù)。而Flash的存儲(chǔ)單元組織形式采用FAT16文件系統(tǒng),這樣,就可以直接在Windows的瀏覽器中通過可移動(dòng)磁盤來交換數(shù)據(jù)了,Windows負(fù)責(zé)對(duì)FAT16文件系統(tǒng)的管理,USB設(shè)備不需 要干預(yù)FAT16文件系統(tǒng)操作的具體細(xì)節(jié)。第二章 USB總線結(jié)構(gòu)2.1 總線拓?fù)浣Y(jié)USB總線的物理連接是一種有層次性的星型結(jié)構(gòu),集線器(HUB是每個(gè)星型結(jié)構(gòu)的中心。PC機(jī)就是主機(jī)和根HUB,用戶可以將外設(shè)或附加的HUB與之相連,這些附加的HUB可以連接另外的外設(shè)以及下層HUB。USB支持最多5個(gè)HUB層以及127個(gè)外設(shè)。從下圖描述了總線的這種物理拓?fù)浣Y(jié)構(gòu)。 圖2.1 USB總線拓?fù)浣Y(jié)構(gòu)2.2

8、 USB設(shè)備USB設(shè)備包括HUB和功能設(shè)備,而功能設(shè)備又可以細(xì)分為定位設(shè)備、字符設(shè)備等等。為了進(jìn)一步敘述,這里給出端點(diǎn)(endpoint和管道(pipe的概念。端點(diǎn):每一個(gè)USB設(shè)備在主機(jī)看來就是一個(gè)端點(diǎn)的集合,主機(jī)只能通過端點(diǎn)與設(shè)備進(jìn) 行通訊,以使用設(shè)備的功能。每一個(gè)端點(diǎn)實(shí)際上就是一個(gè)一定大小的數(shù)據(jù)緩沖區(qū),這些端點(diǎn)在設(shè)備出廠時(shí)就已經(jīng)定義好了。在USB系統(tǒng)中,每一個(gè)端點(diǎn)都有唯一的地址,這是由設(shè)備地址和端點(diǎn)號(hào)給出的。每個(gè)端點(diǎn)都有一定的特性。其中包括:傳輸方式、總線訪問頻率、帶寬、端點(diǎn)號(hào)、數(shù)據(jù)包的最大容量等等。除端點(diǎn)0外,其它端點(diǎn)必須在設(shè)備配置后才能生效。端點(diǎn)0通常為控制端點(diǎn),用于設(shè)備初始化參數(shù)等

9、,端點(diǎn)1、2等一般用作數(shù)據(jù)端點(diǎn),存放主機(jī)與設(shè)備間往來的數(shù)據(jù)。管道:一個(gè)USB管道是驅(qū)動(dòng)程序的一個(gè)數(shù)據(jù)緩沖區(qū)與一個(gè)外設(shè)端點(diǎn)的連接,它代表了一種在兩者之間移動(dòng)數(shù)據(jù)的能力。一旦設(shè)備被配置,管道就存在了。管道由兩種類型,數(shù)據(jù)流管道(其中的數(shù)據(jù)沒有USB定義的結(jié)構(gòu)與消息管道(其中的數(shù)據(jù)必須由USB定義的結(jié)構(gòu)。管道只是一個(gè)邏輯上的概念。所有的設(shè)備必須支持端點(diǎn)0以作為設(shè)備的控制管道。通過控制管道可以獲取完全描述USB設(shè)備的信息,包括:設(shè)備類型、電源管理、配置、端點(diǎn)描述等等。只要設(shè)備連接到USB 上并上電,端點(diǎn)0就可以被訪問,與之對(duì)應(yīng)的控制管道就存在了。一個(gè)USB設(shè)備可以分為三個(gè)層。最底層是總線接口,用來發(fā)送

10、與接收包。中間層處理總線接口與不同的端點(diǎn)之間的數(shù)據(jù)流通。一個(gè)端點(diǎn)是數(shù)據(jù)最終的使用者或提供者,它可以看作是數(shù)據(jù)源或是數(shù)據(jù)接收端。最上層就是USB設(shè)備所提供的功能,比如鼠標(biāo)或鍵盤等。 圖2.2 USB設(shè)備層次結(jié)構(gòu)HUB在USB結(jié)構(gòu)中是一個(gè)關(guān)鍵,它提供了附加的USB節(jié)點(diǎn),這些節(jié)點(diǎn)被稱為端口。HUB 可以檢測(cè)出每一個(gè)下行端口的狀態(tài),并且可以給下端的設(shè)備提供電源。從下圖描述了一個(gè)典型的HUB結(jié)構(gòu)。 圖2.3 USB HUBUSB設(shè)備可以即插即用,但在可以使用之前,必須對(duì)設(shè)備進(jìn)行配置。一旦設(shè)備連接到某個(gè)USB的節(jié)點(diǎn)上,USB就會(huì)產(chǎn)生一系列的操作,來完成對(duì)設(shè)備的配置,這種操作被稱為總線枚舉過程:1.設(shè)備所連

11、接的HUB檢測(cè)出端口上由設(shè)備連接,通過狀態(tài)變化管道向主機(jī)報(bào)告;2.主機(jī)通過詢問HUB以獲得確切的信息;3.主機(jī)這時(shí)知道設(shè)備連接到那個(gè)端口上,于是向這個(gè)端口發(fā)出復(fù)位命令;4.HUB發(fā)出的復(fù)位信號(hào)結(jié)束后,端口被打開,HUB向設(shè)備提供100mA的電源,這時(shí)設(shè)備上電,所有的寄存器復(fù)位,并且以缺省地址0以及端點(diǎn)0響應(yīng)命令;5.主機(jī)通過缺省地址與端點(diǎn)0進(jìn)行通訊,賦予設(shè)備一個(gè)唯一的地址,并且讀取設(shè)備的配置信息;6.最后主機(jī)對(duì)設(shè)備進(jìn)行配置,該設(shè)備就可以使用了。 當(dāng)該設(shè)備被移走時(shí),HUB依然要報(bào)告主機(jī),并且關(guān)閉端口。一旦主機(jī)接收到設(shè)備移走的報(bào)告,就會(huì)改寫當(dāng)前結(jié)構(gòu)信息。USB設(shè)備的電源可以由USB總線供給,也可以

12、自備電源。一個(gè)USB設(shè)備可以具有這兩種供電方式,但同一時(shí)刻只能由一種方式供電。這兩種供電方式是可以切換的。為了節(jié)電,當(dāng)設(shè)備在指定的時(shí)間內(nèi)沒有總線傳輸,USB設(shè)備自動(dòng)進(jìn)入掛起狀態(tài)。如果設(shè)備所接的HUB的端口被禁止了,設(shè)備也將進(jìn)入掛起狀態(tài)(稱之為選擇掛起。當(dāng)然主機(jī)也可以進(jìn)入掛起狀態(tài)。USB設(shè)備當(dāng)總線活動(dòng)時(shí),就會(huì)離開掛起狀態(tài)。一個(gè)設(shè)備也可以通過電信號(hào)來遠(yuǎn)程喚醒進(jìn)入掛起狀態(tài)的主機(jī)。這個(gè)能力是可選的,如果一個(gè)設(shè)備具有這個(gè)能力,主機(jī)有能力禁止或允許使用這種能力。2.3 USB主機(jī)USB主機(jī)在USB系統(tǒng)中處于中心地位,并且對(duì)USB及其連接的設(shè)備有著特殊的責(zé)任。主機(jī)控制著所有對(duì)USB的訪問,一個(gè)外設(shè)只有主機(jī)允

13、許才有訪問總線的權(quán)利。主機(jī)同時(shí)也檢測(cè)著USB的結(jié)構(gòu)。USB主機(jī)包括三層:設(shè)備驅(qū)動(dòng)程序,USB系統(tǒng)軟件,USB主控制器(主機(jī)的總線接口。另外,還有兩個(gè)軟件接口:USB驅(qū)動(dòng)(USBD接口,主機(jī)控制驅(qū)動(dòng)(HCD接口。 圖2.4 主機(jī)的層次結(jié)構(gòu)2.4 USB數(shù)據(jù)流 圖2.5 USB數(shù)據(jù)流過程 從邏輯上講,USB數(shù)據(jù)的傳輸是通過管道進(jìn)行的。USB系統(tǒng)軟件通過缺省管道(與端點(diǎn)0相對(duì)應(yīng)管道設(shè)備,設(shè)備驅(qū)動(dòng)程序通過其它的管道來管理設(shè)備的功能接口。實(shí)際的數(shù)據(jù)傳輸過程是這樣的:設(shè)備驅(qū)動(dòng)程序通過對(duì)USBD接口(USB driver interface的調(diào)用發(fā)出輸入輸出請(qǐng)求(IRP, I/O Request Packe

14、t;USB驅(qū)動(dòng)程序接到請(qǐng)求后,調(diào)用HCD接口(host controller driver interface,將IRP轉(zhuǎn)化為USB的傳輸(transfer,一個(gè)IRP可以包含一個(gè)或多個(gè)USB傳輸;然后HCD將USB傳輸分解為總線操作(transaction,由主控制器以包(packet的形式發(fā)出。需要注意的是:所有的數(shù)據(jù)傳輸都是由主機(jī)開始的,任何外設(shè)都無權(quán)開始一個(gè)傳輸。IRP是由操作系統(tǒng)定義的,而USB傳輸與總線操作是USB規(guī)范定義的。為了進(jìn)一步說明USB傳輸,這里引出幀(frame的概念。幀:USB總線將1ms定義為一幀,每幀以一個(gè)SOF包為開始,在這1ms里USB進(jìn)行一系列的總線操作。引

15、入幀的概念主要是為了支持與時(shí)間有關(guān)的總線操作。為了滿足不同外設(shè)和用戶的要求,USB提供了四中傳輸方式:控制傳輸;同步傳輸;中斷傳輸;批傳輸。它們?cè)跀?shù)據(jù)格式、傳輸方向、數(shù)據(jù)包容量限制、總線訪問限制等方面有著各自不同的特征:控制傳輸(Control Transfer1.通常用于配置、命令、狀態(tài)等情形;2.其中的設(shè)置操作(setup和狀態(tài)操作(status的數(shù)據(jù)包具有USB定義的結(jié)構(gòu),因此控制傳輸只能通過消息管道進(jìn)行;3.支持雙向傳輸;4.對(duì)與高速設(shè)備,允許數(shù)據(jù)包最大容量為8,16,32或64字節(jié),對(duì)于低速設(shè)備只有8字節(jié)一種選擇;5.端點(diǎn)不能指定總線訪問的頻率和占用總線的時(shí)間,USB系統(tǒng)軟件會(huì)做出限

16、制;6.具有數(shù)據(jù)傳輸保證,在必要時(shí)可以重試。同步傳輸(Isochronous Transfer1.是一種周期的、連續(xù)的傳輸方式,通常用于與時(shí)間有密切關(guān)系的信息的傳輸;2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)(數(shù)據(jù)流管道; 3.單向傳輸,如果一個(gè)外設(shè)需要雙向傳輸,則必須使用另一個(gè)端點(diǎn);4.只能用于高速設(shè)備,數(shù)據(jù)包的最大容量可以從0到1023個(gè)字節(jié);5.具有帶寬保證,并且保持?jǐn)?shù)據(jù)傳輸?shù)乃俾屎愣?每個(gè)同步管道每幀傳輸一個(gè)數(shù)據(jù)包;6.沒有數(shù)據(jù)重發(fā)機(jī)制,要求具有一定的容錯(cuò)性;7.與中斷方式一起,占用總線的時(shí)間不得超過一幀的90%。中斷傳輸(Interrupt Transfer1.用于非周期的、自然發(fā)生的、數(shù)據(jù)量很小

17、的信息的傳輸,如鍵盤、鼠標(biāo)等。2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)(數(shù)據(jù)流管道;3.只有輸入這一種傳輸方式(即外設(shè)到主機(jī);4.對(duì)于高速設(shè)備,允許數(shù)據(jù)包最大容量為小于或等于64字節(jié),對(duì)于低速設(shè)備只能小于或等于8字節(jié);5.具有最大服務(wù)周期保證,即在規(guī)定時(shí)間內(nèi)保證有一次數(shù)據(jù)傳輸;6.與同步方式一起,占用總線的時(shí)間不得超過一幀的90%;7.具有數(shù)據(jù)傳輸保證,在不要時(shí)可以重試。批傳輸(Bulk Transfer1.用于大量的、對(duì)時(shí)間沒有要求的數(shù)據(jù)傳輸;2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)(數(shù)據(jù)流管道;3.單向傳輸,如果一個(gè)外設(shè)需要雙向傳輸,則必須使用另一個(gè)端點(diǎn);4.只能用于高速設(shè)備,允許數(shù)據(jù)包最大容量為8,16,32或

18、64字節(jié);5.沒有帶寬的保證,只要有總線空閑,就允許傳輸數(shù)據(jù)(優(yōu)先級(jí)小于控制傳輸;6.具有數(shù)據(jù)傳輸保證,在必要時(shí)可以重試,以保證數(shù)據(jù)的準(zhǔn)確性。 圖2.6 USB數(shù)據(jù)傳輸2.5 USB的端點(diǎn)端點(diǎn)是USB中一個(gè)獨(dú)特的概念,它是一個(gè)可以與USB Host交換數(shù)據(jù)的硬件單元。USB Host與USB設(shè)備之間都是通過端點(diǎn)來傳輸數(shù)據(jù)的,端點(diǎn)是橋梁和紐帶,不同的端點(diǎn)其傳輸數(shù)據(jù)的能力不同,適于不同的應(yīng)用場合。PDIUSBD12的端點(diǎn)適用于不同類型的設(shè)備,例如圖像打印機(jī)、海量存儲(chǔ)器和通信設(shè)備。 端點(diǎn)可通過Set Mode命令配置為4種不同的模式,分別為:1.模式0 Non-ISO 模式:非同步傳輸2.模式1 I

19、SO-OUT 模式:同步輸出傳輸3.模式2 ISO-IN 模式:同步輸入傳輸4.模式3 ISO-IO 模式:同步輸入輸出傳輸這幾種模式下可得到的端點(diǎn)情況如下表2.1:表2.1 端點(diǎn)模式 端點(diǎn)2(主端點(diǎn)是進(jìn)行吞吐大量數(shù)據(jù)的主要端點(diǎn)。主端點(diǎn)執(zhí)行主機(jī)的特性以減輕傳輸大數(shù)據(jù)的任務(wù),包括:1.雙緩沖。允許USB與本地CPU之間的并行讀寫操作,增加了數(shù)據(jù)的吞吐量。緩沖區(qū)切換是自動(dòng)處理的,導(dǎo)致了透明的緩沖區(qū)操作。2.支持DMA(直接存儲(chǔ)器訪問操作,可以和對(duì)其他端點(diǎn)的正常I/O操作交進(jìn)行。3.DMA操作中的自動(dòng)指針處理,在跨過緩沖區(qū)邊界時(shí)不需要本地CPU的干預(yù)。4.可配置為同步傳輸或非同步(批量和中斷傳輸。

20、第三章 協(xié)議3.1 Mass Storage 協(xié)議USB協(xié)議能夠在啟動(dòng)或是當(dāng)設(shè)備插入系統(tǒng)時(shí)對(duì)設(shè)備進(jìn)行備置,這就是USB設(shè)備為什么可以執(zhí)插撥的原因。USB設(shè)備被分成以下幾類:顯示器(Monitors、通訊設(shè)備(Communication devices、音頻設(shè)備(Audio、人機(jī)輸入(Human input、海量存儲(chǔ)(Mass storage。特定類(class的設(shè)備又可劃分成子類(subclass,劃分子類的后軟件就可以搜索總線并選擇所有它可以支持的設(shè)備。每個(gè)設(shè)備可以有一個(gè)或多個(gè)配置(Configuration,配置 用于定義設(shè)備的功能。如果某個(gè)設(shè)備有幾種不同的功能,則每個(gè)功能都需要一個(gè)配置。

21、配置(configuration是接口(interface的集合。接口指定設(shè)備中的哪些硬件與USB交換數(shù)據(jù)。每一個(gè)與USB交換數(shù)據(jù)的硬件就叫做一個(gè)端點(diǎn)(endpoint。因此,接口是端點(diǎn)的集合。USB的設(shè)備類別定義(USB Device Class Definitions定義特定類或子類中的設(shè)備需要提供的缺省配置、接口和端點(diǎn)。描述符(descriptor描述設(shè)備、配置、接口或端點(diǎn)的一般信息,下圖為USB 描述符的層次結(jié)構(gòu)。 圖3.1 USB描述符層次結(jié)構(gòu)USB(Host唯一通過描述符了解設(shè)備的有關(guān)信息,根據(jù)這些信息建立起通信,在這些描述符中,規(guī)定了設(shè)備所使用的協(xié)議、端點(diǎn)情況等。因此,正確地提供

22、描述符,是USB設(shè)備正常工作的先決條件。USB海量存儲(chǔ)設(shè)備(USB Mass Storage Class包括General Mass Storage Subclass、CD-ROM、Tape、Solid State。Mass Storage Class只需要支持一個(gè)接口,即數(shù)據(jù)(Data接口,選擇缺省配置時(shí)此接口即被激活。數(shù)據(jù)接口允許與設(shè)備之間進(jìn)行數(shù)據(jù)傳輸,它提供三個(gè)端點(diǎn):Bulk Input 端點(diǎn)、Bulk Output 端點(diǎn)和中斷端點(diǎn)。通用海量存儲(chǔ)設(shè)備(General Mass Storage Device是隨機(jī)存取、基于塊/扇區(qū)存儲(chǔ)的設(shè)備。它只能存儲(chǔ)和取回來自CPU 的數(shù)據(jù)。這種設(shè)備的接

23、口遵循SCSI-2標(biāo)準(zhǔn)的直接存取存儲(chǔ)設(shè)備 (Direct Access Storage Device協(xié)議。USB設(shè)置上的介質(zhì)使用與SCSI-2設(shè)備相同的邏輯塊(logical blocks方式尋址。下面介紹基于Bulk Only(批量傳輸模式的Mass Storage 設(shè)備的描述符:每個(gè)USB設(shè)備都必須有一個(gè)設(shè)備描述符。 圖3.2 設(shè)備(Device描述符Mass Stroage設(shè)備的設(shè)備類型和子類代碼均在接口描述符中設(shè)置,這里置0。其中iSerialNumber可為零,即不指定Serial Number。配置描述符如下圖: 圖3.3 配置(Configuration描述符這里配置所支持的接口

24、數(shù)應(yīng)為1。即設(shè)置至少支持一個(gè)接口,這里為Bulk-Only Data 接口,此接口使用三個(gè)端點(diǎn):控制端點(diǎn)(默認(rèn)、Bulk-In和Bulk-Out。其中bInterfaceSubClass指定所使用的工業(yè)標(biāo)準(zhǔn)命令塊,bInterfaceProtocol為所使用的傳輸協(xié)議。 圖3.4 bInterfaceSubClass 處的工業(yè)標(biāo)準(zhǔn)命令塊代碼 圖3.5 Mass Storage 傳輸協(xié)議接口描述符如下圖: 圖3.6 接口(Interface描述符由于控制端點(diǎn)為每個(gè)設(shè)備都使用的缺省端點(diǎn),因此不需要定義,只需定義Bulk-In和Bulk-Out兩個(gè)端點(diǎn),其端點(diǎn)描述符如下: 圖3.7 Bulk-In端

25、點(diǎn)描述符 圖3.8 Bulk-Out端點(diǎn)描述符3.2 Bulk-Only傳輸協(xié)議設(shè)備插入到USB后,USB即對(duì)設(shè)備進(jìn)行搜索,并要求設(shè)備提供相應(yīng)的描述符。在USB Host 得到上述描述符后,即完成了設(shè)備的配置,識(shí)別出為Bulk-Only的Mass Storage設(shè)備,然后即進(jìn)入Bulk-Only傳輸方式。在此方式下,USB與設(shè)備間的所有數(shù)據(jù)均通過Bulk-In和Bulk-Out來進(jìn)行傳輸,不再通過控制端點(diǎn)傳輸任何數(shù)據(jù)。在這種傳輸方式下,有三種類型的數(shù)據(jù)在USB和設(shè)備之間傳送,CBW、CSW 和普通數(shù)據(jù)。CBW(Command Block Wrapper,即命令塊包是從USB Host發(fā)送到設(shè)備

26、的命令,命令格式遵從接口中的bInterfaceSubClass 所指定的命令塊,這里為SCSI傳輸命令集。USB設(shè)備需要將SCSI命令從CBW中提取出來,執(zhí)行相應(yīng)的命令。完成以后,向Host發(fā)出反映當(dāng)前命令執(zhí)行狀態(tài)的CSW(Command Status Wrapper,即命令狀態(tài)包,Host根據(jù)CSW來決定是否繼續(xù)發(fā)送下一個(gè)CBW或是數(shù)據(jù)。Host要求USB設(shè)備執(zhí)行的命令可能為發(fā)送數(shù)據(jù),則此時(shí)需要將特定數(shù)據(jù)傳送出去,完畢后發(fā)出CSW,以使Host進(jìn)行下一步的操作。USB設(shè)備所執(zhí)行的操作可用下圖描述: 圖3.9 USB 設(shè)備所執(zhí)行的操作USB Host 按照下面的格式向設(shè)備端發(fā)送CBW, 圖3

27、.10 CBW其中dCBWSignature的值為43425355h(LSB,表示當(dāng)前發(fā)送的是一個(gè)CBW;dCBWTag的內(nèi)容需要原樣作為dCSWTag再發(fā)送給Host;dCBWDataTransferLength為本次CBW需要傳輸?shù)臄?shù)據(jù)長度,bmCBWFlags反映數(shù)據(jù)傳輸?shù)姆较?0表示來自Host,1表示發(fā)至Host;bCBWLUN 一般為零,但當(dāng)設(shè)備有多個(gè)邏輯單元時(shí),用此位指定本次命令是發(fā)給誰的;bCBWCBLength 為本次命令字的長度;CBWCB即為真正的傳輸命令集的命令。設(shè)備得到一個(gè)CBW后,解析出CBWCD中所代表的命令,然后按照SCSI命令集中的定義來執(zhí)行相應(yīng)的操作,或是需

28、要接收下一個(gè)Bulk-Out發(fā)來的數(shù)據(jù),或是需要向Host傳送數(shù)據(jù),完成以后需要向USB Host發(fā)送CSW,反映命令執(zhí)行的狀態(tài)。USB也是通過此來了解設(shè)備的工作情況的。USB設(shè)備按照下面的格式向主機(jī)端發(fā)送CBW, 圖3.11 CSW其中dCSWSignature的值為53425355h(LSB,表示當(dāng)前發(fā)送的是一個(gè)CSW;dCSWTag的內(nèi)容為dCBWTag的內(nèi)容,dCSWDataResidue為還需要傳送的數(shù)據(jù),此數(shù)據(jù)根據(jù)dCBWDataTransferLength減去本次已經(jīng)傳送的數(shù)據(jù)得到。Host端根據(jù)此值決定下一次CBW的內(nèi)容,如果沒有完成則繼續(xù);如果命令正確執(zhí)行,則bCSWStat

29、us返回0。設(shè)備按這個(gè)規(guī)則組裝好CSW后,通過Bulk-In端點(diǎn)將其發(fā)送給主機(jī)。3.3 SCSI指令集Bulk-Only的CBW中的CBWCB中的內(nèi)容即為如下格式的命令塊描述符(Command Block Descriptor。SCSI-2有三種字長的命令,6位、10位和12位,Microsoft Windows環(huán)境下支持12 位字長的命令。 圖3.12 命令塊描述符(Command Block DescriptorOperation Code是操作代碼,表示特定的命令。高3位為Group Code,共有8 種組合,即8個(gè)組,低5五位為Command Code,可以有32種命令。Logicol

30、 unit Number是為了兼容SCSI -1而設(shè)的。Logical block address為高位在前,低位在后的邏輯塊地址,即扇區(qū)地址。Transfer length為需要從邏輯塊地址處開始傳輸?shù)纳葏^(qū)數(shù)(比如在Read 和Write 命令中;Parameter list length為需要傳輸?shù)臄?shù)據(jù)長度(比如在Mode Sense 命令中; Allocation length為初始程序?yàn)榉祷財(cái)?shù)據(jù)所分配的最大字節(jié)數(shù),此值可以為零,表示不需要傳送數(shù)據(jù)。SCSI指令集的Direct Accesss類型存儲(chǔ)介質(zhì)的傳輸命令有許多,所幸運(yùn)的是Mass Storage協(xié)議只用到了其中的一些。下面黑體

31、部分即為需要USB設(shè)備作出響應(yīng)的請(qǐng)求,一般是要求向Host發(fā)送一些有關(guān)設(shè)備的數(shù)據(jù): 表3.1 SCSI指令集 對(duì)于不同的命令,其命令塊描述符略有不同,其要求的返回內(nèi)容也有所不同,根據(jù)相應(yīng)的文檔,可以對(duì)每種請(qǐng)求作出適當(dāng)?shù)幕貞?yīng)。下面以INQUIRY請(qǐng)求為例,給出該命令塊的命令塊描述符和其返回內(nèi)容的數(shù)據(jù)格式,其它命令塊格式和返回內(nèi)容請(qǐng)參考Information technology - SCSI Primary Commands - 2(SPC-2。 圖3.13 INQUIRY命令塊描述符 圖3.14 INQUIRY命令返回?cái)?shù)據(jù)格式Host會(huì)依次發(fā)出INQUIRY、READ CAPACITY、UFI

32、 MODE SENSE請(qǐng)求,如果上述請(qǐng)求的返回結(jié)果都正確,則Host會(huì)發(fā)出READ命令,讀取文件系統(tǒng)0簇0扇區(qū)的MBR數(shù)據(jù),進(jìn)入文件系統(tǒng)識(shí)別階段。對(duì)于PREVENT-ALLOW MEDIUM REMOVAL和TEST UNIT READY命令,只需直接返回CSW即可,對(duì)于后者,由于Flash盤總是處于READY狀態(tài),故可直接返回CSW。3.4 FAT16 文件系統(tǒng)一個(gè)FAT(FAT12/FAT16/FAT32文件系統(tǒng)卷(卷可以理解為是一張軟盤、一個(gè)硬盤或是一個(gè)Flas電子盤由四個(gè)部分組成:分區(qū)的保留區(qū)(Reserved Region中的第一個(gè)扇區(qū)必須是BPB(BIOS Parameter Bl

33、ock, 此扇區(qū)有時(shí)也稱作“引導(dǎo)扇區(qū)”、“保留扇區(qū)”或是“零扇區(qū)”,因?yàn)樗袑?duì)文件系統(tǒng)進(jìn)行識(shí)別的關(guān)鍵信息,因此十分重要。下表是此扇區(qū)的結(jié)構(gòu):表3.2 引導(dǎo)扇區(qū)結(jié)構(gòu)(一 表3.3 引導(dǎo)扇區(qū)結(jié)構(gòu)(二 表3.4 引導(dǎo)扇區(qū)結(jié)構(gòu)(三 FAT即File Allocation Table,文件分配表。操作系統(tǒng)分配磁盤空間按簇來分配的。因此,文件占用磁盤空間時(shí),基本單位不是字節(jié)而是簇,即使某個(gè)文件只有一個(gè)字節(jié),操作系統(tǒng)也會(huì)給他分配一個(gè)最小單元即一個(gè)簇。為了可以將磁盤空間有序地分配給相應(yīng)的文件,而讀取文件的時(shí)候又可以從相應(yīng)的地址讀出文件,我們把整個(gè)磁盤空間分成32K字節(jié)長的簇來管理,每個(gè)簇在FAT表中占據(jù)著一

34、個(gè)16位的位置,稱為一個(gè)表項(xiàng)。對(duì)于大文件,需要分配多個(gè)簇。同一個(gè)文件的數(shù)據(jù)并不一定完整地存放在磁盤的一個(gè)連續(xù)的區(qū)域內(nèi),而往往會(huì)分成若干段,像一條鏈子一樣存放。這種存儲(chǔ)方式稱為文件的鏈?zhǔn)酱鎯?chǔ)。為了實(shí)現(xiàn)文件的鏈?zhǔn)酱鎯?chǔ),硬盤上必須準(zhǔn)確地記錄哪些簇已經(jīng)被文件占用,還必須為每個(gè)已經(jīng)占用的簇指明存儲(chǔ)后繼內(nèi)容的下一個(gè)簇的簇號(hào),對(duì)一個(gè)文件的最后一簇,則要指明本簇?zé)o后繼 簇。這些都是由FAT表來保存的,FAT表的對(duì)應(yīng)表項(xiàng)中記錄著它所代表的簇的有關(guān)信息:諸如是否空,是否是壞簇,是否已經(jīng)是某個(gè)文件的尾簇等。FAT區(qū)的結(jié)構(gòu)如下:表3.5 FAT區(qū)結(jié)構(gòu) FAT的項(xiàng)數(shù)與硬盤上的總簇?cái)?shù)相關(guān)(因?yàn)槊恳粋€(gè)項(xiàng)要代表一個(gè)簇,簇越多

35、當(dāng)然需要的FAT 表項(xiàng)越多,每一項(xiàng)占用的字節(jié)數(shù)也與總簇?cái)?shù)有關(guān)(因?yàn)槠渲行枰娣糯靥?hào),簇號(hào)越大當(dāng)然每項(xiàng)占用的字節(jié)數(shù)就大。FAT的格式有多種,最為常見是FAT16和FAT32,其中FAT16是指文件分配表使用16位,由于16位分配表最多能管理65536(即2的16次方個(gè)簇,又由于每個(gè)簇的存儲(chǔ)空間最大只有32KB,所以在使用FAT16管理硬盤時(shí),每個(gè)分區(qū)的最大存儲(chǔ)容量只有(65536×32 KB即2048MB,也就是我們常說的2G?,F(xiàn)在的硬盤容量是越來越大,由于FAT16對(duì)硬盤分區(qū)的容量限制,所以當(dāng)硬盤容量超過2G之后,用戶只能將硬盤劃分成多個(gè)2G的分區(qū)后才能正常使用。由于FAT對(duì)于文件管

36、理的重要性,所以FAT有一個(gè)備份,即在原FAT的后面再建一個(gè)同樣的FAT。緊接著第二個(gè)FAT表的后面一個(gè)扇區(qū),就是根目錄區(qū)了。根目錄區(qū)中存放目錄項(xiàng),每個(gè)目錄項(xiàng)為32個(gè)字節(jié),記錄一個(gè)文件或目錄的信息(長文件名例外。以下是目錄項(xiàng)的結(jié)構(gòu):表3.6 目錄項(xiàng)結(jié)構(gòu) 目錄項(xiàng)所占的扇區(qū)數(shù)與有多少個(gè)目錄項(xiàng)有關(guān),它將占用(目錄項(xiàng)*32/512個(gè)扇區(qū)。目錄項(xiàng)的所占的最后一個(gè)扇區(qū)之后,便是真正存放文件數(shù)據(jù)或是目錄的位置了。Flash硬盤與普通的磁頭、柱面式介質(zhì)不一樣。在開發(fā)U盤的過程中,使用Flash作為存儲(chǔ)介質(zhì)。它有其特定的結(jié)構(gòu)特點(diǎn)。以32M的三星K9F5608U0A-YCB0 Flash為例,它有2048個(gè)Blo

37、ck,每個(gè)Block 有32個(gè)Page,每個(gè)Page有512+16=528個(gè)字節(jié)。 圖3.15 Flash 的結(jié)構(gòu)Flash的讀寫有其自身特點(diǎn):1.必須以Page為單位進(jìn)行讀寫;2.寫之前必須先擦除原有內(nèi)容;3.擦除操作必須對(duì)Block進(jìn)行,即一次至少擦除一個(gè)Block的內(nèi)容。針對(duì)這種情況,將Flash的一個(gè)Page定為1個(gè)扇區(qū),將其2個(gè)Block,64個(gè)扇區(qū)定為一個(gè)簇,這樣,簇的容量剛好為512*64=32K,滿足FAT16對(duì)簇大小的要求。FAT分配空間的時(shí)候,是按簇來分配的,但是其給出的地址卻是LBA(Logical BlockAddress,即它只給出一個(gè)扇區(qū)號(hào),比如對(duì)此Flash而言,

38、若給出LBA為0x40,實(shí)代表簇1的扇區(qū)1。因此需要將Logical Block Address轉(zhuǎn)換為物理地址,這樣,才可以對(duì)數(shù)據(jù)進(jìn)行存取操作。根據(jù)上面定義的結(jié)構(gòu),轉(zhuǎn)換公式為:Flash 的Block = Logical Block Address/0x20 (1 Flash 的Page = Logical Block Address %0x20 (2實(shí)際上,如果定義每個(gè)簇為32 個(gè)扇區(qū)是最好的,因?yàn)檫@樣物理結(jié)構(gòu)和邏輯結(jié)構(gòu)剛好一致。但是這也無防,因?yàn)椴还躄ogical Block Address給出什么值,只要按上述公式,總可以得到物理上正確的Block 和Page,再使用Flash的讀寫命令

39、讀取對(duì)應(yīng)的Block和Page就可以了, 因此簇和扇區(qū)的概念只是在BPB中給出存儲(chǔ)介質(zhì)信息的時(shí)候告之系統(tǒng)就可以了,這里只要做好LBA與物理地址間的轉(zhuǎn)換就可以了。由于做為U盤的Flash不要求啟動(dòng),因此可以沒有MBR 區(qū),只包含DBR、FAT、DIR和DATA四個(gè)區(qū)。因此,Flash的前兩個(gè)Block的內(nèi)容如下:表3.6 Flash的前兩個(gè)BlockLBA Block/Page 長度 內(nèi)容說明0H 0/0 512字節(jié) MBR=BPB+Excutable Code+55AA1-2H 0/1-0/2 1024字節(jié) FAT區(qū)(第一份FAT3-4H 0/3-0/4 1024字節(jié) FAT區(qū)備份(第二份FA

40、T5-39H 目錄區(qū)40H 數(shù)據(jù)區(qū)當(dāng)主機(jī)發(fā)出READ命令后,Flash讀寫操作即告開始,主機(jī)首先讀取MBR,得到有關(guān)存儲(chǔ)介質(zhì)的有關(guān)信息,諸如扇區(qū)長度、每簇扇區(qū)數(shù)以及總扇區(qū)數(shù)等內(nèi)容,以便知道此盤有多大。如果讀取正確,會(huì)接著讀取文件分配表,借以在PC 機(jī)上的可移動(dòng)盤符中顯示文件目錄,并可以復(fù)制、刪除或是創(chuàng)建文件。系統(tǒng)自動(dòng)將這些命令都轉(zhuǎn)換成READ或WRITE兩種命令,通過USB的READ或WRITE命令塊描述符來從Flash中相應(yīng)扇區(qū)讀取數(shù)據(jù),或是將特定長度的數(shù)據(jù)寫入Flash相應(yīng)地址中。 第四章 程序?qū)崿F(xiàn)與調(diào)試4.1 固件程序的實(shí)現(xiàn)主循環(huán)檢查事件標(biāo)志并進(jìn)入子程序進(jìn)行進(jìn)一步的處理。MCU一但上電就

41、需要初始化其所有端口、存儲(chǔ)區(qū)、定時(shí)器和中斷服務(wù)程序。之后MCU將重新連接USB,包括將Soft_Connect 寄存器設(shè)置為ON,因?yàn)檫@些過程確保了在MCU準(zhǔn)備好服務(wù)D12之前D12不會(huì)進(jìn)行操作,所以是很重要的。下圖為主循環(huán)流程: 中斷服務(wù)程序代碼處理由D12產(chǎn)生的中斷,它將數(shù)據(jù)從D12的內(nèi)FIFO取回到CPU存儲(chǔ)器,并建立正確的事件標(biāo)志,以通知相應(yīng)的子程序進(jìn)行處理。下圖為中斷服務(wù)程序流程圖: 圖4.2 中斷服務(wù)程序流程圖 控制傳輸總是在SETUP階段開始,之后為可選的DATA階段,然后在STATUS階段結(jié)束。固件使用這3個(gè)狀態(tài)來正確處理控制傳輸。下圖為控制端點(diǎn)處理程序流程圖: 圖4.3 控制

42、輸出程序流程圖 圖4.4 控制輸入程序流程圖 對(duì)于普通輸出端點(diǎn)(本項(xiàng)目中為BULK_OUT端點(diǎn)配置為從主機(jī)接收數(shù)據(jù)包。當(dāng)MCU從主機(jī)接收輸出中斷標(biāo)志(通過讀中斷寄存器識(shí)別時(shí),D12中斷位清零。選擇端點(diǎn)將清零緩沖區(qū),接下來MCU需要確認(rèn)數(shù)據(jù)的長度并把數(shù)據(jù)讀出,然后進(jìn)入數(shù)據(jù)處理子程序。對(duì)于普通輸入端點(diǎn)(本項(xiàng)目中為BULK_IN端點(diǎn)的中斷,只要讀取端點(diǎn)號(hào)的最后處理狀態(tài)寄存器來清除中斷寄存器的相應(yīng)位,并把狀態(tài)清零即可。輸入端點(diǎn)中斷是在發(fā)送完數(shù)據(jù)后才產(chǎn)生的,當(dāng)還有數(shù)據(jù)要發(fā)送時(shí),可以在中斷程序程序里接著繼續(xù)發(fā)送。 下圖為普通端點(diǎn)處理程序流程圖:. 圖4.5 普通端點(diǎn)處理程序流程圖總線復(fù)位和掛起并不要求在I

43、SR中進(jìn)行特殊的處理,所以這里直接退出程序即可。在中斷服務(wù)程序還里定義了數(shù)據(jù)提交函數(shù)。該子程序負(fù)責(zé)把數(shù)據(jù)寫入端點(diǎn)緩沖區(qū),然后提交給主機(jī)。下圖為數(shù)據(jù)提交函數(shù)程序流程圖: 圖4.6 數(shù)據(jù)提交函數(shù)程序流程圖GET STATUS請(qǐng)求要求接收方返回一個(gè)相應(yīng)的狀態(tài),設(shè)備返回16位的狀態(tài)描述。圖4.7為GET STATUS的工作流程圖。當(dāng)GET STATUS的索引為設(shè)備時(shí),主機(jī)獲取設(shè)備的狀態(tài)。如果請(qǐng)求是對(duì)器件,MCU必須向主機(jī)返回器件狀態(tài)。因?yàn)榻涌跔顟B(tài)的16位字節(jié)全部保留,所以返回0x0000即可。一個(gè)端點(diǎn)有輸入和輸出兩個(gè)端點(diǎn)號(hào)。這里使用了索引BIT7來標(biāo)識(shí)要求返回的端點(diǎn)的方 向,BIT7=1為返回輸入端點(diǎn)

44、的狀態(tài);BIT7=0為返回輸出端點(diǎn)的狀態(tài)。 Array 圖4.7 GET STATUS的工作流程圖CLEAR FEATURE用來清除或禁止設(shè)備的一個(gè)特定的特性。當(dāng)接收到CLEAR FEATURE的請(qǐng)求后,設(shè)備就執(zhí)行相應(yīng)的操作,并返回一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢。圖4.8為CLEAR FEATURE 的工作流程圖。SET FEATURE用來設(shè)置或允許一個(gè)特性。SET FEATURE和CLEAR FEATURE是兩個(gè)相反的動(dòng)作。同樣,當(dāng)接收到SET FEATURE的請(qǐng)求后,設(shè)備就執(zhí)行相應(yīng)的操作,并返回一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢。圖4.9為SET FEATURE的工作流程圖。在USB設(shè)備枚舉的時(shí)候,主機(jī)會(huì)

45、分配一個(gè)新的地址給設(shè)備,以取代默認(rèn)地址(默認(rèn)地址為0。當(dāng)設(shè)備接收到這一設(shè)備請(qǐng)求的時(shí)候,要做的事情就是把設(shè)備的當(dāng)前地址改為分配的 地址,以讓設(shè)備對(duì)新的地址作出響應(yīng)。注意此設(shè)置地址請(qǐng)求不含數(shù)據(jù)階段,MCU需要向主機(jī)寫一個(gè)零長度的數(shù)據(jù)包作為應(yīng)答階段。 Array圖4.8 CLEAR FEATURE的工作流程圖 圖4.9 SET FEATURE的工作流程圖Array圖4.10 SET ADDRESS的工作流程圖GET DESCRIPTOR是主機(jī)用來獲取USB設(shè)備相對(duì)應(yīng)的描述符的一個(gè)請(qǐng)求。在這里,設(shè)備請(qǐng)求值的高8位為要求獲取的描述符的類型,設(shè)備按照請(qǐng)求類型返回相應(yīng)的描述符。下圖為GET DESCRIPT

46、OR的工作流程圖: Array圖4.11 SET DESCRIPTOR的工作流程圖GET CONFIGURATION用于獲取當(dāng)前的配置信息。如果設(shè)備已經(jīng)配置,則返回信息為當(dāng)前的配置值(一個(gè)字節(jié);否則返回為0,表示還沒有配置。圖4.12為GET CONFIGURATION的工作流程圖。SET CONFIGURATION是用來選擇設(shè)備的工作配置。SET CONFIGURATION中的值只能是0或與配置描述符中bConfiguration Value相同的值。一旦SET CONFIGURATION有效,MCU還需要向主機(jī)發(fā)送零數(shù)據(jù)包作為應(yīng)答階段。圖4.13為SET CONFIGURATION的工作流

47、程圖。GET INTERFACE用于返回當(dāng)前的接口號(hào)。返回信息為一個(gè)字節(jié)。SET INTERFACE用于設(shè)備支持多接口的時(shí)候,主機(jī)用來選擇一個(gè)接口。如果選擇正確, 設(shè)備發(fā)送一個(gè)空的數(shù)據(jù)表示執(zhí)行完畢。 圖4.12 GET CONFIGURATION的工作流程圖 存儲(chǔ)器操作程序處理了數(shù)據(jù)的固定存儲(chǔ)讀寫操作。對(duì)FLASH的讀寫又有其自身的特點(diǎn),特別是它可以隨機(jī)讀,但無法隨機(jī)的寫。因此,對(duì)于寫數(shù)據(jù)的問題,就需要通過設(shè)置緩沖 對(duì)于FLASH的擦除操作是基于16K字節(jié)的塊的。下圖為塊擦除函數(shù)程序流程圖: 對(duì)于FLASH的頁拷貝操作是基于512字節(jié)的扇區(qū)的。下圖為頁拷貝函數(shù)程序流程圖: 圖4.14 頁拷貝函

48、數(shù)程序流程圖對(duì)預(yù)處理的功能主要是對(duì)需要寫入的塊進(jìn)行擦除,以及對(duì)這些塊內(nèi)不修改的頁進(jìn)行保存。擦除后就可以對(duì)存儲(chǔ)器進(jìn)行寫操作了。這里對(duì)存儲(chǔ)器的操時(shí)作是以頁為單位進(jìn)行的。下圖為寫FLASH操作的流程圖: 圖4.15 寫FLASH函數(shù)程序流程圖對(duì)FLASH的讀操作可以是隨機(jī)讀取,所以這里只要給定讀數(shù)據(jù)的首地址和讀寫長度。針對(duì)于FLASH的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),讀操作分別要對(duì)每一頁的第一部分和第二部分進(jìn)行。下圖為讀FLASH操作的流程圖: 4.2 固件調(diào)試對(duì)設(shè)備的程序進(jìn)行調(diào)試是本項(xiàng)目開發(fā)過程中最難的部分。由于USB協(xié)議有嚴(yán)格的時(shí)間要求,這就使得程序必須在有效時(shí)間內(nèi)對(duì)某些請(qǐng)求或狀態(tài)進(jìn)行處理,否則,USB將無法正常

49、工作。這里結(jié)合項(xiàng)目的開發(fā)過程,將調(diào)試劃分為以下四個(gè)步驟。在調(diào)試的過程中需要用到一些輔助工具,如示波器、串口調(diào)試軟件和USB總線數(shù)據(jù)檢測(cè)軟件等。確定USB芯片是否已經(jīng)正常工作,是所有調(diào)試的基礎(chǔ),得到電路板之后,這是一個(gè)首先要解決的問題。判斷USB芯片是否已經(jīng)工作,可以從兩個(gè)方面來判斷,一是將CLKOUT 設(shè)為12M(缺省為4M,然后用示波器量CLKOUT引腳,若確為12M而不是4M,則說明USB的地址和數(shù)據(jù)都可以正確傳送,各種信號(hào)線接法正確,USB芯片可以正常工作,硬件基本沒有問題。另一方面,如果使用SOFTCONNECT,則在主程序中進(jìn)行軟連接后,如果GL_N燈閃爍幾下,PC機(jī)上出現(xiàn)了未知設(shè)備

50、,則說明USB進(jìn)行軟連接正常,也說明芯片已經(jīng)工作了。在確定USB設(shè)備正常工作的前提下,插上設(shè)備將進(jìn)入枚舉階段。USB設(shè)備的調(diào)試過程其實(shí)就是根據(jù)主機(jī)的請(qǐng)求,不斷地向主機(jī)提供各種信息的過程。因此,了解主機(jī)按照什么樣的順序向設(shè)備發(fā)出請(qǐng)求,USB設(shè)備的枚舉順序是非常有必要的。以下是USB設(shè)備枚舉數(shù)據(jù)傳輸?shù)娜^程:1.主機(jī)檢測(cè)到有設(shè)備插上,總線復(fù)位;2.主機(jī)讀取設(shè)備描述符;3.地址分配;4.主機(jī)從新的地址獲取設(shè)備描述符;5.主機(jī)讀取配置描述符;6.讀取描述符集合;7.設(shè)置配置;8.讀取配置狀態(tài);9.讀取接口狀態(tài)。本項(xiàng)目USB設(shè)備按海量存儲(chǔ)協(xié)議提供描述符。在調(diào)試的過程中發(fā)現(xiàn)D12控制端點(diǎn)的緩沖區(qū)可以達(dá)到6

51、4個(gè)字節(jié)(芯片數(shù)據(jù)手冊(cè)的說明是控制端點(diǎn)的緩沖區(qū)只有16個(gè)字節(jié),這樣的話,設(shè)備與主機(jī)在枚舉數(shù)據(jù)傳輸過程中就可以以最大64字節(jié)的數(shù)據(jù)包傳輸數(shù)據(jù),減少了數(shù)據(jù)傳輸?shù)拇螖?shù)。如果枚舉階段設(shè)備按海量存儲(chǔ)協(xié)議向主機(jī)提供了描述符,則當(dāng)USB總線數(shù)據(jù)檢測(cè)軟件檢測(cè)到數(shù)據(jù)55 53 42 53時(shí),說明已經(jīng)開始了BULK_ONLY傳輸階段。這時(shí)可以不用太多考慮USB 中斷、端點(diǎn)之類的問題,到此階段后只有兩個(gè)端點(diǎn)工作,即Bulk_In和Bulk_Out端點(diǎn),In或 Out 都是從主機(jī)的角度來講的,前者用于設(shè)備向主機(jī)發(fā)送數(shù)據(jù),后者用于主機(jī)向設(shè)備發(fā)送數(shù)據(jù)。Bulk _In 端點(diǎn)的處理比較簡單,在需要的時(shí)候,設(shè)備將要發(fā)往主機(jī)的數(shù)據(jù)通過此端點(diǎn)送出即可,如果數(shù)據(jù)一次不能發(fā)完,則設(shè)置標(biāo)志位,通過發(fā)送中斷的產(chǎn)生可以實(shí)現(xiàn)連續(xù)發(fā)送。Bulk _Out 端點(diǎn)的情況比較復(fù)雜一些,要判斷收到的是協(xié)議內(nèi)容還是數(shù)據(jù),如果是協(xié)議內(nèi)容,則要對(duì)協(xié)議包進(jìn)行解析,根據(jù)協(xié)議中的內(nèi)容得到SCSI 命令,然后再根據(jù)這些命令處理相應(yīng)的請(qǐng)求。下面為BULK端點(diǎn)處理的流程圖: Bul

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論