基于FPGA和VHDL的USB2.0控制器設計
2.3 端點(diǎn)操作
數據的傳輸實(shí)際上通過(guò)端點(diǎn)(Endpoint)進(jìn)行,控制器通過(guò)寫(xiě)端點(diǎn)的寄存器來(lái)配置端點(diǎn),該控制器最多可有16個(gè)端點(diǎn),每個(gè)端點(diǎn)有相應的4個(gè)寄存器:Epn_CSR、Epn_INT、Epn_BUF0和Epn_BUF1(這里n=0、1、2或3),其格式如圖6所示。本文使用addr[8:2]7根據地址線(xiàn)來(lái)訪(fǎng)問(wèn)這些寄存器,addr[8:4]用來(lái)選擇端點(diǎn)號,其值(16進(jìn)制)從4到19分別表Epn(n=0...15)。addr[3:2]指定寄存器類(lèi)型:“00”代表CSR(Control Status Register);“01”代表中斷寄存器;“10”指向Buffer0;“11”代表Buffer1。這兩個(gè)Buffer用來(lái)作臨時(shí)數據存儲,Buffer0和Buffer1分別作為專(zhuān)用的輸入/輸出緩沖器來(lái)提高USB的數據吞吐能力。雙Buffer能夠減少微控制器和驅動(dòng)軟件之間的延遲。其中端點(diǎn)的CSR寄存器指定端點(diǎn)的工作模式并且向控制器報告指定端點(diǎn)的狀態(tài)。Ep_CSR[31:30]必須初始化為“00”(最初使用Buffer0),通過(guò)讀這2位可以知道下次所要處理的緩沖器;為“01”時(shí),指定Buffer1。Ep_CSR[27:26]和Ep_CSR[25:24]分別指定端點(diǎn)類(lèi)型和傳輸類(lèi)型,其類(lèi)型編碼參見(jiàn)表1。Ep_CSR[21:18]指定端點(diǎn)號,總共可以有16個(gè)端點(diǎn)。Ep_CSR[15]時(shí)DMA使能位,為“1”時(shí)允許外部DMA操作,否則不允許DMA操作。
表1 類(lèi)型編碼表
當控制器收到中斷時(shí),讀中斷源寄存器(Ep_INT[6:0])來(lái)判斷中斷源和產(chǎn)生的原因??勺远x中斷源,如Ep_INT[2]定義為該控制器接收到不支持的PID而產(chǎn)生的中斷:Ep_INT[2]=Pid_ERROR。Ep_INT[4]和Ep_INT[3]分別表示Buffer1和Buffer0的滿(mǎn)或空的狀態(tài)位。
Ep_BUF[31](標記緩沖器是否被使用過(guò))在使用后被控制器置“1”,在清空或重填充該緩沖器后,控制器清除該位。該閏初始化時(shí)為“0”。Ep_BUF[30:17]指定緩沖器能容納的字節數。Ep_BUF[16:0]緩沖器的指針,裝載存儲器SRAM中數據的地址。
控制端點(diǎn)(Endpoint0)比較特殊,由于它既要接收也要發(fā)送數據,因此對于控制端點(diǎn),Buffer0用于OUT緩沖器,Buffer1則是IN緩沖器。從SETUP和OUT分組來(lái)的數據,寫(xiě)入Buffer0,IN分組的數據則是從Buffer1中獲取。
2.4 DMA操作
DMA操作允許控制器與功能接口之間數據的透明傳輸。一旦設置了DMA操作,則不需要微控制器的干預。每個(gè)端點(diǎn)有一對DMA_REQ和DMA_ACK信號。當CSR寄存器中DMA使能信號位(Ep_CSR[15])被置位時(shí),USB控制器使用DMA_REQ和DMA_ACK這兩個(gè)信號來(lái)進(jìn)行DMA的流控制。當緩沖區有數據或為空需要填充時(shí)發(fā)送DMA請求信號DMA_REQ,每傳輸4字節,響應一個(gè)DMA_ACK信號。
評論