王靜嬌,翟剛毅,楊陽,劉劍
(中國船舶重工集團公司 第七二四研究所 信號系統部,南京211153)
王靜嬌(助理工程師),研究方向為數據通信;翟剛毅(高級工程師),研究方向為雷達數字信號處理;楊陽(助理工程師),研究方向為數據通信電路設計;劉劍(工程師),主要從事雷達數字電路板設計。
引 言
低功耗、低成本、外圍接口豐富、使用簡單的ARM 處理器,在電子模塊的故障檢測、監控和輔助功能中的應用越來越廣泛。與ARM 接口的USB外設(如USB下載電纜、無線通信模塊、人機交互模塊等)的應用也越來越多,這些外設往往不提供針對ARM 的主機驅動程序,需要用戶自行開發。
本文以TI公司基于ARM Cortex-M4內核的TM4C129 XNCZAD 為 核 心 構 建 了USB2.0 主 機 系 統,實 現 了 與USB2.0設備的高速數據交互。
圖1為系統硬件結構框圖,其中核心處理器為TI公司的TM4C129XNCZAD,工作時鐘可達120 MHz,提供150DMIPS的性能,具有1024KB Flash和256KB 單循環系統SRAM,支持UART、I2C、CAN、以太網、USB等通信接口并具有豐富的GPIO 口[1],完全滿足USB2.0主機開發需求。USB 外置PHY 芯片為SMSC 公司的USB3320,支持高速、全速、低速3種USB通信模式。

圖1 系統硬件結構框圖
TM4C129XNCZAD 的USB 控制器支持USB 主機、設備、OTG 三種點對點USB通信,符合USB2.0標準,支持控制、批量、等時、中斷4種傳輸模式。圖2所示為該芯片的USB模塊結構框圖,該模塊具有16個端口,1對控制端口和7對輸入/輸出端口;4KB專用端口內存,端口通道均可以進行DMA 傳輸,DMA 控制器可直接訪問FIFO,而無需通過CPU 接口。
另外,芯片內置USB PHY,并設有ULPI接口,可以通過USBPC.ULPIEN 進行設置選擇。默認使用USB內置PHY,但僅支持全速或低速通信,通過USB0DM 和USB0DP連接USB電纜。若設置USBPC.ULPIEN 為1,則使能ULPI接口,連接外部USB PHY 和USB控制器,從而擴展為USB2.0。
TM4C129XNCZAD處理器中USB模塊內部的PHY為USB1.1,為了滿足高速USB 傳輸需求,采用ARM 芯片上預留的ULPI接口外接PHY 芯片,從USB1.1全速傳輸升級為USB2.0 高速傳輸,本文采用SMSC 公司的USB3320作為ULPI PHY 芯片。

圖2 TM4C129XNCZAD處理器USB模塊結構框圖
ULPI(UTMI Low Pin Interface)是低引腳UTMI的簡稱,UTMI(USB2.0 Transceiver Macrocell Interface)為USB2.0的傳輸宏接口。UTMI PHY 主要通過一系列的控制信號來實現與作為LINK的USB控制器之間的交互,而ULPI將UTMI接口的信號線從32條減少至12條。ARM處理器和PHY 結合成為USB2.0的主機端,需要把PHY也配置為host主機模式,具體電路如圖3所示。ARM 處理器提供了ULPI接口,若ARM 配置為ULPI模式,則ULPI clk引腳能提供60MHz時鐘輸出給PHY芯片。

圖3 USB模塊硬件連接圖
軟件的工作流程為:ARM 處理器首先進行系統初始化,包括對USB模塊的初始化(即ULPI接口配置等),然后等待USB主控制器的外部中斷,當USB設備連接主機后,由USB主控制器通過外部中斷信號通知ARM 處理器,ARM 處理器與USB主控制器完成設備的枚舉、配置,并開始USB數據傳輸[2]。
首先,USBULPIEnable()函數使能ARM 處理器的ULPI接口。ULPI接口的工作模式分為同步模式、低功耗模式、6/3引腳FS/LS串行模式、Carkit模式[3],通過USBULPIConfig()函數配置PHY 芯片的寄存器,可以使其工作在對應模式下。本文中USB3320主要工作在同步模式下。ULPI提供了24 個寄存器,其中功能控制寄存器(Function Control Reg,FCR)用于實現對PHY 端UTMI功能的基本配置。FCR占用地址0x04h~0x06h,0x04h地址可讀可寫,而0x05h和0x06h地址實質并不存在,只是分別實現了對寄存器相應位的置位和清0 操作。函數USBULPIRegRead()和USBULPIRegWrite()分別實現了寄存器的讀寫,具體功能控制寄存器位的描述如表1 所列。FCReg的初始值為0x41h,本文中PHY芯片工作在USB2.0高速模式、正常操作狀態,所以將其設置為0x40h。
同步模式中ULPI定義了由LINK 端(ARM)發出的發送命令字TX CMD 和PHY 端發出的接收命令字RX CMD。一個TX CMD為一個字節,包括2位的命令碼和6位的命令負載碼,ARM 處理器需等到DIR 信號為低電平時才能發送TX CMD,后接需要傳輸的數據,寄存器的讀寫就是通過發送TX CMD 來實現的。而RX CMD 體現了線上狀態(Linestate)、連接、OTG 狀態信息等,它傳達給ARM USB接收信息和中斷事件兩種信息。USB接收信息即一次USB傳輸后,PHY 要發送帶Linestate內容的RX CMD來表示EOP(End Of Packet);中斷事件則包括Hostdisconnect、vbus、IdGnd等,當檢測到這些事件時,PHY 芯片就會發送RX CMD給LINK 端。

表1 功能控制器位描述
USB主機模式主要涉及USB驅動初始化、USB設備枚舉、USB數據傳輸過程。
(1)USB驅動初始化
進行USB驅動初始化,在USB_Init()函數中先配置USB模塊的引腳,包括ULPI接口引腳類型等,接著使能USB模塊,并通過USBStackModeSet()將其設置為主機模式,注冊主機類驅動,打開類驅動實例[4],然后初始化USB控制器,并使能USB中斷。ARM 的USB模塊初始化成功后,使能ULPI接口,并復位USB3320設備,對其進行配置。
(2)USB設備枚舉
ARM 作為USB的主機端,需要周期性地調用USBHCDMain()監聽USB設備狀態。當USB設備通過PHY芯片連接上ARM 處理器后,PHY 發送RXD CMD,從而產生連接中斷事件通知ARM 處理器;ARM 處理器調用枚舉驅動對USB設備進行枚舉:先復位設備,接著檢測設備運行在低速、全速還是高速模式,再獲取USB設備描述符并重新分配地址,然后獲取配置、字符串描述符等,最后為設備驅動程序選擇配置。
USB設備的枚舉主要是主機通過控制傳輸來實現,每個設備都支持通過端點0管道完成控制傳輸。控制傳輸使主機和設備之間能夠交換有關設備能力和類似廠商專有的信息,包括設置階段、數據階段(可無)、狀態階段。設置階段由一個設置事務構成,將整個傳輸確定為控制傳輸,并發送設備請求及設備完成請求所需的其他信息。一個設置請求包含bmRequestType(1字節)、bRequest(1字節)、wValue(2字節)、wIndex(2字節)、wLength(2字節),共5個字段、8個字節,用于指示設備請求類別以及是否具有數據階段,具體由USBHCDControlTransfer()函數實現,流程如圖4所示。

圖4 控制傳輸流程圖
(3)USB數據傳輸
批量傳輸可以發送大量數據而不阻塞總線,FPGA 調試主要涉及到比特流和捕捉的數據,適合采用批量傳輸。批量傳輸由一個或多個IN 或OUT事務構成,分為批量讀數據bulkIn和批量寫數據bulkOut。所有的總線傳輸都是傳到設備端口或者從設備端口發送,端口和主機控制器之間需要建立管道來進行數據傳輸,這里分別通過IN 和OUT 端口,在枚舉期間也需要分別對每個端口建立管道。函數USBbulkIn()通過讀取通向IN端口的管道進行讀操作,函數USBbulkOut()則通過OUT端口的管道進行寫操作,USBbulkOut()函數的實現流程如圖5所示,USBbulkIn()函 數類似。

圖5 批量讀流程圖
結 語
本文通過外接USB PHY 擴展了TM4C129XNCZAD芯片的USB模塊,并通過編寫USB核心驅動程序實現了USB2.0 設備的枚舉、數據傳輸,完成了基于ARM 的USB2.0的主機開發。本系統應用在FPGA 遠程調試中,可以實現FPGA 下載電纜在ARM 上的枚舉、數據14 傳輸等功能,成功地進行FPGA 的加載和調試,并可以廣泛應用于其他USB設備的連接。
[1]Texas Instruments Incorporated.Tiva TM4C129XNCZAD Microcontroller Data Sheet,2013:58-61.
[2]Jan Axelson.USB開發大全[M].李鴻鵬,譯.北京:人民郵電大學出版社,2011.
[3]鄭拓.USB2.0主機端(ULPI)的FPGA 設計[D].太原:太原理工大學,2011.
[4]李紀偉.基于ARM 的嵌入式系統研究及USB驅動程序設計[D].成都:電子科技大學,2005.