0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-IN端點(diǎn)發(fā)送相關(guān)的寄存器詳解

嵌入式USB開(kāi)發(fā) ? 來(lái)源:嵌入式USB開(kāi)發(fā) ? 作者:嵌入式USB開(kāi)發(fā) ? 2023-07-17 07:41 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注基于DWC2的USB驅(qū)動(dòng)開(kāi)發(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)的使能和禁能,更確切的說(shuō)應(yīng)該是啟動(dòng)和停止DMA對(duì)描述符連鏈表,DMA緩沖數(shù)據(jù)的處理,啟動(dòng)和停止端點(diǎn)數(shù)據(jù)的傳輸。

端點(diǎn)的使能也就是激活應(yīng)該是bit15。

軟件在準(zhǔn)備好描述符( Scatter/Gather DMA )即DIEPDMAi以及描述符鏈表后,置位該位,硬件就會(huì)開(kāi)始處理該描述符。對(duì)于非Scatter/Gather DMA 的DMA則是準(zhǔn)備好DMA對(duì)應(yīng)的緩沖區(qū)也是配置DIEPDMAi后使能該位硬件開(kāi)始DMA處理。當(dāng)然這里DMA處理描述符和DMA緩沖區(qū)實(shí)際就是搬運(yùn)數(shù)據(jù)到TxFIFO中去,所以要TxFIFO有空閑才會(huì)進(jìn)行。

注意硬件在發(fā)送完數(shù)據(jù)后產(chǎn)生相應(yīng)的中斷時(shí)會(huì)自動(dòng)清除該位即SETUP的完成,數(shù)據(jù)發(fā)送完成時(shí),即相當(dāng)于自動(dòng)流控,發(fā)送完后硬件自動(dòng)Disable,軟件重新配置相應(yīng)的描述符和DMA再重新Enable。否則不Disable此時(shí)軟件還沒(méi)準(zhǔn)備好描述符和DMA就會(huì)沒(méi)有數(shù)據(jù)可發(fā)。

另外手動(dòng)置位EPDis時(shí) EPEna也會(huì)清零,兩者互斥。

而EPDis表示停止傳輸,軟件只能在EPEna之前置位過(guò)才能置位該位,在停止中斷中硬件自動(dòng)清除該位。

注意置位后不是一定數(shù)據(jù)傳輸馬上就停止了,要到停止中斷才能確認(rèn)是停止了。

即DIEPINTi寄存器的bit1 EPDisbld為1.

端點(diǎn)激活

硬件收到復(fù)位信號(hào)后清除該位(EP0的不置位,因?yàn)镋P0要默認(rèn)使能,用于控制傳輸進(jìn)行枚舉),軟件在設(shè)置配置,設(shè)置接口的標(biāo)準(zhǔn)請(qǐng)求時(shí)置位該位。

圖片

PID設(shè)置

設(shè)置PID,注意Scatter-Gather DMA模式是在描述符中設(shè)置PID的,所以這里保留

圖片

Bit16可以查看當(dāng)前的PID狀態(tài)

圖片

NACK操作

軟件設(shè)置SNAK該位以發(fā)送NACK用于流控

注意硬件在SETUP完成后也會(huì)置位改位,所以軟件在開(kāi)啟新的傳輸時(shí)需要置位CNAK和EPEna以停止NACK和啟動(dòng)傳輸。

DIEPINTi的bit6 INEPNakEff置位表示SNAK設(shè)置NACK生效。
圖片

Bit17 NAKSts表示當(dāng)前是否出于NAK狀態(tài)

圖片

發(fā)送FIFO號(hào)

Shared FIFO模式非周期端點(diǎn)共用一個(gè)發(fā)送FIFO所以這里必須為0,

只有獨(dú)立發(fā)送FIFO模式,或者周期端點(diǎn),則每個(gè)發(fā)送IN端點(diǎn)可以對(duì)應(yīng)一個(gè)獨(dú)立的TxFIFO

圖片

STALL

軟件置位該為以產(chǎn)生STALL的ACK

圖片

端點(diǎn)類型

圖片

下一個(gè)端點(diǎn)

Shared FIFO模式才有,必須要DMA模式才有(Slave

模式不需要)

對(duì)于每個(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,該值會(huì)遞減,所以可以看該寄存器看已經(jīng)搬運(yùn)完的包數(shù)

同樣注意Scatter-Gather DMA在描述中配置,也不使用該寄存器

圖片

傳輸大小

指定一次DMA傳輸?shù)拇笮?/p>

同樣注意Scatter-Gather DMA在描述中配置,也不使用該寄存器

該值也會(huì)根據(jù)已經(jīng)處理完的數(shù)據(jù)量遞減

圖片

其中x 由GHWCFG3的bit4:0可以看到

圖片

DTXFSTSi

該寄存器可以看指定端點(diǎn)對(duì)應(yīng)的TxFIFO剩余空閑的空間大小

實(shí)例

Scatter/Gather DMA模式

核心代碼如下即配置DMA地址,使能EPEna,清除NACK。這里沒(méi)有貼出描述符的填充過(guò)程。

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置位前后寄存器值,該位軟件置位后傳輸完后硬件自動(dòng)清零

圖片

DIEPINT1 的bit0 XferCompl置位說(shuō)明DMA處理完了

Bit9 BNAIntr置位說(shuō)明DMA處理完后面沒(méi)有描述符需要處理了。

DIEPDMA1,DIEPDMAB1變?yōu)榱?x08100968和0x207047c8這個(gè)上一篇文章已經(jīng)分析過(guò)了

DTXFSTS1為0x00000300

DIEPTXFi 0x104+(i-1)*4

看到TxFIFO1的大小是0x300,也就是都發(fā)送完了TxFIFO中又都空閑了

圖片

DIEPTSIZ1由0x13C5變?yōu)榱?x3F7003b1.

圖片

圖片

EPEna之后

圖片

圖片

可以看到描述的狀態(tài)也變?yōu)榱薉MA Done,長(zhǎng)度也變?yōu)榱?表示發(fā)送完了。

圖片

總結(jié)

以上是IN端點(diǎn)發(fā)送數(shù)據(jù),DMA和端點(diǎn)相關(guān)需要配置的寄存器,需要注意的是Scatter/Gather DMA模式 一些狀態(tài),比如發(fā)送包數(shù),長(zhǎng)度放在了描述符中去了。

熟悉以上寄存器對(duì)編寫驅(qū)動(dòng)控制IN端點(diǎn)發(fā)送數(shù)據(jù)至關(guān)重要,一些寄存器也可以給調(diào)試提供信息

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119205
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7773

    瀏覽量

    262390
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    552

    瀏覽量

    99931
  • 驅(qū)動(dòng)開(kāi)發(fā)

    關(guān)注

    0

    文章

    130

    瀏覽量

    12036
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    110
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    寄存器是什么意思?寄存器是如何構(gòu)成的?

    在計(jì)算機(jī)科學(xué)中,寄存器(Register)是一個(gè)高速存儲(chǔ)單元,它位于中央處理(CPU)內(nèi)部,用于存儲(chǔ)計(jì)算機(jī)程序執(zhí)行過(guò)程中所需要的數(shù)據(jù)、指令地址或狀態(tài)信息。寄存器是計(jì)算機(jī)體系結(jié)構(gòu)中至關(guān)重要的組成部分,對(duì)計(jì)算機(jī)的運(yùn)算速度和性能有著
    的頭像 發(fā)表于 08-02 18:23 ?1498次閱讀
    <b class='flag-5'>寄存器</b>是什么意思?<b class='flag-5'>寄存器</b>是如何構(gòu)成的?

    寄存器尋址的實(shí)現(xiàn)方式

    在計(jì)算機(jī)體系結(jié)構(gòu)中,寄存器尋址是一種常見(jiàn)的尋址方式,它允許程序直接訪問(wèn)CPU內(nèi)部的寄存器寄存器尋址可以提高程序的執(zhí)行效率,因?yàn)樗苊饬藢?duì)內(nèi)存的訪問(wèn)。 寄存器尋址的基本概念
    的頭像 發(fā)表于 07-12 10:36 ?360次閱讀

    寄存器分為基本寄存器和什么兩種

    寄存器是計(jì)算機(jī)中用于存儲(chǔ)數(shù)據(jù)的高速存儲(chǔ)單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴(kuò)展寄存器兩種類型。 一、基本寄存器
    的頭像 發(fā)表于 07-12 10:31 ?635次閱讀

    與定時(shí)相關(guān)寄存器有哪些類型

    ,微控制通常提供了一系列的定時(shí)寄存器,用于配置和控制定時(shí)的行為。 以下是一些常見(jiàn)的與定時(shí)相關(guān)
    的頭像 發(fā)表于 07-12 10:25 ?362次閱讀

    端點(diǎn)存儲(chǔ) (EPM) 位于何處? 系統(tǒng)RAM還是MMIO寄存器空間?

    您好,端點(diǎn)存儲(chǔ) (EPM) 位于何處? 系統(tǒng) RAM 還是 MMIO 寄存器空間? 非常感謝!
    發(fā)表于 05-30 07:52

    用STM32f205+PHY做一個(gè)高速usb的Device設(shè)備,USB批量傳輸設(shè)置兩個(gè)端點(diǎn)為OUT、IN后異常怎么解決?

    發(fā)送IN令牌包后,從機(jī)無(wú)響應(yīng)。 因?yàn)槊杜e過(guò)程數(shù)據(jù)正常,故懷疑是STM32配置BULK端點(diǎn)時(shí)出錯(cuò),經(jīng)過(guò)多次查找后發(fā)現(xiàn),當(dāng)配置端點(diǎn)2為OUT模式后,STM32
    發(fā)表于 04-24 07:41

    干貨滿滿:ARM的內(nèi)核寄存器講解

    內(nèi)核寄存器與外設(shè)寄存器: 內(nèi)核寄存器與外設(shè)寄存器是完全不同的概念。內(nèi)核寄存器是指 CPU 內(nèi)部的寄存器
    發(fā)表于 04-17 11:47 ?1905次閱讀
    干貨滿滿:ARM的內(nèi)核<b class='flag-5'>寄存器</b>講解

    CPU的6個(gè)主要寄存器

    CPU寄存器是中央處理內(nèi)的組成部分,是有限存貯容量的高速存貯部件。寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用寄存器和控制
    的頭像 發(fā)表于 02-03 15:15 ?2941次閱讀

    移位寄存器的工作原理 移位寄存器左移和右移怎么算

    移位寄存器是一種用于在數(shù)字電路中實(shí)現(xiàn)數(shù)據(jù)移位操作的基本電路元件。它由多個(gè)觸發(fā)以及相關(guān)控制電路組成,具有存儲(chǔ)、接受和移動(dòng)數(shù)據(jù)的功能。移位寄存器可以分為兩種類型:串行移位
    的頭像 發(fā)表于 01-18 10:52 ?6008次閱讀

    MC17XS6500高邊驅(qū)動(dòng)芯片寄存器的介紹

    本文主要是對(duì)MC17XS6500高邊驅(qū)動(dòng)芯片寄存器進(jìn)行的介紹,MC17XS6500寄存器分為輸入寄存器和輸出寄存器,對(duì)常用的幾個(gè)輸入和輸出
    的頭像 發(fā)表于 12-29 08:27 ?585次閱讀
    MC17XS6500高邊<b class='flag-5'>驅(qū)動(dòng)</b>芯片<b class='flag-5'>寄存器</b>的介紹

    寄存器查看的功能和使用

    對(duì)于搞嵌入式底層開(kāi)發(fā)的軟件或者硬件工程師來(lái)說(shuō),經(jīng)常會(huì)涉及到查看芯片手冊(cè),比如某個(gè)芯片的串口控制寄存器值,需要知道這個(gè)值對(duì)應(yīng)寄存器的哪些位,微軟計(jì)算
    的頭像 發(fā)表于 11-28 12:26 ?1427次閱讀
    <b class='flag-5'>寄存器</b>查看<b class='flag-5'>器</b>的功能和使用

    寄存器開(kāi)發(fā),HAL開(kāi)發(fā)和LL開(kāi)發(fā)的區(qū)別和參考代碼

    不依賴高級(jí)的抽象層。以下是寄存器級(jí)開(kāi)發(fā)的一般步驟和示例:1.包含頭文件在程序中包含與目標(biāo)微控制系列相關(guān)寄存器定義頭文件。#include
    的頭像 發(fā)表于 11-17 08:00 ?1018次閱讀
    <b class='flag-5'>寄存器</b><b class='flag-5'>開(kāi)發(fā)</b>,HAL<b class='flag-5'>開(kāi)發(fā)</b>和LL<b class='flag-5'>開(kāi)發(fā)</b>的區(qū)別和參考代碼

    gic的寄存器 gicv3的LPI中斷

    (1)gicv2寄存器 gicv2寄存器,都是使用memory-mapped的方式去訪問(wèn)的 ? ?GICD_: distributor的寄存器
    的頭像 發(fā)表于 11-08 16:09 ?561次閱讀

    CPSR寄存器和APSR寄存器的組成

    程序狀態(tài)寄存器的作用就是反映處理的狀態(tài)信息。在程序運(yùn)行期間我們可以通過(guò)查看程序狀態(tài)寄存器的狀態(tài)位來(lái)進(jìn)行程序的分支跳轉(zhuǎn)處理,或者我們可以設(shè)置程序狀態(tài)寄存器的模式位來(lái)改變處理
    的頭像 發(fā)表于 10-20 11:38 ?3731次閱讀
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的組成

    Linux驅(qū)動(dòng)操作寄存器

    ,第四個(gè)參數(shù)是映射的大小。 驅(qū)動(dòng)中操作: #define?OFFSET??0x60?//某個(gè)寄存器的偏移地址 static?int?my_probe(struct?platform_device
    的頭像 發(fā)表于 09-26 16:34 ?673次閱讀