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

Modbus協(xié)議的讀取保持寄存器值
接口的控制與狀態(tài)寄存器什么作用
寄存器間接尋址和寄存器尋址的區(qū)別
寄存器的類型和作用
寄存器故障分析
寄存器是什么意思?寄存器是如何構(gòu)成的?

評論