0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC2的USB驱动开发-IN端点发送相关的寄存器详解

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-07-17 07:41 次阅读

本文转自公众号,欢迎关注基于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

    文章

    5254

    浏览量

    119288
  • usb
    usb
    +关注

    关注

    60

    文章

    7802

    浏览量

    262589
  • dma
    dma
    +关注

    关注

    3

    文章

    552

    浏览量

    99975
  • 驱动开发
    +关注

    关注

    0

    文章

    130

    浏览量

    12047
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    111
收藏 人收藏

    评论

    相关推荐

    寄存器是什么意思?寄存器是如何构成的?

    在计算机科学中,寄存器(Register)是一个高速存储单元,它位于中央处理(CPU)内部,用于存储计算机程序执行过程中所需要的数据、指令地址或状态信息。寄存器是计算机体系结构中至关重要的组成部分,对计算机的运算速度和性能有着
    的头像 发表于 08-02 18:23 1674次阅读
    <b class='flag-5'>寄存器</b>是什么意思?<b class='flag-5'>寄存器</b>是如何构成的?

    寄存器寻址的实现方式

    在计算机体系结构中,寄存器寻址是一种常见的寻址方式,它允许程序直接访问CPU内部的寄存器寄存器寻址可以提高程序的执行效率,因为它避免了对内存的访问。 寄存器寻址的基本概念
    的头像 发表于 07-12 10:36 384次阅读

    寄存器分为基本寄存器和什么两种

    寄存器是计算机中用于存储数据的高速存储单元,它们是CPU内部的重要组成部分。寄存器可以分为基本寄存器和扩展寄存器两种类型。 一、基本寄存器
    的头像 发表于 07-12 10:31 671次阅读

    与定时相关寄存器有哪些类型

    ,微控制通常提供了一系列的定时寄存器,用于配置和控制定时的行为。 以下是一些常见的与定时相关
    的头像 发表于 07-12 10:25 382次阅读

    端点存储 (EPM) 位于何处? 系统RAM还是MMIO寄存器空间?

    您好,端点存储 (EPM) 位于何处? 系统 RAM 还是 MMIO 寄存器空间? 非常感谢!
    发表于 05-30 07:52

    用STM32f205+PHY做一个高速usb的Device设备,USB批量传输设置两个端点为OUT、IN后异常怎么解决?

    发送IN令牌包后,从机无响应。 因为枚举过程数据正常,故怀疑是STM32配置BULK端点时出错,经过多次查找后发现,当配置端点2为OUT模式后,STM32
    发表于 04-24 07:41

    干货满满:ARM的内核寄存器讲解

    内核寄存器与外设寄存器: 内核寄存器与外设寄存器是完全不同的概念。内核寄存器是指 CPU 内部的寄存器
    发表于 04-17 11:47 2050次阅读
    干货满满:ARM的内核<b class='flag-5'>寄存器</b>讲解

    CPU的6个主要寄存器

    CPU寄存器是中央处理内的组成部分,是有限存贮容量的高速存贮部件。寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制
    的头像 发表于 02-03 15:15 3019次阅读

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

    移位寄存器是一种用于在数字电路中实现数据移位操作的基本电路元件。它由多个触发以及相关控制电路组成,具有存储、接受和移动数据的功能。移位寄存器可以分为两种类型:串行移位
    的头像 发表于 01-18 10:52 6110次阅读

    MC17XS6500高边驱动芯片寄存器的介绍

    本文主要是对MC17XS6500高边驱动芯片寄存器进行的介绍,MC17XS6500寄存器分为输入寄存器和输出寄存器,对常用的几个输入和输出
    的头像 发表于 12-29 08:27 596次阅读
    MC17XS6500高边<b class='flag-5'>驱动</b>芯片<b class='flag-5'>寄存器</b>的介绍

    寄存器查看的功能和使用

    对于搞嵌入式底层开发的软件或者硬件工程师来说,经常会涉及到查看芯片手册,比如某个芯片的串口控制寄存器值,需要知道这个值对应寄存器的哪些位,微软计算
    的头像 发表于 11-28 12:26 1478次阅读
    <b class='flag-5'>寄存器</b>查看<b class='flag-5'>器</b>的功能和使用

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)
    发表于 11-24 16:36 1次下载

    寄存器开发,HAL开发和LL开发的区别和参考代码

    不依赖高级的抽象层。以下是寄存器开发的一般步骤和示例:1.包含头文件在程序中包含与目标微控制系列相关寄存器定义头文件。#include
    的头像 发表于 11-17 08:00 1048次阅读
    <b class='flag-5'>寄存器</b><b class='flag-5'>开发</b>,HAL<b class='flag-5'>开发</b>和LL<b class='flag-5'>开发</b>的区别和参考代码

    gic的寄存器 gicv3的LPI中断

    (1)gicv2寄存器 gicv2寄存器,都是使用memory-mapped的方式去访问的 • ◾GICD_: distributor的寄存器
    的头像 发表于 11-08 16:09 579次阅读

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

    程序状态寄存器的作用就是反映处理的状态信息。在程序运行期间我们可以通过查看程序状态寄存器的状态位来进行程序的分支跳转处理,或者我们可以设置程序状态寄存器的模式位来改变处理
    的头像 发表于 10-20 11:38 3810次阅读
    CPSR<b class='flag-5'>寄存器</b>和APSR<b class='flag-5'>寄存器</b>的组成