本文轉(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)
這里是某個端點詳細的中斷原因,其中中斷的使能是總的中斷使能控制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文章
5608瀏覽量
129943 -
usb
+關(guān)注
關(guān)注
60文章
8438瀏覽量
284400 -
dma
+關(guān)注
關(guān)注
3文章
581瀏覽量
105913 -
驅(qū)動開發(fā)
+關(guān)注
關(guān)注
0文章
140瀏覽量
12625 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
374
發(fā)布評論請先 登錄
SN74SSTVF16857 14位寄存器緩沖器:設(shè)計與應(yīng)用詳解
探索IDT74SSTUBF32866B:DDR2的25位可配置寄存器緩沖器
bk3633 usb 設(shè)備如何讀取主機向端點0 發(fā)送數(shù)據(jù)包
探索IDT74SSTUBF32866B:DDR2的25位可配置寄存器緩沖器
Renesas IDT74SSTUBF32866B:DDR2的25位可配置寄存器緩沖器詳解
嵌入式系統(tǒng)必懂的 20 個寄存器
NVMe高速傳輸之?dāng)[脫XDMA設(shè)計32:寄存器功能驗證與分析2
TPIC6595 8位功率移位寄存器技術(shù)文檔摘要
?TPIC6B595 8位功率移位寄存器技術(shù)文檔總結(jié)
SN74LV594A:2-5.5V帶輸出寄存器的8位移位寄存器技術(shù)解析
?TLC6C5912 12通道移位寄存器LED驅(qū)動器技術(shù)文檔總結(jié)
Texas Instruments SN74LV8T594/SN74LV8T594-Q1移位寄存器特性/應(yīng)用/框圖
如何通過CYUSB3014的設(shè)備寄存器讀取主機發(fā)起的數(shù)據(jù)傳輸?shù)腁CK?如何通過寄存器讀取主機發(fā)送的復(fù)位命令?
使用寄存器點亮LED燈
如何用C語言操作寄存器——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(10)
基于DWC2的USB驅(qū)動開發(fā)-IN端點發(fā)送相關(guān)的寄存器詳解
評論