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