本文轉自公眾號,歡迎關注基于DWC2的USB驅動開發-發送相關的寄存器DMA寄存器詳解 (qq.com)
前言
上一篇我們介紹了IN端點,發送,DMA相關的兩個寄存器,這一篇繼續講另外的幾個寄存器。
DIEPCTLi
偏移地址 0x900+i*20
該寄存器控制端點的屬性,使能等,是端點操作的核心寄存器
傳輸使能與禁能
Bit31和bit30
其實這里名字Enable和Disable取的并不合適,這里實際并不是指的端點的使能和禁能,更確切的說應該是啟動和停止DMA對描述符連鏈表,DMA緩沖數據的處理,啟動和停止端點數據的傳輸。
端點的使能也就是激活應該是bit15。
軟件在準備好描述符( Scatter/Gather DMA )即DIEPDMAi以及描述符鏈表后,置位該位,硬件就會開始處理該描述符。對于非Scatter/Gather DMA 的DMA則是準備好DMA對應的緩沖區也是配置DIEPDMAi后使能該位硬件開始DMA處理。當然這里DMA處理描述符和DMA緩沖區實際就是搬運數據到TxFIFO中去,所以要TxFIFO有空閑才會進行。
注意硬件在發送完數據后產生相應的中斷時會自動清除該位即SETUP的完成,數據發送完成時,即相當于自動流控,發送完后硬件自動Disable,軟件重新配置相應的描述符和DMA再重新Enable。否則不Disable此時軟件還沒準備好描述符和DMA就會沒有數據可發。
另外手動置位EPDis時 EPEna也會清零,兩者互斥。
而EPDis表示停止傳輸,軟件只能在EPEna之前置位過才能置位該位,在停止中斷中硬件自動清除該位。
注意置位后不是一定數據傳輸馬上就停止了,要到停止中斷才能確認是停止了。
即DIEPINTi寄存器的bit1 EPDisbld為1.
端點激活
硬件收到復位信號后清除該位(EP0的不置位,因為EP0要默認使能,用于控制傳輸進行枚舉),軟件在設置配置,設置接口的標準請求時置位該位。
PID設置
設置PID,注意Scatter-Gather DMA模式是在描述符中設置PID的,所以這里保留
Bit16可以查看當前的PID狀態
NACK操作
軟件設置SNAK該位以發送NACK用于流控
注意硬件在SETUP完成后也會置位改位,所以軟件在開啟新的傳輸時需要置位CNAK和EPEna以停止NACK和啟動傳輸。
DIEPINTi的bit6 INEPNakEff置位表示SNAK設置NACK生效。
Bit17 NAKSts表示當前是否出于NAK狀態
發送FIFO號
Shared FIFO模式非周期端點共用一個發送FIFO所以這里必須為0,
只有獨立發送FIFO模式,或者周期端點,則每個發送IN端點可以對應一個獨立的TxFIFO
STALL
軟件置位該為以產生STALL的ACK
端點類型
下一個端點
Shared FIFO模式才有,必須要DMA模式才有(Slave
模式不需要)
對于每個發送端點獨立FIFO模式也不需要,因為都是獨立控制的,
只有Shared FIFO模式共享FIFO所以才需要鏈表告訴DMA下一個處理哪個端點
端點最大包大小
DIEPINTi****中斷狀態
這里是某個端點詳細的中斷原因,其中中斷的使能是總的中斷使能控制DAINTMSK,即控制哪一個端點的中斷使能,
其中bit0 XferCompl表示發送完,是最重要的中斷狀態
DIEPTSIZi
發送大小寄存器
一個微幀發送包數MC
注意Scatter-Gather DMA在描述中配置,不使用該寄存器的MC
該位只有內部DMA的非Scatter-Gather DMA模式使用
包數
注意每搬運完一個包到TxFIFO,該值會遞減,所以可以看該寄存器看已經搬運完的包數
同樣注意Scatter-Gather DMA在描述中配置,也不使用該寄存器
傳輸大小
指定一次DMA傳輸的大小
同樣注意Scatter-Gather DMA在描述中配置,也不使用該寄存器
該值也會根據已經處理完的數據量遞減
其中x 由GHWCFG3的bit4:0可以看到
DTXFSTSi
該寄存器可以看指定端點對應的TxFIFO剩余空閑的空間大小
實例
Scatter/Gather DMA模式
核心代碼如下即配置DMA地址,使能EPEna,清除NACK。這里沒有貼出描述符的填充過程。
void ep_writedma(uint32_t dma, uint8_t epnum)
{
REG_DIEP_DMA(epnum) = dma;
REG_DIEP_CTL(epnum) |= (DEP_ENA_BIT | DEP_CLEAR_NAK);
}
如下是EPena置位前后寄存器值,該位軟件置位后傳輸完后硬件自動清零
DIEPINT1 的bit0 XferCompl置位說明DMA處理完了
Bit9 BNAIntr置位說明DMA處理完后面沒有描述符需要處理了。
DIEPDMA1,DIEPDMAB1變為了0x08100968和0x207047c8這個上一篇文章已經分析過了
DTXFSTS1為0x00000300
DIEPTXFi 0x104+(i-1)*4
看到TxFIFO1的大小是0x300,也就是都發送完了TxFIFO中又都空閑了
DIEPTSIZ1由0x13C5變為了0x3F7003b1.
EPEna之后
可以看到描述的狀態也變為了DMA Done,長度也變為了0表示發送完了。
總結
以上是IN端點發送數據,DMA和端點相關需要配置的寄存器,需要注意的是Scatter/Gather DMA模式 一些狀態,比如發送包數,長度放在了描述符中去了。
熟悉以上寄存器對編寫驅動控制IN端點發送數據至關重要,一些寄存器也可以給調試提供信息。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
usb
+關注
關注
60文章
7936瀏覽量
264473 -
dma
+關注
關注
3文章
560瀏覽量
100544 -
驅動開發
+關注
關注
0文章
130瀏覽量
12072 -
DWC2
+關注
關注
0文章
35瀏覽量
125
發布評論請先 登錄
相關推薦
評論