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