




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(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的端點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固件程序的實現(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接口的最大特點是易于使用,這也是USB的主要設(shè)計目標(biāo)。作為一種高速總線接口,USB適用于多種設(shè)備,如數(shù)碼相機(jī)、MP3播放機(jī)、高速數(shù)據(jù)采集設(shè)備等。易于使用還表現(xiàn)在USB接口支持熱插拔,并且所有的配置過程都由系統(tǒng)自動完成,無需用戶干預(yù)。USB接口支持1.5Mb/s(低速、12Mb/s(全速和高達(dá)480Mb/s(USB 2.
3、0規(guī)范的數(shù)據(jù)傳輸速率,扣除用于總線狀態(tài)、控制和錯誤監(jiān)測等的數(shù)據(jù)傳輸,USB的最大理論傳輸速率仍達(dá)1.2Mb/s 或9.6Mb/s,遠(yuǎn)高于一般的串行總線接口。USB接口芯片價格低廉,一個支持USB 1.1 規(guī)范 的USB接口芯片價格大多在人民幣(2004年1530元之間,這也大大促進(jìn)USB設(shè)備的開發(fā)與應(yīng)用。1.3 USB 器件的選擇在進(jìn)行一個USB設(shè)備開發(fā)之前,首先要根據(jù)具體使用要求選擇合適的USB控制器。目前,市場上供應(yīng)的USB控制器主要有兩種:帶USB接口的單片機(jī)(MCU或純粹的USB接口芯片。帶USB接口的單片機(jī)從應(yīng)用上又可以分成兩類,一類是從底層設(shè)計專用于USB控制的單片機(jī)另一類是增加了
4、USB接口的普通單片機(jī),如Cypress公司的EZ-USB(基于8051,選擇這類USB控制器的最大好處在于開發(fā)者對系統(tǒng)結(jié)構(gòu)和指令集非常熟悉,開發(fā)工具簡單,但對于簡單或低成本系統(tǒng)。但價格因素也是在實際選擇過程中需要考慮的因素。純粹的USB 接口芯片僅處理USB通信,必須有一個外部微處理器來進(jìn)行協(xié)議處理和數(shù)據(jù)交換。典型產(chǎn)品有Philips公司的PDIUSBD11(I2C接口、PDIUSBD12(并行接口,NS公司的USBN9603/9604(并行接口,NetChip公司的NET2888 等。USB接口芯片的主要特點是價格便宜、接口方便、可靠性高,尤其適合于產(chǎn)品的改型設(shè)計(硬件上僅需對并行總線和中
5、斷進(jìn)行改動,軟件則需要增加微處理器的USB中斷處理和數(shù)據(jù)交換程序、PC機(jī)的USB接口通信程序,無需對原有產(chǎn)品系統(tǒng)結(jié)構(gòu)作很大的改動。1.4 Mass Storage協(xié)議與FAT16文件系統(tǒng)USB組織定義了海量存儲設(shè)備類(Mass Storage Class的規(guī)范,這個類規(guī)范包括四個獨立的子類規(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。前兩個子規(guī)范定義了數(shù)據(jù)/命令/狀態(tài)在USB上的傳輸方法。Bulk- Only傳輸規(guī)范僅僅使用Bulk端點傳送數(shù)據(jù)/命令/狀態(tài),CBI傳輸規(guī)范則使用Control/Bulk/Interrupt三種類型的端點進(jìn)行數(shù)據(jù)/命令/狀態(tài)傳送。后兩個子規(guī)范則定義了存儲介質(zhì)的操作命令。ATA命令規(guī)范用于硬盤,UFI 命令規(guī)范是針對USB移動存儲。Microsoft Windows中提供對Mass Storage協(xié)議的支持,因此USB移動設(shè)備只需要遵循Mass Storage協(xié)議來組織數(shù)據(jù)和處理命令,即可
7、實現(xiàn)與PC機(jī)交換數(shù)據(jù)。而Flash的存儲單元組織形式采用FAT16文件系統(tǒng),這樣,就可以直接在Windows的瀏覽器中通過可移動磁盤來交換數(shù)據(jù)了,Windows負(fù)責(zé)對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是每個星型結(jié)構(gòu)的中心。PC機(jī)就是主機(jī)和根HUB,用戶可以將外設(shè)或附加的HUB與之相連,這些附加的HUB可以連接另外的外設(shè)以及下層HUB。USB支持最多5個HUB層以及127個外設(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)一步敘述,這里給出端點(endpoint和管道(pipe的概念。端點:每一個USB設(shè)備在主機(jī)看來就是一個端點的集合,主機(jī)只能通過端點與設(shè)備進(jìn) 行通訊,以使用設(shè)備的功能。每一個端點實際上就是一個一定大小的數(shù)據(jù)緩沖區(qū),這些端點在設(shè)備出廠時就已經(jīng)定義好了。在USB系統(tǒng)中,每一個端點都有唯一的地址,這是由設(shè)備地址和端點號給出的。每個端點都有一定的特性。其中包括:傳輸方式、總線訪問頻率、帶寬、端點號、數(shù)據(jù)包的最大容量等等。除端點0外,其它端點必須在設(shè)備配置后才能生效。端點0通常為控制端點,用于設(shè)備初始化參數(shù)等
9、,端點1、2等一般用作數(shù)據(jù)端點,存放主機(jī)與設(shè)備間往來的數(shù)據(jù)。管道:一個USB管道是驅(qū)動程序的一個數(shù)據(jù)緩沖區(qū)與一個外設(shè)端點的連接,它代表了一種在兩者之間移動數(shù)據(jù)的能力。一旦設(shè)備被配置,管道就存在了。管道由兩種類型,數(shù)據(jù)流管道(其中的數(shù)據(jù)沒有USB定義的結(jié)構(gòu)與消息管道(其中的數(shù)據(jù)必須由USB定義的結(jié)構(gòu)。管道只是一個邏輯上的概念。所有的設(shè)備必須支持端點0以作為設(shè)備的控制管道。通過控制管道可以獲取完全描述USB設(shè)備的信息,包括:設(shè)備類型、電源管理、配置、端點描述等等。只要設(shè)備連接到USB 上并上電,端點0就可以被訪問,與之對應(yīng)的控制管道就存在了。一個USB設(shè)備可以分為三個層。最底層是總線接口,用來發(fā)送
10、與接收包。中間層處理總線接口與不同的端點之間的數(shù)據(jù)流通。一個端點是數(shù)據(jù)最終的使用者或提供者,它可以看作是數(shù)據(jù)源或是數(shù)據(jù)接收端。最上層就是USB設(shè)備所提供的功能,比如鼠標(biāo)或鍵盤等。 圖2.2 USB設(shè)備層次結(jié)構(gòu)HUB在USB結(jié)構(gòu)中是一個關(guān)鍵,它提供了附加的USB節(jié)點,這些節(jié)點被稱為端口。HUB 可以檢測出每一個下行端口的狀態(tài),并且可以給下端的設(shè)備提供電源。從下圖描述了一個典型的HUB結(jié)構(gòu)。 圖2.3 USB HUBUSB設(shè)備可以即插即用,但在可以使用之前,必須對設(shè)備進(jìn)行配置。一旦設(shè)備連接到某個USB的節(jié)點上,USB就會產(chǎn)生一系列的操作,來完成對設(shè)備的配置,這種操作被稱為總線枚舉過程:1.設(shè)備所連
11、接的HUB檢測出端口上由設(shè)備連接,通過狀態(tài)變化管道向主機(jī)報告;2.主機(jī)通過詢問HUB以獲得確切的信息;3.主機(jī)這時知道設(shè)備連接到那個端口上,于是向這個端口發(fā)出復(fù)位命令;4.HUB發(fā)出的復(fù)位信號結(jié)束后,端口被打開,HUB向設(shè)備提供100mA的電源,這時設(shè)備上電,所有的寄存器復(fù)位,并且以缺省地址0以及端點0響應(yīng)命令;5.主機(jī)通過缺省地址與端點0進(jìn)行通訊,賦予設(shè)備一個唯一的地址,并且讀取設(shè)備的配置信息;6.最后主機(jī)對設(shè)備進(jìn)行配置,該設(shè)備就可以使用了。 當(dāng)該設(shè)備被移走時,HUB依然要報告主機(jī),并且關(guān)閉端口。一旦主機(jī)接收到設(shè)備移走的報告,就會改寫當(dāng)前結(jié)構(gòu)信息。USB設(shè)備的電源可以由USB總線供給,也可以
12、自備電源。一個USB設(shè)備可以具有這兩種供電方式,但同一時刻只能由一種方式供電。這兩種供電方式是可以切換的。為了節(jié)電,當(dāng)設(shè)備在指定的時間內(nèi)沒有總線傳輸,USB設(shè)備自動進(jìn)入掛起狀態(tài)。如果設(shè)備所接的HUB的端口被禁止了,設(shè)備也將進(jìn)入掛起狀態(tài)(稱之為選擇掛起。當(dāng)然主機(jī)也可以進(jìn)入掛起狀態(tài)。USB設(shè)備當(dāng)總線活動時,就會離開掛起狀態(tài)。一個設(shè)備也可以通過電信號來遠(yuǎn)程喚醒進(jìn)入掛起狀態(tài)的主機(jī)。這個能力是可選的,如果一個設(shè)備具有這個能力,主機(jī)有能力禁止或允許使用這種能力。2.3 USB主機(jī)USB主機(jī)在USB系統(tǒng)中處于中心地位,并且對USB及其連接的設(shè)備有著特殊的責(zé)任。主機(jī)控制著所有對USB的訪問,一個外設(shè)只有主機(jī)允
13、許才有訪問總線的權(quán)利。主機(jī)同時也檢測著USB的結(jié)構(gòu)。USB主機(jī)包括三層:設(shè)備驅(qū)動程序,USB系統(tǒng)軟件,USB主控制器(主機(jī)的總線接口。另外,還有兩個軟件接口:USB驅(qū)動(USBD接口,主機(jī)控制驅(qū)動(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)軟件通過缺省管道(與端點0相對應(yīng)管道設(shè)備,設(shè)備驅(qū)動程序通過其它的管道來管理設(shè)備的功能接口。實際的數(shù)據(jù)傳輸過程是這樣的:設(shè)備驅(qū)動程序通過對USBD接口(USB driver interface的調(diào)用發(fā)出輸入輸出請求(IRP, I/O Request Packe
14、t;USB驅(qū)動程序接到請求后,調(diào)用HCD接口(host controller driver interface,將IRP轉(zhuǎn)化為USB的傳輸(transfer,一個IRP可以包含一個或多個USB傳輸;然后HCD將USB傳輸分解為總線操作(transaction,由主控制器以包(packet的形式發(fā)出。需要注意的是:所有的數(shù)據(jù)傳輸都是由主機(jī)開始的,任何外設(shè)都無權(quán)開始一個傳輸。IRP是由操作系統(tǒng)定義的,而USB傳輸與總線操作是USB規(guī)范定義的。為了進(jìn)一步說明USB傳輸,這里引出幀(frame的概念。幀:USB總線將1ms定義為一幀,每幀以一個SOF包為開始,在這1ms里USB進(jìn)行一系列的總線操作。引
15、入幀的概念主要是為了支持與時間有關(guān)的總線操作。為了滿足不同外設(shè)和用戶的要求,USB提供了四中傳輸方式:控制傳輸;同步傳輸;中斷傳輸;批傳輸。它們在數(shù)據(jù)格式、傳輸方向、數(shù)據(jù)包容量限制、總線訪問限制等方面有著各自不同的特征:控制傳輸(Control Transfer1.通常用于配置、命令、狀態(tài)等情形;2.其中的設(shè)置操作(setup和狀態(tài)操作(status的數(shù)據(jù)包具有USB定義的結(jié)構(gòu),因此控制傳輸只能通過消息管道進(jìn)行;3.支持雙向傳輸;4.對與高速設(shè)備,允許數(shù)據(jù)包最大容量為8,16,32或64字節(jié),對于低速設(shè)備只有8字節(jié)一種選擇;5.端點不能指定總線訪問的頻率和占用總線的時間,USB系統(tǒng)軟件會做出限
16、制;6.具有數(shù)據(jù)傳輸保證,在必要時可以重試。同步傳輸(Isochronous Transfer1.是一種周期的、連續(xù)的傳輸方式,通常用于與時間有密切關(guān)系的信息的傳輸;2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)(數(shù)據(jù)流管道; 3.單向傳輸,如果一個外設(shè)需要雙向傳輸,則必須使用另一個端點;4.只能用于高速設(shè)備,數(shù)據(jù)包的最大容量可以從0到1023個字節(jié);5.具有帶寬保證,并且保持?jǐn)?shù)據(jù)傳輸?shù)乃俾屎愣?每個同步管道每幀傳輸一個數(shù)據(jù)包;6.沒有數(shù)據(jù)重發(fā)機(jī)制,要求具有一定的容錯性;7.與中斷方式一起,占用總線的時間不得超過一幀的90%。中斷傳輸(Interrupt Transfer1.用于非周期的、自然發(fā)生的、數(shù)據(jù)量很小
17、的信息的傳輸,如鍵盤、鼠標(biāo)等。2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)(數(shù)據(jù)流管道;3.只有輸入這一種傳輸方式(即外設(shè)到主機(jī);4.對于高速設(shè)備,允許數(shù)據(jù)包最大容量為小于或等于64字節(jié),對于低速設(shè)備只能小于或等于8字節(jié);5.具有最大服務(wù)周期保證,即在規(guī)定時間內(nèi)保證有一次數(shù)據(jù)傳輸;6.與同步方式一起,占用總線的時間不得超過一幀的90%;7.具有數(shù)據(jù)傳輸保證,在不要時可以重試。批傳輸(Bulk Transfer1.用于大量的、對時間沒有要求的數(shù)據(jù)傳輸;2.數(shù)據(jù)沒有USB定義的結(jié)構(gòu)(數(shù)據(jù)流管道;3.單向傳輸,如果一個外設(shè)需要雙向傳輸,則必須使用另一個端點;4.只能用于高速設(shè)備,允許數(shù)據(jù)包最大容量為8,16,32或
18、64字節(jié);5.沒有帶寬的保證,只要有總線空閑,就允許傳輸數(shù)據(jù)(優(yōu)先級小于控制傳輸;6.具有數(shù)據(jù)傳輸保證,在必要時可以重試,以保證數(shù)據(jù)的準(zhǔn)確性。 圖2.6 USB數(shù)據(jù)傳輸2.5 USB的端點端點是USB中一個獨特的概念,它是一個可以與USB Host交換數(shù)據(jù)的硬件單元。USB Host與USB設(shè)備之間都是通過端點來傳輸數(shù)據(jù)的,端點是橋梁和紐帶,不同的端點其傳輸數(shù)據(jù)的能力不同,適于不同的應(yīng)用場合。PDIUSBD12的端點適用于不同類型的設(shè)備,例如圖像打印機(jī)、海量存儲器和通信設(shè)備。 端點可通過Set Mode命令配置為4種不同的模式,分別為:1.模式0 Non-ISO 模式:非同步傳輸2.模式1 I
19、SO-OUT 模式:同步輸出傳輸3.模式2 ISO-IN 模式:同步輸入傳輸4.模式3 ISO-IO 模式:同步輸入輸出傳輸這幾種模式下可得到的端點情況如下表2.1:表2.1 端點模式 端點2(主端點是進(jìn)行吞吐大量數(shù)據(jù)的主要端點。主端點執(zhí)行主機(jī)的特性以減輕傳輸大數(shù)據(jù)的任務(wù),包括:1.雙緩沖。允許USB與本地CPU之間的并行讀寫操作,增加了數(shù)據(jù)的吞吐量。緩沖區(qū)切換是自動處理的,導(dǎo)致了透明的緩沖區(qū)操作。2.支持DMA(直接存儲器訪問操作,可以和對其他端點的正常I/O操作交進(jìn)行。3.DMA操作中的自動指針處理,在跨過緩沖區(qū)邊界時不需要本地CPU的干預(yù)。4.可配置為同步傳輸或非同步(批量和中斷傳輸。
20、第三章 協(xié)議3.1 Mass Storage 協(xié)議USB協(xié)議能夠在啟動或是當(dāng)設(shè)備插入系統(tǒng)時對設(shè)備進(jìn)行備置,這就是USB設(shè)備為什么可以執(zhí)插撥的原因。USB設(shè)備被分成以下幾類:顯示器(Monitors、通訊設(shè)備(Communication devices、音頻設(shè)備(Audio、人機(jī)輸入(Human input、海量存儲(Mass storage。特定類(class的設(shè)備又可劃分成子類(subclass,劃分子類的后軟件就可以搜索總線并選擇所有它可以支持的設(shè)備。每個設(shè)備可以有一個或多個配置(Configuration,配置 用于定義設(shè)備的功能。如果某個設(shè)備有幾種不同的功能,則每個功能都需要一個配置。
21、配置(configuration是接口(interface的集合。接口指定設(shè)備中的哪些硬件與USB交換數(shù)據(jù)。每一個與USB交換數(shù)據(jù)的硬件就叫做一個端點(endpoint。因此,接口是端點的集合。USB的設(shè)備類別定義(USB Device Class Definitions定義特定類或子類中的設(shè)備需要提供的缺省配置、接口和端點。描述符(descriptor描述設(shè)備、配置、接口或端點的一般信息,下圖為USB 描述符的層次結(jié)構(gòu)。 圖3.1 USB描述符層次結(jié)構(gòu)USB(Host唯一通過描述符了解設(shè)備的有關(guān)信息,根據(jù)這些信息建立起通信,在這些描述符中,規(guī)定了設(shè)備所使用的協(xié)議、端點情況等。因此,正確地提供
22、描述符,是USB設(shè)備正常工作的先決條件。USB海量存儲設(shè)備(USB Mass Storage Class包括General Mass Storage Subclass、CD-ROM、Tape、Solid State。Mass Storage Class只需要支持一個接口,即數(shù)據(jù)(Data接口,選擇缺省配置時此接口即被激活。數(shù)據(jù)接口允許與設(shè)備之間進(jìn)行數(shù)據(jù)傳輸,它提供三個端點:Bulk Input 端點、Bulk Output 端點和中斷端點。通用海量存儲設(shè)備(General Mass Storage Device是隨機(jī)存取、基于塊/扇區(qū)存儲的設(shè)備。它只能存儲和取回來自CPU 的數(shù)據(jù)。這種設(shè)備的接
23、口遵循SCSI-2標(biāo)準(zhǔn)的直接存取存儲設(shè)備 (Direct Access Storage Device協(xié)議。USB設(shè)置上的介質(zhì)使用與SCSI-2設(shè)備相同的邏輯塊(logical blocks方式尋址。下面介紹基于Bulk Only(批量傳輸模式的Mass Storage 設(shè)備的描述符:每個USB設(shè)備都必須有一個設(shè)備描述符。 圖3.2 設(shè)備(Device描述符Mass Stroage設(shè)備的設(shè)備類型和子類代碼均在接口描述符中設(shè)置,這里置0。其中iSerialNumber可為零,即不指定Serial Number。配置描述符如下圖: 圖3.3 配置(Configuration描述符這里配置所支持的接口
24、數(shù)應(yīng)為1。即設(shè)置至少支持一個接口,這里為Bulk-Only Data 接口,此接口使用三個端點:控制端點(默認(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描述符由于控制端點為每個設(shè)備都使用的缺省端點,因此不需要定義,只需定義Bulk-In和Bulk-Out兩個端點,其端點描述符如下: 圖3.7 Bulk-In端
25、點描述符 圖3.8 Bulk-Out端點描述符3.2 Bulk-Only傳輸協(xié)議設(shè)備插入到USB后,USB即對設(shè)備進(jìn)行搜索,并要求設(shè)備提供相應(yīng)的描述符。在USB Host 得到上述描述符后,即完成了設(shè)備的配置,識別出為Bulk-Only的Mass Storage設(shè)備,然后即進(jìn)入Bulk-Only傳輸方式。在此方式下,USB與設(shè)備間的所有數(shù)據(jù)均通過Bulk-In和Bulk-Out來進(jì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ā)送下一個CBW或是數(shù)據(jù)。Host要求USB設(shè)備執(zhí)行的命令可能為發(fā)送數(shù)據(jù),則此時需要將特定數(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ā)送的是一個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è)備有多個邏輯單元時,用此位指定本次命令是發(fā)給誰的;bCBWCBLength 為本次命令字的長度;CBWCB即為真正的傳輸命令集的命令。設(shè)備得到一個CBW后,解析出CBWCD中所代表的命令,然后按照SCSI命令集中的定義來執(zhí)行相應(yīng)的操作,或是需
28、要接收下一個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ā)送的是一個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è)備按這個規(guī)則組裝好CSW后,通過Bulk-In端點將其發(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個組,低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為初始程序為返回數(shù)據(jù)所分配的最大字節(jié)數(shù),此值可以為零,表示不需要傳送數(shù)據(jù)。SCSI指令集的Direct Accesss類型存儲介質(zhì)的傳輸命令有許多,所幸運的是Mass Storage協(xié)議只用到了其中的一些。下面黑體
31、部分即為需要USB設(shè)備作出響應(yīng)的請求,一般是要求向Host發(fā)送一些有關(guān)設(shè)備的數(shù)據(jù): 表3.1 SCSI指令集 對于不同的命令,其命令塊描述符略有不同,其要求的返回內(nèi)容也有所不同,根據(jù)相應(yīng)的文檔,可以對每種請求作出適當(dāng)?shù)幕貞?yīng)。下面以INQUIRY請求為例,給出該命令塊的命令塊描述符和其返回內(nèi)容的數(shù)據(jù)格式,其它命令塊格式和返回內(nèi)容請參考Information technology - SCSI Primary Commands - 2(SPC-2。 圖3.13 INQUIRY命令塊描述符 圖3.14 INQUIRY命令返回數(shù)據(jù)格式Host會依次發(fā)出INQUIRY、READ CAPACITY、UFI
32、 MODE SENSE請求,如果上述請求的返回結(jié)果都正確,則Host會發(fā)出READ命令,讀取文件系統(tǒng)0簇0扇區(qū)的MBR數(shù)據(jù),進(jìn)入文件系統(tǒng)識別階段。對于PREVENT-ALLOW MEDIUM REMOVAL和TEST UNIT READY命令,只需直接返回CSW即可,對于后者,由于Flash盤總是處于READY狀態(tài),故可直接返回CSW。3.4 FAT16 文件系統(tǒng)一個FAT(FAT12/FAT16/FAT32文件系統(tǒng)卷(卷可以理解為是一張軟盤、一個硬盤或是一個Flas電子盤由四個部分組成:分區(qū)的保留區(qū)(Reserved Region中的第一個扇區(qū)必須是BPB(BIOS Parameter Bl
33、ock, 此扇區(qū)有時也稱作“引導(dǎo)扇區(qū)”、“保留扇區(qū)”或是“零扇區(qū)”,因為它含有對文件系統(tǒng)進(jìn)行識別的關(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)分配磁盤空間按簇來分配的。因此,文件占用磁盤空間時,基本單位不是字節(jié)而是簇,即使某個文件只有一個字節(jié),操作系統(tǒng)也會給他分配一個最小單元即一個簇。為了可以將磁盤空間有序地分配給相應(yīng)的文件,而讀取文件的時候又可以從相應(yīng)的地址讀出文件,我們把整個磁盤空間分成32K字節(jié)長的簇來管理,每個簇在FAT表中占據(jù)著一
34、個16位的位置,稱為一個表項。對于大文件,需要分配多個簇。同一個文件的數(shù)據(jù)并不一定完整地存放在磁盤的一個連續(xù)的區(qū)域內(nèi),而往往會分成若干段,像一條鏈子一樣存放。這種存儲方式稱為文件的鏈?zhǔn)酱鎯?。為了實現(xiàn)文件的鏈?zhǔn)酱鎯?硬盤上必須準(zhǔn)確地記錄哪些簇已經(jīng)被文件占用,還必須為每個已經(jīng)占用的簇指明存儲后繼內(nèi)容的下一個簇的簇號,對一個文件的最后一簇,則要指明本簇?zé)o后繼 簇。這些都是由FAT表來保存的,FAT表的對應(yīng)表項中記錄著它所代表的簇的有關(guān)信息:諸如是否空,是否是壞簇,是否已經(jīng)是某個文件的尾簇等。FAT區(qū)的結(jié)構(gòu)如下:表3.5 FAT區(qū)結(jié)構(gòu) FAT的項數(shù)與硬盤上的總簇數(shù)相關(guān)(因為每一個項要代表一個簇,簇越多
35、當(dāng)然需要的FAT 表項越多,每一項占用的字節(jié)數(shù)也與總簇數(shù)有關(guān)(因為其中需要存放簇號,簇號越大當(dāng)然每項占用的字節(jié)數(shù)就大。FAT的格式有多種,最為常見是FAT16和FAT32,其中FAT16是指文件分配表使用16位,由于16位分配表最多能管理65536(即2的16次方個簇,又由于每個簇的存儲空間最大只有32KB,所以在使用FAT16管理硬盤時,每個分區(qū)的最大存儲容量只有(65536×32 KB即2048MB,也就是我們常說的2G。現(xiàn)在的硬盤容量是越來越大,由于FAT16對硬盤分區(qū)的容量限制,所以當(dāng)硬盤容量超過2G之后,用戶只能將硬盤劃分成多個2G的分區(qū)后才能正常使用。由于FAT對于文件管
36、理的重要性,所以FAT有一個備份,即在原FAT的后面再建一個同樣的FAT。緊接著第二個FAT表的后面一個扇區(qū),就是根目錄區(qū)了。根目錄區(qū)中存放目錄項,每個目錄項為32個字節(jié),記錄一個文件或目錄的信息(長文件名例外。以下是目錄項的結(jié)構(gòu):表3.6 目錄項結(jié)構(gòu) 目錄項所占的扇區(qū)數(shù)與有多少個目錄項有關(guān),它將占用(目錄項*32/512個扇區(qū)。目錄項的所占的最后一個扇區(qū)之后,便是真正存放文件數(shù)據(jù)或是目錄的位置了。Flash硬盤與普通的磁頭、柱面式介質(zhì)不一樣。在開發(fā)U盤的過程中,使用Flash作為存儲介質(zhì)。它有其特定的結(jié)構(gòu)特點。以32M的三星K9F5608U0A-YCB0 Flash為例,它有2048個Blo
37、ck,每個Block 有32個Page,每個Page有512+16=528個字節(jié)。 圖3.15 Flash 的結(jié)構(gòu)Flash的讀寫有其自身特點:1.必須以Page為單位進(jìn)行讀寫;2.寫之前必須先擦除原有內(nèi)容;3.擦除操作必須對Block進(jìn)行,即一次至少擦除一個Block的內(nèi)容。針對這種情況,將Flash的一個Page定為1個扇區(qū),將其2個Block,64個扇區(qū)定為一個簇,這樣,簇的容量剛好為512*64=32K,滿足FAT16對簇大小的要求。FAT分配空間的時候,是按簇來分配的,但是其給出的地址卻是LBA(Logical BlockAddress,即它只給出一個扇區(qū)號,比如對此Flash而言,
38、若給出LBA為0x40,實代表簇1的扇區(qū)1。因此需要將Logical Block Address轉(zhuǎn)換為物理地址,這樣,才可以對數(shù)據(jù)進(jìn)行存取操作。根據(jù)上面定義的結(jié)構(gòu),轉(zhuǎn)換公式為:Flash 的Block = Logical Block Address/0x20 (1 Flash 的Page = Logical Block Address %0x20 (2實際上,如果定義每個簇為32 個扇區(qū)是最好的,因為這樣物理結(jié)構(gòu)和邏輯結(jié)構(gòu)剛好一致。但是這也無防,因為不管Logical Block Address給出什么值,只要按上述公式,總可以得到物理上正確的Block 和Page,再使用Flash的讀寫命令
39、讀取對應(yīng)的Block和Page就可以了, 因此簇和扇區(qū)的概念只是在BPB中給出存儲介質(zhì)信息的時候告之系統(tǒng)就可以了,這里只要做好LBA與物理地址間的轉(zhuǎn)換就可以了。由于做為U盤的Flash不要求啟動,因此可以沒有MBR 區(qū),只包含DBR、FAT、DIR和DATA四個區(qū)。因此,Flash的前兩個Block的內(nèi)容如下:表3.6 Flash的前兩個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)存儲介質(zhì)的有關(guān)信息,諸如扇區(qū)長度、每簇扇區(qū)數(shù)以及總扇區(qū)數(shù)等內(nèi)容,以便知道此盤有多大。如果讀取正確,會接著讀取文件分配表,借以在PC 機(jī)上的可移動盤符中顯示文件目錄,并可以復(fù)制、刪除或是創(chuàng)建文件。系統(tǒ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 固件程序的實現(xiàn)主循環(huán)檢查事件標(biāo)志并進(jìn)入子程序進(jìn)行進(jìn)一步的處理。MCU一但上電就
41、需要初始化其所有端口、存儲區(qū)、定時器和中斷服務(wù)程序。之后MCU將重新連接USB,包括將Soft_Connect 寄存器設(shè)置為ON,因為這些過程確保了在MCU準(zhǔn)備好服務(wù)D12之前D12不會進(jìn)行操作,所以是很重要的。下圖為主循環(huán)流程: 中斷服務(wù)程序代碼處理由D12產(chǎn)生的中斷,它將數(shù)據(jù)從D12的內(nèi)FIFO取回到CPU存儲器,并建立正確的事件標(biāo)志,以通知相應(yīng)的子程序進(jìn)行處理。下圖為中斷服務(wù)程序流程圖: 圖4.2 中斷服務(wù)程序流程圖 控制傳輸總是在SETUP階段開始,之后為可選的DATA階段,然后在STATUS階段結(jié)束。固件使用這3個狀態(tài)來正確處理控制傳輸。下圖為控制端點處理程序流程圖: 圖4.3 控制
42、輸出程序流程圖 圖4.4 控制輸入程序流程圖 對于普通輸出端點(本項目中為BULK_OUT端點配置為從主機(jī)接收數(shù)據(jù)包。當(dāng)MCU從主機(jī)接收輸出中斷標(biāo)志(通過讀中斷寄存器識別時,D12中斷位清零。選擇端點將清零緩沖區(qū),接下來MCU需要確認(rèn)數(shù)據(jù)的長度并把數(shù)據(jù)讀出,然后進(jìn)入數(shù)據(jù)處理子程序。對于普通輸入端點(本項目中為BULK_IN端點的中斷,只要讀取端點號的最后處理狀態(tài)寄存器來清除中斷寄存器的相應(yīng)位,并把狀態(tài)清零即可。輸入端點中斷是在發(fā)送完數(shù)據(jù)后才產(chǎn)生的,當(dāng)還有數(shù)據(jù)要發(fā)送時,可以在中斷程序程序里接著繼續(xù)發(fā)送。 下圖為普通端點處理程序流程圖:. 圖4.5 普通端點處理程序流程圖總線復(fù)位和掛起并不要求在I
43、SR中進(jìn)行特殊的處理,所以這里直接退出程序即可。在中斷服務(wù)程序還里定義了數(shù)據(jù)提交函數(shù)。該子程序負(fù)責(zé)把數(shù)據(jù)寫入端點緩沖區(qū),然后提交給主機(jī)。下圖為數(shù)據(jù)提交函數(shù)程序流程圖: 圖4.6 數(shù)據(jù)提交函數(shù)程序流程圖GET STATUS請求要求接收方返回一個相應(yīng)的狀態(tài),設(shè)備返回16位的狀態(tài)描述。圖4.7為GET STATUS的工作流程圖。當(dāng)GET STATUS的索引為設(shè)備時,主機(jī)獲取設(shè)備的狀態(tài)。如果請求是對器件,MCU必須向主機(jī)返回器件狀態(tài)。因為接口狀態(tài)的16位字節(jié)全部保留,所以返回0x0000即可。一個端點有輸入和輸出兩個端點號。這里使用了索引BIT7來標(biāo)識要求返回的端點的方 向,BIT7=1為返回輸入端點
44、的狀態(tài);BIT7=0為返回輸出端點的狀態(tài)。 Array 圖4.7 GET STATUS的工作流程圖CLEAR FEATURE用來清除或禁止設(shè)備的一個特定的特性。當(dāng)接收到CLEAR FEATURE的請求后,設(shè)備就執(zhí)行相應(yīng)的操作,并返回一個空的數(shù)據(jù)表示執(zhí)行完畢。圖4.8為CLEAR FEATURE 的工作流程圖。SET FEATURE用來設(shè)置或允許一個特性。SET FEATURE和CLEAR FEATURE是兩個相反的動作。同樣,當(dāng)接收到SET FEATURE的請求后,設(shè)備就執(zhí)行相應(yīng)的操作,并返回一個空的數(shù)據(jù)表示執(zhí)行完畢。圖4.9為SET FEATURE的工作流程圖。在USB設(shè)備枚舉的時候,主機(jī)會
45、分配一個新的地址給設(shè)備,以取代默認(rèn)地址(默認(rèn)地址為0。當(dāng)設(shè)備接收到這一設(shè)備請求的時候,要做的事情就是把設(shè)備的當(dāng)前地址改為分配的 地址,以讓設(shè)備對新的地址作出響應(yīng)。注意此設(shè)置地址請求不含數(shù)據(jù)階段,MCU需要向主機(jī)寫一個零長度的數(shù)據(jù)包作為應(yīng)答階段。 Array圖4.8 CLEAR FEATURE的工作流程圖 圖4.9 SET FEATURE的工作流程圖Array圖4.10 SET ADDRESS的工作流程圖GET DESCRIPTOR是主機(jī)用來獲取USB設(shè)備相對應(yīng)的描述符的一個請求。在這里,設(shè)備請求值的高8位為要求獲取的描述符的類型,設(shè)備按照請求類型返回相應(yīng)的描述符。下圖為GET DESCRIPT
46、OR的工作流程圖: Array圖4.11 SET DESCRIPTOR的工作流程圖GET CONFIGURATION用于獲取當(dāng)前的配置信息。如果設(shè)備已經(jīng)配置,則返回信息為當(dāng)前的配置值(一個字節(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)前的接口號。返回信息為一個字節(jié)。SET INTERFACE用于設(shè)備支持多接口的時候,主機(jī)用來選擇一個接口。如果選擇正確, 設(shè)備發(fā)送一個空的數(shù)據(jù)表示執(zhí)行完畢。 圖4.12 GET CONFIGURATION的工作流程圖 存儲器操作程序處理了數(shù)據(jù)的固定存儲讀寫操作。對FLASH的讀寫又有其自身的特點,特別是它可以隨機(jī)讀,但無法隨機(jī)的寫。因此,對于寫數(shù)據(jù)的問題,就需要通過設(shè)置緩沖 對于FLASH的擦除操作是基于16K字節(jié)的塊的。下圖為塊擦除函數(shù)程序流程圖: 對于FLASH的頁拷貝操作是基于512字節(jié)的扇區(qū)的。下圖為頁拷貝函數(shù)程序流程圖: 圖4.14 頁拷貝函
48、數(shù)程序流程圖對預(yù)處理的功能主要是對需要寫入的塊進(jìn)行擦除,以及對這些塊內(nèi)不修改的頁進(jìn)行保存。擦除后就可以對存儲器進(jìn)行寫操作了。這里對存儲器的操時作是以頁為單位進(jìn)行的。下圖為寫FLASH操作的流程圖: 圖4.15 寫FLASH函數(shù)程序流程圖對FLASH的讀操作可以是隨機(jī)讀取,所以這里只要給定讀數(shù)據(jù)的首地址和讀寫長度。針對于FLASH的數(shù)據(jù)存儲結(jié)構(gòu),讀操作分別要對每一頁的第一部分和第二部分進(jìn)行。下圖為讀FLASH操作的流程圖: 4.2 固件調(diào)試對設(shè)備的程序進(jìn)行調(diào)試是本項目開發(fā)過程中最難的部分。由于USB協(xié)議有嚴(yán)格的時間要求,這就使得程序必須在有效時間內(nèi)對某些請求或狀態(tài)進(jìn)行處理,否則,USB將無法正常
49、工作。這里結(jié)合項目的開發(fā)過程,將調(diào)試劃分為以下四個步驟。在調(diào)試的過程中需要用到一些輔助工具,如示波器、串口調(diào)試軟件和USB總線數(shù)據(jù)檢測軟件等。確定USB芯片是否已經(jīng)正常工作,是所有調(diào)試的基礎(chǔ),得到電路板之后,這是一個首先要解決的問題。判斷USB芯片是否已經(jīng)工作,可以從兩個方面來判斷,一是將CLKOUT 設(shè)為12M(缺省為4M,然后用示波器量CLKOUT引腳,若確為12M而不是4M,則說明USB的地址和數(shù)據(jù)都可以正確傳送,各種信號線接法正確,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)試過程其實就是根據(jù)主機(jī)的請求,不斷地向主機(jī)提供各種信息的過程。因此,了解主機(jī)按照什么樣的順序向設(shè)備發(fā)出請求,USB設(shè)備的枚舉順序是非常有必要的。以下是USB設(shè)備枚舉數(shù)據(jù)傳輸?shù)娜^程:1.主機(jī)檢測到有設(shè)備插上,總線復(fù)位;2.主機(jī)讀取設(shè)備描述符;3.地址分配;4.主機(jī)從新的地址獲取設(shè)備描述符;5.主機(jī)讀取配置描述符;6.讀取描述符集合;7.設(shè)置配置;8.讀取配置狀態(tài);9.讀取接口狀態(tài)。本項目USB設(shè)備按海量存儲協(xié)議提供描述符。在調(diào)試的過程中發(fā)現(xiàn)D12控制端點的緩沖區(qū)可以達(dá)到6
51、4個字節(jié)(芯片數(shù)據(jù)手冊的說明是控制端點的緩沖區(qū)只有16個字節(jié),這樣的話,設(shè)備與主機(jī)在枚舉數(shù)據(jù)傳輸過程中就可以以最大64字節(jié)的數(shù)據(jù)包傳輸數(shù)據(jù),減少了數(shù)據(jù)傳輸?shù)拇螖?shù)。如果枚舉階段設(shè)備按海量存儲協(xié)議向主機(jī)提供了描述符,則當(dāng)USB總線數(shù)據(jù)檢測軟件檢測到數(shù)據(jù)55 53 42 53時,說明已經(jīng)開始了BULK_ONLY傳輸階段。這時可以不用太多考慮USB 中斷、端點之類的問題,到此階段后只有兩個端點工作,即Bulk_In和Bulk_Out端點,In或 Out 都是從主機(jī)的角度來講的,前者用于設(shè)備向主機(jī)發(fā)送數(shù)據(jù),后者用于主機(jī)向設(shè)備發(fā)送數(shù)據(jù)。Bulk _In 端點的處理比較簡單,在需要的時候,設(shè)備將要發(fā)往主機(jī)的數(shù)據(jù)通過此端點送出即可,如果數(shù)據(jù)一次不能發(fā)完,則設(shè)置標(biāo)志位,通過發(fā)送中斷的產(chǎn)生可以實現(xiàn)連續(xù)發(fā)送。Bulk _Out 端點的情況比較復(fù)雜一些,要判斷收到的是協(xié)議內(nèi)容還是數(shù)據(jù),如果是協(xié)議內(nèi)容,則要對協(xié)議包進(jìn)行解析,根據(jù)協(xié)議中的內(nèi)容得到SCSI 命令,然后再根據(jù)這些命令處理相應(yīng)的請求。下面為BULK端點處理的流程圖: Bul
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 預(yù)制菜在2025年餐飲業(yè)環(huán)保政策下的機(jī)遇與挑戰(zhàn)報告
- 保險承保題目及答案
- 安全職稱考試題庫及答案
- 康復(fù)醫(yī)療器械市場創(chuàng)新產(chǎn)品應(yīng)用前景預(yù)測:2025年需求分析報告
- 安全生產(chǎn)禁令試題及答案
- 培訓(xùn)課件有沒有版權(quán)
- 2025年成人教育終身學(xué)習(xí)平臺運營效率與市場占有率研究報告
- 個人養(yǎng)老金制度2025年對能源行業(yè)投資的影響與機(jī)遇分析報告
- 智慧交通系統(tǒng)2025年交通流量預(yù)測技術(shù)應(yīng)用與智能交通設(shè)施報告001
- 胖東來管理培訓(xùn)課件
- 軟式內(nèi)鏡清洗消毒技術(shù)規(guī)范2025
- 《動物保定技術(shù)》課件
- 北京市朝陽區(qū)2023-2024學(xué)年四年級下學(xué)期語文期末考試卷(含答案)
- 上樣合作協(xié)議合同協(xié)議
- 兒科系列常見病中藥臨床試驗設(shè)計與評價技術(shù)指南急性咽炎和扁桃體炎
- 公司2025慶七一活動方案七一活動方案2025
- 醫(yī)療質(zhì)量管理工具培訓(xùn)
- 留學(xué)機(jī)構(gòu)合作協(xié)議書范本
- 太極拳教學(xué)合同協(xié)議
- 2024年新課標(biāo)I卷CD篇閱讀解析 公開課課件-2025屆高三英語一輪復(fù)習(xí)
- 2024慢性鼻竇炎診斷和治療指南解讀課件
評論
0/150
提交評論