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

    文章

    5447

    浏览量

    125402
  • usb
    usb
    +关注

    关注

    60

    文章

    8264

    浏览量

    274867
  • dma
    dma
    +关注

    关注

    3

    文章

    576

    浏览量

    103683
  • 驱动开发
    +关注

    关注

    0

    文章

    134

    浏览量

    12360
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    273
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何通过CYUSB3014的设备寄存器读取主机发起的数据传输的ACK?如何通过寄存器读取主机发送的复位命令?

    IN 事务。那么,可以读取哪个寄存器来确认设备是否收到了用于发起 IN 事务的第一个 ACK 数据包? 2. 主机端远程复位设备芯片使用哪个寄存器?读取该寄存器可以确认设备已收到来自
    发表于 07-15 06:20

    使用寄存器点亮LED灯

    学习本章时,配合以上芯片手册中的“19. I/O Ports”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容涉及到较多寄存器方面的深入内容,对于初学者而言这些内容丰富也较难理解,但非常有必要细读研究、夯实基础。
    的头像 发表于 05-28 17:37 ?738次阅读
    使用<b class='flag-5'>寄存器</b>点亮LED灯

    新思 DWC2 的参考手册从哪里可以下载

    最近在学习STM32F4 USB驱动,有看到 dwc2驱动的代码,但是没有手册用来参考,ST手册上寄存器不全,从网上看到有下面两个手册,但
    发表于 01-22 11:32

    迅为RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数

    迅为RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数
    的头像 发表于 01-20 14:43 ?1157次阅读
    迅为RK3568<b class='flag-5'>开发</b>板SPI<b class='flag-5'>驱动</b>指南-mcp2515<b class='flag-5'>驱动</b>编写:读<b class='flag-5'>寄存器</b>函数

    写单个线圈与单个保持寄存器相关

    05功能码用于将单个线圈寄存器(或离散输入)设置为ON或OFF,该功能码支持广播模式在广播模式下,所有从站设备的同一地址的值将被统一修改。查询报文中的ON/OFF状态由报文数据字段的常数指定
    的头像 发表于 11-01 13:46 ?838次阅读

    Modbus协议的读取保持寄存器

    功能码用于读取从设备保持寄存器的内容,不支持广播模式。消息顿中指定了需要读取的保持寄存器的起始地址和数目。而保持寄存器中各地址的具体内容和意义则由设备开发者自行规定。
    的头像 发表于 10-30 10:54 ?4283次阅读

    详解寄存器模型镜像值

    DUT的配置寄存器的值是实际值,reg_model有镜像值、期望值的概念。
    的头像 发表于 10-23 09:43 ?1162次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>寄存器</b>模型镜像值

    接口的控制与状态寄存器什么作用

    接口的控制与状态寄存器(Control and Status Registers,简称CSR)是计算机系统中用于控制和监控硬件设备操作的寄存器。它们是硬件设备与其驱动程序之间的桥梁,允许软件控制硬件
    的头像 发表于 10-17 10:42 ?1677次阅读

    什么是寄存器移位寻址

    寄存器移位寻址是一种特定的寻址方式,主要出现在某些处理架构中,如ARM指令集。这种寻址方式在处理数据移动和操作时提供了极大的灵活性和效率。下面将从定义、工作原理、特点、应用场景以及与其他寻址方式的对比等方面对寄存器移位寻址进行
    的头像 发表于 10-05 17:38 ?1151次阅读

    寄存器间接寻址和寄存器寻址的区别

    寄存器间接寻址和寄存器寻址是计算机体系结构中两种重要的寻址方式,它们在指令执行过程中起着关键作用。下面将从定义、原理、特点、应用场景以及区别等方面对这两种寻址方式进行详细阐述。
    的头像 发表于 10-05 17:13 ?3807次阅读

    ARM寄存器的分类及功能

    ARM寄存器是ARM处理内部的重要组成部分,它们在处理的运算、控制以及数据存储等方面发挥着至关重要的作用。下面,我们将从ARM寄存器的定义、结构、分类以及功能等多个方面进行详细阐述
    的头像 发表于 09-05 14:18 ?3168次阅读

    通用寄存器是什么意思

    在计算机体系结构中,通用寄存器是中央处理(CPU)内部最为核心和基础的组成部分之一。它们被设计为能够存储和传输各种类型的数据和指令,是CPU进行数据处理和运算的关键工具。通用寄存器不仅在程序的执行过程中起着至关重要的作用,还直
    的头像 发表于 09-05 14:13 ?2534次阅读

    寄存器的类型和作用

    在计算机科学中,寄存器(Register)是一种高速存储单元,它位于CPU内部,与CPU的运算单元和逻辑控制单元紧密相连。寄存器的主要作用是暂时存储指令、操作数和地址等临时数据,以便CPU快速访问和处理。由于寄存器直接集成在CP
    的头像 发表于 09-05 14:11 ?5103次阅读

    寄存器的输入输出方式

    寄存器的输入输出方式是数字电路设计中至关重要的部分,它决定了数据如何在寄存器中进出以及处理的效率。下面将详细探讨寄存器的几种主要输入输出方式,包括并行输入输出、串行输入输出以及双向输入输出,并会扩展到移位
    的头像 发表于 09-05 14:09 ?2751次阅读

    寄存器故障分析

    寄存器故障分析是计算机硬件维护与系统稳定性保障中的重要环节。寄存器作为计算机中的关键组成部分,负责存储和传输数据,其稳定性和可靠性直接影响到整个计算机系统的性能。以下是对寄存器故障的全面分析,包括故障类型、故障现象、故障原因及诊
    的头像 发表于 08-29 11:26 ?2358次阅读