摘 要:基于微控制器的USB主機(jī)系統(tǒng)具有攜帶方便、性價(jià)比高等特點(diǎn)。介紹PIC單片機(jī)控制SL811HST實(shí)現(xiàn)USB主機(jī)的硬件設(shè)計(jì)、底層驅(qū)動(dòng)的編寫和FAT文件系統(tǒng)的建立。其中,底層驅(qū)動(dòng)部分主要敘述USB底層讀/寫操作、設(shè)備檢測以及USB傳輸事務(wù)的實(shí)現(xiàn);文件系統(tǒng)部分?jǐn)⑹鯢AT32的數(shù)據(jù)組織結(jié)構(gòu)。所開發(fā)的系統(tǒng)展現(xiàn)了良好的性能,并已成功應(yīng)用于溫度數(shù)據(jù)采集及存儲系統(tǒng)中。
關(guān)鍵詞:USB;SL811HST;FAT文件系統(tǒng);溫度數(shù)據(jù)采集
中圖分類號:TP3681文獻(xiàn)標(biāo)識碼:B
文章編號:1004-373X(2010)06-034-04
Design of USB Host Based on SL811HST and PIC18F452
ZHENG Xiang,YIN Ruixiang
(School of Electronic and Information Engineering,South China University of Technology,Guangzhou,510640,China)
Abstract:USB host based on microcontroller has features of easy-carraying,high cost-performance and so on.implementation of hardware design,driver and FAT of USB host controlled by PIC single chip microcomputer are introduced.The driver part mainly describes implementation of read and write,facility detecting and USB transmission affairs.The file system part mainly describes organization structure of FAT32.The developed system shows good performance and has been put in use to the system of temperature sampling and storing.
Keywords:USB;SL811HST;FAT file system;temperature data acquisition
基于USB接口的設(shè)備使用方便,性價(jià)比高,因此在人們的工作和生活中得到了廣泛的應(yīng)用,如U盤、移動(dòng)硬盤、移動(dòng)光驅(qū)、USB攝像頭、USB鼠標(biāo)鍵盤等。同時(shí)單片機(jī)以其成熟的技術(shù)和高性價(jià)比吸引了大量國內(nèi)用戶,被廣泛應(yīng)用于測控和自動(dòng)化領(lǐng)域。因此,如果在單片機(jī)系統(tǒng)中增加USB 主機(jī)接口,實(shí)現(xiàn)對USB 從機(jī)設(shè)備的控制,則該單片機(jī)系統(tǒng)可充分利用現(xiàn)有的各種USB從機(jī)設(shè)備,大大擴(kuò)展單片機(jī)系統(tǒng)的功能。
1 USB(通用串行總線)規(guī)范簡介
一個(gè)完整的USB 系統(tǒng)包括USB 主機(jī)、USB 設(shè)備以及主機(jī)與設(shè)備之間的數(shù)據(jù)通信三個(gè)要素。USB主機(jī)在整個(gè)USB系統(tǒng)中是惟一的。USB主機(jī)包括主機(jī)控制器、USB子系統(tǒng)及USB客戶幾個(gè)部分。主機(jī)控制器實(shí)現(xiàn)了主機(jī)端的USB總線接口,同時(shí)還具有一個(gè)根集線器以提供與USB設(shè)備的物理連接。主機(jī)控制器與上層USB子系統(tǒng)之間的接口有通用主機(jī)控制接口UHCI、開放主機(jī)控制接口OHCI及增強(qiáng)主機(jī)控制接口EHCI3種規(guī)范。UHCI USB子系統(tǒng)是主機(jī)上的一個(gè)軟件子系統(tǒng), 包括主機(jī)控制驅(qū)動(dòng)HCD、USB驅(qū)動(dòng)USBD及USB設(shè)備驅(qū)動(dòng)3 個(gè)層次。HCD直接管理具體的主機(jī)控制器硬件,并實(shí)現(xiàn)OHCI,UHCI或EHCI功能。USBD是整個(gè)USB子系統(tǒng)的核心,其主要功能包括:USB總線管理,USB設(shè)備管理,USB數(shù)據(jù)傳輸管理,為HCD及USB設(shè)備驅(qū)動(dòng)提供接口,提供與主機(jī)其他子系統(tǒng)(如I/O 子系統(tǒng)、文件子系統(tǒng)等)的通信接口。USB設(shè)備驅(qū)動(dòng)管理特定的USB設(shè)備,并為應(yīng)用程序提供訪問設(shè)備接口[3]。
每個(gè)USB 設(shè)備有一個(gè)或多個(gè)端點(diǎn)(Endpoint),USB主機(jī)正是與USB設(shè)備端點(diǎn)進(jìn)行數(shù)據(jù)通信的。一個(gè)USB設(shè)備可以看作一個(gè)或多個(gè)接口(Interface),每個(gè)接口實(shí)現(xiàn)一種功能,并包括一個(gè)或多個(gè)端點(diǎn)。同種類型的接口組合稱為配置,一個(gè)設(shè)備可以有多種配置,但一次只能使用一個(gè)配置。
在USB的通信中,事務(wù)處理是USB通信和數(shù)據(jù)傳輸?shù)倪^程中信息交互的基本單位,事務(wù)處理是由一系列具有特定格式的信息包組成,如SETUP包、ACK包等。在USB的數(shù)據(jù)傳輸中,主要有四種傳輸事務(wù)類型(控制、批量、中斷、同步),根據(jù)信息包的內(nèi)容事務(wù)處理可以分為3個(gè)階段:令牌階段、數(shù)據(jù)階段和握手階段,而主機(jī)枚舉設(shè)備的主要功能只需要通過控制傳輸實(shí)現(xiàn)。控制傳輸有傳輸階段(建立、數(shù)據(jù)、狀態(tài),其中數(shù)據(jù)階段是可選的)。每個(gè)傳輸階段又由包組成(令牌包、數(shù)據(jù)包、握手包、特殊包)。格式可用圖1表示。
圖1 USB傳輸?shù)湫偷氖聞?wù)處理
2 USB主機(jī)的硬件系統(tǒng)設(shè)計(jì)
2.1 USB主控芯片SL811HST簡介
SL811HST是Cypress公司的嵌入式USB主機(jī)或外設(shè)接口控制器。提供USB主機(jī)的硬件接口及總線管理的物理機(jī)制。帶有在片的SIE和USB發(fā)送器以及在片的根集線器HUB。因此,滿足了嵌入式USB主機(jī)系統(tǒng)所需要的功能。SL811HST功能模塊如圖2所示。
圖2 SL811HST功能模塊
接口芯片SL811HST內(nèi)部寄存器一共有256個(gè)單元,每個(gè)單元是一個(gè)字節(jié),其中地址為00H~0FH的前16個(gè)單元是SL811HST的狀態(tài)寄存器或控制寄存器(統(tǒng)稱為特殊寄存器),其余的是數(shù)據(jù)緩沖寄存器。
2.2 硬件系統(tǒng)設(shè)計(jì)
該系統(tǒng)采用單片機(jī)(PIC18F452)作為系統(tǒng)的主控制器,SL811HST為USB接口芯片,實(shí)現(xiàn)對U盤的讀/寫操作。其硬件原理見圖3。
圖3 硬件電路
單片機(jī)通過控制RD,WR,CS這幾根控制線完成SL811HST片內(nèi)緩沖區(qū)的讀、寫和數(shù)據(jù)/地址選擇等操作。SL811HST的控制命令和數(shù)據(jù)均通過D0~D7分時(shí)傳輸,當(dāng)A0為低時(shí),D0~D7上傳輸?shù)氖瞧瑑?nèi)寄存器/緩沖區(qū)地址;反之為數(shù)據(jù)。INTRQ是中斷請求信號。當(dāng)SL811HST檢測到外設(shè)插入、拔出或數(shù)據(jù)發(fā)送錯(cuò)誤等異常情況時(shí),SL811HST的INTRQ產(chǎn)生高電平,直接輸入到中央控制器的片選端口。單片機(jī)查詢SL811HST狀態(tài)IntEna來判斷是何種中斷,從而執(zhí)行相關(guān)的操作。
3 USB主機(jī)控制器驅(qū)動(dòng)程序的設(shè)計(jì)
USB軟件結(jié)構(gòu)體系包括硬件驅(qū)動(dòng)層、設(shè)備枚舉、USB事務(wù)層、Mass Storage命令層、文件系統(tǒng)、應(yīng)用層[6],如圖4所示。
圖4 USB軟件結(jié)構(gòu)體系
3.1 硬件驅(qū)動(dòng)層
硬件驅(qū)動(dòng)層包括單片機(jī)對SL811HST的讀/寫等函數(shù)。單片機(jī)通過對SL811HST進(jìn)行地址、數(shù)據(jù)命令的操作,實(shí)現(xiàn)數(shù)據(jù)單字節(jié)和批量字節(jié)的讀寫。
根據(jù)SL811HST的讀/寫時(shí)序要求,讀取數(shù)據(jù)前首先發(fā)送地址,地址發(fā)送完畢之后,SL811HST就接到了需要讀取的寄存器的地址(包括內(nèi)存單元地址)。緊接著單片機(jī)就可以讀取數(shù)據(jù)。為了簡便,讀數(shù)據(jù)過程中發(fā)送地址和讀取數(shù)據(jù)的功能都放在一個(gè)函數(shù)中執(zhí)行。其函數(shù)實(shí)現(xiàn)如下:
讀寄存器函數(shù)(寫寄存器類似):
uchar sl811hs_reg_read(uchar address)
{
unsigned char data;
TRISD=0x00;//設(shè)置MCU端口為輸出
A0=0;//A0=0時(shí)D0~D7傳送的是地址,
DATA=address;
nWR=0;
asm(\"nop\");
nWR=1;
TRISD=0XFF;
A0=1;//A0=1時(shí)D0~D7傳送的是數(shù)據(jù)
nRD=0;
asm(\"nop\");
data=DATA;
nRD=1;
return data;
}
有時(shí)單片機(jī)和SL811HST之間要進(jìn)行批量數(shù)據(jù)的傳輸,為方便操作,設(shè)計(jì)了能夠批量進(jìn)行數(shù)據(jù)讀或?qū)懙暮瘮?shù):
批量讀數(shù)據(jù)函數(shù)(批量寫類似)
void sl811hs_data_read(uchar address,uchar *buf,uchar len)
{
unsigned char i;
for(i=0;i buf=sl811hs_reg_read(address+i); } 3.2 設(shè)備枚舉 設(shè)備枚舉是所有USB主機(jī)必須具備的功能,也是編寫主機(jī)協(xié)議的難點(diǎn)。枚舉步驟的成功,既可證明硬件系統(tǒng)正確無誤,也是進(jìn)行后續(xù)讀寫操作的基礎(chǔ)。枚舉程序的實(shí)現(xiàn)通過調(diào)用函數(shù)來實(shí)現(xiàn),且該函數(shù)也是后續(xù)對U盤讀寫操作的基礎(chǔ),如圖5所示。枚舉過程如下: (1) 當(dāng)主機(jī)檢測到設(shè)備(在主函數(shù)中進(jìn)行檢測),使設(shè)備發(fā)生復(fù)位; (2) 當(dāng)設(shè)備接到復(fù)位信號,使用默認(rèn)地址進(jìn)行尋址; (3) 主機(jī)接收到設(shè)備對地址響應(yīng),對設(shè)備分配地址; (4) 主機(jī)讀取USB設(shè)備和端點(diǎn)描述符,確認(rèn)USB設(shè)備的屬性; (5) 主機(jī)依照讀取的USB設(shè)備描述符進(jìn)行配置。 3.3 USB事務(wù)層 USB事務(wù)層通過在函數(shù)中對PID令牌中的SETUP(0xD0),IN(0x90),OUT(0x10)端點(diǎn)類型的賦值,在函數(shù)中通過判斷PID的端點(diǎn)類型和調(diào)用硬件驅(qū)動(dòng)層函數(shù),實(shí)現(xiàn)對從設(shè)備端點(diǎn)來的數(shù)據(jù)或發(fā)送到設(shè)備端點(diǎn)去的數(shù)據(jù)的傳輸。其中,PID是USB用來標(biāo)識操作的屬性,它指出了數(shù)據(jù)的分組類型,并由此推斷出分組格式和該組所用的校驗(yàn)方法。USB的通信結(jié)構(gòu)一般是以PID開始的,后面緊跟著數(shù)據(jù)或控制信息,最后是CRC校驗(yàn)。 3.4 Mass storage命令層 它按照Bulk-Only協(xié)議編寫UFI命令函數(shù),通過CBW包中嵌入的CBWCB信息來實(shí)現(xiàn)對U盤讀/寫操作的扇區(qū)位置和大小參數(shù)及文件類型FAT32的確定,并置位USB連接標(biāo)志[7]。 4 USB文件系統(tǒng) 從Windows95 OSR2和Windows 98開始支持FAT32文件系統(tǒng),它是對早期DOS的FAT16文件系統(tǒng)的增強(qiáng),由于文件系統(tǒng)的核心文件分配表(FAT)由16位擴(kuò)充為32位,所以稱為FAT32文件系統(tǒng)[8]。FAT32與FAT16文件系統(tǒng)的數(shù)據(jù)組結(jié)構(gòu)如圖6所示。 圖5 設(shè)置設(shè)備地址、獲取設(shè)備描述符、配置符流程 圖6 文件系統(tǒng)的數(shù)據(jù)組織結(jié)構(gòu)示意圖 4.1 DOS引導(dǎo)記錄(DBR) DBR(DOS BOOT RECORD)即操作系統(tǒng)引導(dǎo)記錄區(qū),通常位于硬盤的0磁道1柱面1扇區(qū),是操作系統(tǒng)可直接訪問的第一個(gè)扇區(qū),它也包括一個(gè)引導(dǎo)程序和一個(gè)被稱為BPB(BIOS PARAMETER BLOCK)的本分區(qū)參數(shù)記錄表。每個(gè)邏輯分區(qū)都有一個(gè)DBR。在這512個(gè)字節(jié)中,其實(shí)又是由跳轉(zhuǎn)指令、廠商標(biāo)志和操作系統(tǒng)版本號、BPB(BIOS Parameter Block)、擴(kuò)展BPB、OS引導(dǎo)程序、結(jié)束標(biāo)志幾部分組成. 4.2 文件分配表(FAT) 文件分配表區(qū)是FAT文件系統(tǒng)管理磁盤空間和文件的最重要區(qū)域,它保存邏輯盤數(shù)據(jù)區(qū)各簇使用情況信息,采用位示圖法來表示。FAT區(qū)保存了兩個(gè)相同的文件分配表,第一個(gè)損壞時(shí),還有第二個(gè)可用。FAT表大小由該邏輯盤數(shù)據(jù)區(qū)共有多少簇所決定,取整數(shù)個(gè)扇區(qū)。數(shù)據(jù)區(qū)中每簇的使用情況通過查找其在FAT表中相應(yīng)位置的填充值可知曉。FAT32表中每簇占用4個(gè)字節(jié)(32 b)表示,開頭的8個(gè)字節(jié)用來存放該盤介質(zhì)類型編號了,因此有效簇號從02H開始使用。02H簇的使用情況由08H~0BH字節(jié)組成的32 b二進(jìn)制數(shù)指示出來,03H簇的使用情況由0CH~0FH字節(jié)組成的32 b二進(jìn)制數(shù)指示出來。未被分配使用和已回收的簇相應(yīng)位置寫0,壞簇相應(yīng)位置填入特定值0FFFFFF7H標(biāo)識,已分配的簇相應(yīng)位置填入非0值,具體為:如果該簇是文件的最后一簇,填入的值為0FFFFFF0FH,如果該簇不是文件的最后一簇,填入的值為該文件占用的下一個(gè)簇的簇號,這樣,正好將文件占用的各簇構(gòu)成一個(gè)簇鏈,保存在FAT32表中[9]。 4.3 文件目錄表(FDT) 磁盤上每個(gè)文件都有一個(gè)32 B長的目錄項(xiàng),它登記了文件的名字、屬性、建立或最后修改的日期、時(shí)間以及文件在磁盤上存放的起始位置。除了卷標(biāo)名可能占據(jù)該區(qū)的32 B外,該區(qū)的每個(gè)32 B都可以是根目錄下的一個(gè)目錄項(xiàng)。 4.4 FAT文件系統(tǒng)的軟件實(shí)現(xiàn) FAT32文件系統(tǒng)的軟件功能主要是實(shí)現(xiàn)對存儲器的管理,包括對各個(gè)分區(qū)(DBR,F(xiàn)AT,F(xiàn)DT,DATA)的尋址,創(chuàng)建、讀寫、刪除文件等。 設(shè)計(jì)文件系統(tǒng),就是在指定的存儲介質(zhì)上,選擇一種或幾種數(shù)據(jù)組織方式,實(shí)現(xiàn)常用的幾個(gè)文件API函數(shù)功能,最終實(shí)現(xiàn)數(shù)據(jù)的按名存取。 從第一個(gè)分區(qū)數(shù)據(jù)結(jié)構(gòu)的分區(qū)起始扇區(qū)數(shù)的位置讀取512 B,為DBR,包括一個(gè)引導(dǎo)程序和BPB參數(shù)塊。BPB參數(shù)塊記錄本分區(qū)的起始扇區(qū)、結(jié)束扇區(qū)、文件存儲格式、介質(zhì)描述符、FAT個(gè)數(shù)、保留扇區(qū)數(shù)和分配單元的大小等重要參數(shù)。 根據(jù)保留扇區(qū)的數(shù)目可知FAT表的位置(分區(qū)起始扇區(qū)數(shù)+保留扇區(qū)數(shù))。根據(jù)FAT的個(gè)數(shù)以及每個(gè)FAT表占用的扇區(qū)數(shù),即可算出FDT的位置(FAT表位置+FAT表個(gè)數(shù)×FAT表所占扇區(qū)數(shù))。FDT中保存著目錄項(xiàng),目錄項(xiàng)中的文件首簇號就是讀/寫文件的入口。 5 結(jié) 語 使用USB主機(jī)接口控制器SL811HST實(shí)現(xiàn)對U盤的讀寫,可為數(shù)據(jù)采集系統(tǒng)大容量數(shù)據(jù)存儲提供一種通用、方便和可靠的解決方案,目前該方案已成功應(yīng)用到筆者自主開發(fā)的溫度采集及存儲控制系統(tǒng)中,并經(jīng)過長時(shí)間測試證明了它的實(shí)用性和可靠性。由于SL811HST同時(shí)具有從機(jī)工作模式,因此,也可將此方案經(jīng)簡單修改后開發(fā)USB接口從設(shè)備,從而滿足不同場合的需要。 參考文獻(xiàn) [1]馬偉.計(jì)算機(jī)USB系統(tǒng)原理及其主/從機(jī)設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2004. [2]王萌,陳云海,周萍.基于USB接口的便攜式數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)[J].電子質(zhì)量,2008(10):9-13. [3]劉井權(quán).基于單片機(jī)的USB接口的設(shè)計(jì)[J].自動(dòng)化儀表,2006,27(8):29-31. [4]Cypress.SL811HS Datasheet[Z].2001. [5]Cypress.SL811HST Application Notes[Z].2001. [6]馬偉.USB主機(jī)系統(tǒng)的研究與設(shè)計(jì)[M].計(jì)算機(jī)測量與控制,2003,11(5):381-383. [7]遲玉強(qiáng),張哲.USB 1.1 MassStorage類設(shè)備的研究與實(shí)現(xiàn)[J].電子器件,2007,30(6):31-33. [8]任亞洲.FAT32 文件系統(tǒng)研究[J].電腦知識與技術(shù),2008,3(24):1 320-1 321,1 356. [9]劉海峰,王娜.嵌入式USB主機(jī)系統(tǒng)的設(shè)計(jì)[J].科技信息,2008(12):59,75. [10]胡博.嵌入式設(shè)備的FAT文件系統(tǒng)的設(shè)計(jì)[J].杭州電子科技大學(xué)學(xué)報(bào),2006,26(4):47-51.