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