基於單片機的
USB
介面的設計
The Design Of USB Interface Based On The Single Chip劉井權 王憲 戴旻 來源:自動化儀錶雜誌(江南大學通訊與控制工程學院 江蘇無錫 214122)
摘要提出了一種基於單片機的智能儀錶擴充USB介面的方法。介紹了USB介面晶片SL811HS[1]的結構和效能以及USB介面的硬體電路圖,詳細分析了USB介面的驅動程式的設計方法及FAT16[2]檔案系統的結構。利用SCSI[3]傳輸命令集,通過BULK-IN和BULK-OUT[3]端點實現了主機與隨身碟裝置之間的資料通訊。實驗和應用結果表明,該方案具有控制方便、傳輸速度快、儲存資料穩定可靠等優點。
關鍵詞 USB 端點 枚舉 配置 檔案系統
Abstract A method of intelligent instrument expandation USB interface based on singlechip is stated. The structure and capability of the USB interface chip SL811HS, hardware circuit diagram of the USB interface is introduced, and the design method of the USB interface drivers,structure of the FAT16 file systems is analysed detailedly。The communication between the host computer and U disk device is completed via BULK-IN and BULK-OUT endpoint using SCSI command class. The results of experiment and application show that the scheme features convenient control、fast transmitting data and reliably storaging data.
Key words USB Endpoint Enumerate File system中圖分類號:TP368 文獻標識碼:B
引言USB (Universal Serial Bus)是近年來發展起來的一種快速、靈活的匯流排介面。它最大的特點是便於使用,可熱插拔,介面串連靈活,並且能夠提供外設電源[4],在嵌入式系統及智能儀錶中獲得廣泛的應用。而51系列單片機以其優越的效能、成熟的技術、高性價比被廣泛應用於測控儀器和自動化領域。因此用51系列單片機實現USB主機介面,進而實現對USB外設的控制,對提高整個系統的資料存放區、資料轉送、裝置控制等效能都有很大的作用。本文論述的方案基於壓強測試儀的應用環境,在開發壓強測試儀的過程中根據實際的需求,要求能夠儲存大量資料,以往的解決方案是RS232C介面,但由於傳輸速度慢,在高速採樣系統容易導致資料丟失,而且必須有上位機的參與,這對於室外作業很不方便。USB介面克服了上述缺點,測試儀器可以把採集到的資料儲存到隨身碟,工作人員可以隨時取下隨身碟,將資料拿到異地進行分析,另外筆者還開發了讀寫隨身碟的檔案系統,儲存的資料可以直接在PC機上開啟,不需要編寫其它的分析軟體。本設計的另一優點是成本低廉,可應用於各種智能儀器及嵌入式裝置中,實現對海量資料的儲存。
1
硬體設計1.1 SL811HS概述SL811HS是Cypress公司推出的具有主/從兩種工作模式的USB控制器[4],遵循USB1.1規範;可自動檢測匯流排速率,支援全速12Mbps和低速1.5Mbps裝置;具有8位雙向的資料匯流排,易與單片機串連;片內256位元組的SRAM(其中16位元組用於工作寄存器),用於資料轉送;可自動產生SOF和CRC5/16,簡化軟體工作量;片內具有根Hub;支援掛起/喚醒工作模式,減少功耗;支援地址自動加1功能,在連續讀寫過程中,只需設定一次地址,其內部寄存器地址自動增加,這在大容量資料的通訊中是非常必要的。1.2單片機與SL811HS介面設計 圖一所示是AT89C51與SL811HS的硬體串連電路。在本設計中,由於所選用的單片機AT89C51及其外圍元件的工作電壓為5V,而SL811HS的工作電壓為3.3V,所以系統應提供5V電壓同時要進行電壓轉換。雖然SL811HS可以使用12MHz晶振,但在實際使用過程中,如果晶振品質不太好,電路穩定性就會比較差,因此,設計時推薦使用48MHz有源晶振。SL811HS的插斷要求輸出的是高電平,因此需要用反向器把它變換成低電平以滿足AT89C51中斷輸入要求。此外,應注意SL811HS是低電平複位。為了便於調試,系統擴充了液晶顯示器。硬體完成後要進行測試,先向SL811HS寄存器中寫入資料,之後讀出資料並在液晶顯示器上顯示,如果和寫入的資料相同,說明SL811HS與單片機串連正確。再用示波器觀察有源晶振是否起振,一切正常後便進入軟體調試。
2
軟體設計㈠. USB枚舉過程: USB匯流排一般包含四種基本資料轉送類型:控制傳輸、中斷傳輸、批傳輸以及同步傳輸,本系統使用的是控制傳輸和批量傳輸2。最基本的函數就是對SL811HS寄存器的讀寫,代碼4如下:xdata BYTE SL811H_ADDR _at_ 0x9800;xdata BYTE SL811H_DATA _at_ 0x9801; 讀單個寄存器:BYTE SL811Read(BYTE a){SL811H_ADDR=a; return (SL811H_DATA);}寫單個寄存器:void SL811Write(BYTE a, BYTE d){ SL811H_ADDR=a; SL811H_DATA= d;}連續讀SL811HS寄存器:void SL811BufRead(BYTE addr, BYTE *s, BYTE c){BYTE idata i; i=c; SL811H_ADDR = addr; while (i--) *s++ =SL811H_DATA;}連續寫SL811HS寄存器:void SL811BufWrite(BYTE addr, BYTE *s, BYTE c){BYTE idata i; i=c; SL811H_ADDR= addr; while (i--) SL811H_DATA = *s++;}讀寫寄存器正常以後,便進入SL811HS底層函數6的編寫,具體的函數可參照CYPRESS公司提供的代碼修改。調試之後便進入枚舉過程。枚舉是對USB介面正確配置的過程,包括擷取裝置描述符、配置描述符、介面描述符、端點描述符,以及對介面、端點的正確配置。請求裝置描述符的setup資料包為 80h 06 00 01 00 00 12 00 ,通過讀取裝置描述符,可獲得裝置的子類。請求配置描述符的setup資料包為 80h 06 00 01 00 00 09 00 ,對於請求配置描述符,可以先進行首次請求,要求資料包長為9。接收到裝置返回的資料,獲得此描述符的總長,然後再發二次請求,獲得全部描述符資料。第二次發送的setup資料包內容為 80h 06 00 01 00 00 2Eh 00此時返回的資料包括了裝置配置、介面、端點的全部描述資訊2。在對隨身碟讀寫之前需正確配置SL811HS晶片,這部分工作通過枚舉來完成。枚舉過程代碼6如下:uDev.wPayLoad[0] = 64; // 地址0、端點0的有效負荷為64位元組if(usbaddr =2) // 設定USB的地址為2USBReset(); // 晶片SL811HS複位pDev =(pDevDesc)bBUF; if (!GetDesc(uAddr,DEVICE,0,18,bBUF)) // 通過地址0擷取描述符return FALSE; uDev.wPayLoad[0]=pDev->bMaxPacketSize0; if (!SetAddress(usbaddr)) //設定USB地址值,此處為2return FALSE; uAddr = usbaddr; //傳輸採用新地址if (!GetDesc(uAddr,DEVICE,0,(pDev->bLength),bBUF)) //用新地址擷取裝置描述符return FALSE;pCfg = (pCfgDesc)bBUF; if (!GetDesc(uAddr,CONFIGURATION,0,8,bBUF)) //擷取配置描述符return FALSE; if (!GetDesc(uAddr,CONFIGURATION,0,WordSwap(pCfg->wLength),bBUF))//第二次請求配置描述符 return FALSE; pCfg = (pCfgDesc)bBUF;pIfc = (pIntfDesc)(bBUF + 9); // 分離出介面資訊uDev.bClass = pIfc->iClass; uDev.bNumOfEPs = (pIfc->bEndPoints<=MAX_EP) ? pIfc->bEndPoints : MAX_EP;if (!SetConfiguration(uAddr,DEVICE)) //設定USB的配置資訊return FALSE;
㈡. 隨身碟的讀寫及FAT16檔案系統5:隨身碟屬於大量儲存裝置,當隨身碟枚舉成功後,主機與USB裝置通過BULK-ONLY傳輸方式傳輸資料,所有的通訊資料都通過BULK-IN和BULK-OUT端點傳輸。在這種傳輸方式下,有三種類型的資料在USB和裝置之間傳送,CBW、CSW 和普通資料5CBW(Command Block Wrapper,即命令塊包)是從USB Host 發送到裝置的命令,命令格式遵從介面中bInterfaceSubClass 所指定的命令塊,這裡為SCSI 傳輸命令集。USB裝置需要將SCSI 命令從CBW 中提取出來,執行相應的命令,完成以後,向Host 發出反映當前命令執行狀態的CSW(Command Status Wrapper),Host 根據CSW 來決定是否繼續發送下一個CBW 或是資料。Host 要求USB 裝置執行的命令可能為發送資料,則此時需要將特定資料傳送出去,完畢後發出CSW,以使Host 進行下一步的操作。。隨身碟一般支援FAT16檔案系統,它可以分成4個部分,即保留區,FAT區,根目錄區,資料區。保留區的第一個扇區也叫開機磁區,它含有對檔案系統識別的關鍵資訊。根目錄區存放目錄項,每個目錄項為32 個位元組,記錄一個檔案或目錄的資訊。FAT區即檔案配置表,作業系統分配磁碟空間按簇來分配的。同一個檔案的資料並不一定完整地存放在磁碟的一個連續的地區內,而往往會分成若干段,像一條鏈子一樣存放。這種儲存方式稱為檔案的鏈式儲存。為了實現檔案的鏈式儲存,硬碟上必須準確地記錄哪些簇已經被檔案佔用,還必須為每個已經佔用的簇指明儲存後繼內容的下一個簇的簇號,對一個檔案的最後一簇,則要指明本簇無後繼簇。這些都是由FAT 表來儲存的,FAT 表的對應表項中記錄著它所代表的簇的有關資訊:諸如是否空,是否是壞簇,是否已經是某個檔案的尾簇等。目錄項的所佔的最後一個扇區之後,便是真正存放檔案資料的位置了。只有清楚的瞭解FAT16的結構才能對檔案正確讀寫,圖4給出寫檔案的流程圖,讀檔案相對比較簡單,在此不再贅述。
3
結束語本系統已經成功實現了對隨身碟的讀寫,經過多次實驗測試,讀寫資料穩定可靠,可相容市場上絕大多數隨身碟。作者在單片機系統中可以建立、刪除、修改檔案,可以把資料存放區成多種檔案格式,特別指出的是,在單片機系統內建立的BIN檔案和HEX檔案可以在PC機上利用UltraEdit-32軟體直接開啟,這為資料的分析提供了很大的方便,而不必花費精力去編寫分析軟體。
參考文獻1 Cypress semiconductor corporation. SL811HS date sheet[z].2002.2 許永和. 8051單片機USB介面程式設計.北京:北京航空航天大學出版社.2004.3 史波,田凱.通用序列匯流排USB技術概述[J].資訊技術.2001(4).4 馬忠梅,籍順心,張凱,等.單片機的C語言應用程式設計.北京:北京航空航天大學出版社.2003.5 Microsoft corporation. FAT File System Specification[z].1999.6 徐愛均,彭秀華.單片機進階語言C51應用程式設計.北京:電子工業出版社.1995.7 Compaq,Inter,Microsoft,NEC. Universal Serial Bus Specification(Revision1.1).1998.