徐建林 聶章龍



摘要:為了實現對Freescale MC9S12UF32芯片的USB2.0模塊的開發,首先,闡述了MC9S12UF32單片機專門作為高速USB存儲設備接口設計芯片的優勢和特點;然后提出了海量存儲設備的USB2.0接口設計方案,在軟、硬件架構上實現訪問MC9S12UF32芯片USB2.0接口,設計方案加速了USB2.0設備開發,促進了USB2.0設備接口的應用,具有較好的理論和應用價值。
關鍵詞:MC9S12UF32;USB2.0;設備枚舉;Bulk-Only傳輸協議;SCSI命令集
Design of USB interface Based on MC9S12UF32 Chip
Xu Jianlin1 Nie Zhanglong2
1.Bergstrom Company JiangsuChangzhou 213135;
2.Changzhou College of Information Technology JiangsuChangzhou 213164
Abstract:In order to implement development of USB2.0 module of MC9S12UF32 chip,firstly,describing the advantages and characteristics of MC9S12UF32 which is integrated high-speed USB storage device interface.Then,proposing the design scheme of USB2.0 mass storage device interface,the scheme realizes the access to USB2.0 interface of MC9S12UF32 in software and hardware architecture.This scheme not only effectively improves development of USB devices,It can also be widely used in the practical application design of USB2.0 equipment interface,and has good theoretical and application value
Key words:MC9S12UF32;USB2.0;device enumeration;bulk only transport protocol;SCSI command set
1 緒論
USB已成為微機和眾多電子設備的重要標準接口,USB1.1規范的推出已得到了廣泛應用,但隨著電子技術的飛速發展,USB1.1規范已不能滿足電子消費產品的性能要求,特別在傳輸速度和存儲容量方面。因而,很快推出USB2.0規范,快速催生了USB2.0接口的消費電子產品。國外推出了大量集成USB2.0接口的芯片,國內公司對擁有USB2.0接口芯片還在初步研發階段。本文基于16位單片機MC9S12UF32,提出了一種USB2.0設備接口的設計與實現。
2 USB接口類MC9S12UF32芯片特性
MC9S12UF32是恩智浦(源飛思卡爾)公司的HC/S12系列中的16位單片機,它是一款低價位、高性能的單片機,片內資源豐富,FLASH EEPROM空間32K Bytes,RAM空間3.5K Bytes,QRAM隊列1.5K Bytes,集成高速USB2.0接口、集成隊列控制器(IQUE)、SCI接口,通過一條專用內部總線,IQUE模塊可以實現從存儲接口到USB模塊進行高速數據傳輸,最快達到60MB/S。
MC9S12UF32單片機是高速USB存儲設備接口設計的首先,支持高速、全速USB傳輸[1]。構成該款芯片的主要模塊為IQUE模塊、USB2.0接口和存儲控制器接口。CPU是控制與處理的核心,但真正的數據傳輸是通過中介IQUE完成,它與CPU是并行工作,互不干擾。
IQUE模塊的組成:隊列控制器(QUE)、隊列控制器集成模塊(QIM)和QRAM隊列(1.5KB)。集成隊列模塊IQUE數據傳輸是以FIFO的方式寫入或傳出QRAM。
由USB物理層接口(UPHY)和USB設備控制器(UDC20)構成USB2.0模塊,配合IP總線及USB全速和高速協議,實現數據傳輸。模塊的結構框圖如圖1所示。
USB設備控制器模塊通過IP總線與S12內核進行交互。交互的通道為6個獨立的端點。共有5個64字節的端點緩沖區,其中兩個分配給物理端點1,另外三個分配給了物理端點2、3和6。
端點數據是通過IP FIFO總線保存于集成隊列控制器模塊,然后片內模塊才能與USB2.0模塊進行連續的數據通信。
綜上所述,USB接口與存儲器接口間的高速數據通道是由IQUE模塊、USB2.0模塊和存儲設備接口構成的,其中IQUE模塊起到了橋梁的作用。
3 USB2.0設備接口的設計
USB2.0設備接口設計主要由硬件設計和固件設計[2],USB2.0協議中的鏈路層功能是由硬件完成;USB2.0協議及設備子類協議是由固件來完成。基于硬件架構,增強型MCHS12UF32核的USB2.0接口設計應包括以下幾個模塊。
(1)USB傳輸處理模塊。底層硬件送來的各種信號需要USB傳輸處理模塊進行分析處理,Endpoint中接收到的主機命令/數據需要由該模塊上傳到主機命令解析模塊,并返回命令處理結果。
(2)主機命令解析模塊。分析處理USB傳輸處理模塊送來的主機命令,并返回分析處理結。
(3)設備應用處理模塊。外部應用系統接收到具體的操作命令執行,并返回外部器件相關狀態。固件的功能可分為設備枚舉、傳輸控制、命令解析、外部應用操作等幾個過程,如圖2所示。
3.1 USB海量存儲設備固件的設計
IP核固件主要元素為Bulk-Only傳輸協議和SCSI命令集[3]。
3.1.1 固件流程
圖3是大容量USB存儲設備固件工作流程。工程流程中主要是4類中斷處理,即Bulk-In端點中斷、Bulk-Out端點中斷和Command端點0的In中斷及Out中斷。Command端點是實現設備枚舉過程中主機與設備間的交互,Bulk端點是實現枚舉成功后主機與設備間的交互。
3.1.2 設備枚舉
USB設備在接入USB電纜后需要一個枚舉過程,為什么要枚舉?枚舉就是從設備讀取各種描述符信息,這樣主機就可以根據這些信息來加載合適的驅動程序,從而知道設備是什么樣的設備,如何進行通信等,用戶首先需要將枚舉過程中所需要的各種描述符表設置好后存放于指定存儲單元。枚舉過程如圖4所示。
3.1.3 Bulk-Only傳輸控制
USB設備枚舉成功后,就可以通過Bulk端點進行數據傳輸了,Bulk-Only傳輸控制過程如下:
(1)主機通過Bulk-Out端點發送CBW命令包;
(2)設備接收拆分CBW包,解析SCSI命令;
(3)設備執行SCSI命令;
(4)設備通過Bulk-In端點,向主機返回命令狀態包CSW;
(5)設備等待主機的下一個CBW命令包。
3.1.4 SCSI命令解析
特定的海量存儲設備可以過濾無意義的SCSI命令,當設備確認接收到是有效的SCSI命令后,它將根據命令類型和要求,做好數據的發送或接收的準備。
3.2 USB海量存儲設備接收和發送過程設計
傳輸由OUT、IN、SETUP等事務構成,傳輸分為同步傳輸、控制傳輸、中斷傳輸和批量傳輸,批量轉輸和中斷傳輸結構相同,同步傳輸結構簡單,而控制傳輸結構復雜。
3.2.1 USB海量存儲設備的Bulk_Only傳輸類
批量傳輸是USB海量存儲應用的一種[4],另外有巨量中斷傳輸方式,還有其他的傳輸方式等。傳輸中存在三種類型的命令塊數據包:第一種主機發送數據到設備,第二種是不帶數據傳輸的命令塊數據包,第三種是主機要從設備接收數據的命令。
(1)端點0配置。USB設備接入主機時,主機通過默認地址0與默認端口0進行通信。在此期間,主機發出相關描述符請求,并得獲取所需的設備描述符,從而了解設備的情況,再通過Set Address指令設置一個唯一的設備地址,然后,主機就通過該地址與設備通信,不再使用默認地址0,端點0的配置過程也是類似的。
(2)其他端點數據通信。在配置階段,主機獲取到設備端點的使用情況后,現在可以通過這些端點進行特定數據通信。海量存儲設備有BULK ONLY和CBI兩種傳輸方式,使用Bulk Only較為常見,主要是使用特定的Bulk端點,由于Bulk端點的沒有特定的數據格式,所以需要使用某種命令集來約定其傳輸格式,一般配備使用UFI或SCSI命令集。
3.2.2 Bulk-Only傳輸協議
當設備插入到USB后,完成枚舉過程,主機便可識別出為海量存儲設備類型,隨后USB接口與設備間通過Bulk-In和Bulk-Out進行數據傳輸??蓚鬏數臄祿愋陀校篊BW、CSW和普通數據[5]。CBW是符合SCSI傳輸命令集格式的一種命包,由主機發送給設備。當USB設備解析出CBW包中的SCSI命令并執行后,還需要向主機返回命令執行狀態包CSW,最后,主機根據命令狀態包決定是否繼續發送下一個CBW或數據。
3.3 USB2.0海量存儲設備接口的軟件設計
3.3.1 MCU方軟件
USB模塊化編程,主要包括初始化、主函數和中斷處理函數三部分,主要是實現主機獲取設備描述符,進行端點數據傳輸[6]。初始化函數主要包括UF32單片機和外圍電路接口初始化;中斷處理函數主要是進行各種中斷的處理;主函數主要是完成設備特定要求的流程處理;
利用MCHS12UF32核中的USB端口5進行批量輸入,端口4進行批量輸出,函數框架如下:
voidBulkOnly_Init(void)//USB2.0初始化
{ … }
voidStartUP(void)//設備運行時啟動函數,系統的基本設置
{ … }
IsrProcess(void)/中斷處理函數,,包括對解析SETUP包的處理函數USB_DecodeSETUP
{ … }
CBWProcessor(void)//該函數主要是對各種包(CBW、CSW等)的處理
{ … }
主函數根據MCHS12UF32核的USB設備上電或復位后,首先對所有內部變量初始化,現調用BulkOnly_Init()函數,打開中斷檢測控制端口0是否收到SETUP包,如果收到,則調用函數IsrProcess()。后續一直往復這個過程,直到枚舉成功,即找到海量存儲設備(Mass Storage Device),并安裝好驅動程序,之后就是主機發CBW包,執行Bulk_Only傳輸協議,通過CBWProcessor()函數不斷檢測主機是否發來CBW包,并做相應處理。
3.3.2 PC方軟件
PC方軟件包括USB的驅動程序和主機應用程序兩部分。USB驅程序是一種標準的WDM驅動程序,支持即插即用,提供控制傳輸、中斷傳輸和批傳輸等標準接口函數。主機應用程序是實現與操作系統的交互,操作系統監測到新設備時,自動調用相應的設備驅動程序。為了實現操作的方便性和可視性,利用VC++進行了UI界面設計,通過CreateFile獲得USB句柄,用DeviceIoControl向設備驅動程序發送請求,完成基于MC9S12UF32單片機的USB2.0接口的批量數據傳輸。上位機的主要程序模塊如下:
//獲取設備ezusb0的句柄
DeviceHandle=CreateFile(\\\\.\\ezusb0,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
//設備初始化
(1)子函數名:IQUE_Module_Init(void),功能:IQUE模塊初始化_使能IQUE模塊;
(2)子函數名:USB_ModuleInit(void),功能:USB模塊初始化-使能USB模塊;
(3)子函數名:USB_InitBulkOnlyTransport(void),功能:USB批量傳輸初始化-配置1x64字節BULK in和1x64字節BULK out;
//數據接收與發送子函數
(1)子函數名:Data_Tx(muint16*pBuffer,muint8 Len),功能:將長度為Len的數據移到pBuffer緩沖區;
(2)子函數名:Data_Rx(muint16*pBuffer),功能:將PC方發來的數據移到pBuffe緩沖區;
(3)子函數名:USB_Move2LocalBuffer(*FR_ptr,*TO_ptr,Len),功能:從指針FR_ptr所指向的位置移動長度為len數據到TO_ptr指針所指;
(4)子函數名:USB_Move2QUE3(FR_ptr,Len),功能:從指針FR_pt處移動長度為len數據到QUE1 FIFO緩沖區;
(5)子函數名:SCSIList28(),功能:Read指令集處理PC方向設備方索取數據;
(6)子函數名:SCSIList2A(),功能:Write指令集處理,PC方向設備方發數據。
4 結語
本文對基于MC9S12UF32 MCU的USB2.0接口的一般開發方法和技術特點、設備端軟件和主機端軟件的設計進行了討論,并給出了海量存儲設備的USB2.0接口設計方案和軟件設計的過程和實現方式,重點對設計枚舉過程和Bulk_Only傳輸進行了較詳細的闡述和研究,希望能對UF32芯片的設計和開發者起到一定的借鑒和拋磚引玉的作用。
參考文獻:
[1]邵貝貝.單片機嵌入式應用的在線開發方法[M].清華大學出版社,2004
[2]閏波,田茂,李廣軍.一種基于層次模型的USB2.0接口芯片核固件的設計與實現[J].半導體技術,29(3)
[3]張宇,程秀玲.基于OpenVPX的高速集成處理器USB接口設計[J].無線互聯科技,2020(04)
[4]陳玉輝,鐘洪聲,李廷軍.基于CY7C68013a的USB2.0接口設計[J].大眾科技,2010(10)
[5]孫瑜,張悅,陳勁操.基于USB接口的多路溫度采集系統設計[J].電力與能源,2017(02)
[6]陳旭輝,楊紅云.USB接口的虛擬多串口通信設備設計[J].單片機與嵌入式系統應用,2020(04)
[7]USB Mass Storage Class-UFI Command Specification[EB/OL]
作者簡介:徐建林(1987— ),男,安徽阜陽人,大專,助理工程師,研究方向:機械設計、非標自動化;聶章龍(1974— ),男,江蘇常州人,碩士,教授/高級工程師,研究方向:嵌入式系統、智能控制。