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

    文章

    5620

    浏览量

    130444
  • usb
    usb
    +关注

    关注

    60

    文章

    8480

    浏览量

    285967
  • dma
    dma
    +关注

    关注

    3

    文章

    582

    浏览量

    106284
  • 驱动开发
    +关注

    关注

    0

    文章

    142

    浏览量

    12727
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ICSSSTUB32866B:DDR2可配置寄存器缓冲的技术解析

    ICSSSTUB32866B:DDR2可配置寄存器缓冲的技术解析 在DDR2内存模块的设计中,选择合适的寄存器缓冲
    的头像 发表于 04-14 09:40 422次阅读

    Renesas ICSSSTUAF32869A:DDR2的14位可配置寄存器缓冲

    Renesas ICSSSTUAF32869A:DDR2的14位可配置寄存器缓冲 在DDR2内存模块的设计中,选择合适的寄存器缓冲
    的头像 发表于 04-14 09:30 446次阅读

    Renesas ICSSSTUAF32865A:DDR2 28位可配置寄存器缓冲详解

    Renesas ICSSSTUAF32865A:DDR2 28位可配置寄存器缓冲详解 在 DDR2 内存模块设计领域,Renesas 的
    的头像 发表于 04-14 09:25 438次阅读

    深入解析IDT74SSTUBH32865A:DDR2的28位1:2寄存器缓冲

    奇偶校验功能的28位1:2寄存器缓冲,适用于1.7V至1.9V的VDD工作电压。它的所有时钟和数据输入都符合JEDEC的SSTL_18标准,控制输入为LVCMOS,输出则是经过优化的1.8V CMOS
    的头像 发表于 04-12 12:50 481次阅读

    IDT74SSTV16857:14位带SSTL I/O的寄存器缓冲详解

    IDT74SSTV16857:14位带SSTL I/O的寄存器缓冲详解 在电子设计领域,选择合适的缓冲对于系统性能至关重要。今天我们就来详细探讨IDT74SSTV16857这款14
    的头像 发表于 04-12 12:05 381次阅读

    IDT74SSTU32864/A/C/D/G:1.8V SSTL I/O的1:1和1:2寄存器缓冲详解

    IDT74SSTU32864/A/C/D/G:1.8V SSTL I/O的1:1和1:2寄存器缓冲详解 在DDR2内存系统设计中,一款性能
    的头像 发表于 04-12 09:40 470次阅读

    PI74SSTVF16857 14位寄存器缓冲:特性与应用详解

    PI74SSTVF16857 14位寄存器缓冲:特性与应用详解 在电子设计领域,选择合适的缓冲对于确保电路的稳定运行至关重要。今天,我们就来深入了解一下Pericom Semico
    的头像 发表于 03-27 13:40 172次阅读

    SN74SSTVF16857 14位寄存器缓冲:设计与应用详解

    SN74SSTVF16857 14位寄存器缓冲:设计与应用详解 在电子设计领域,寄存器缓冲是不可或缺的组件,它能有效处理数据传输和信号处
    的头像 发表于 02-10 14:05 299次阅读

    探索IDT74SSTUBF32866B:DDR2的25位可配置寄存器缓冲

    1.7 - 1.9V VDD电压运行的25位1:1或14位1:2可配置寄存器缓冲。它的时钟和数据输入与JEDEC标准的SSTL_18兼容,控制输入为LVCMOS,输出则是经过优化的1.8V CMOS
    的头像 发表于 12-24 16:30 526次阅读

    Renesas IDT74SSTUBF32866B:DDR2的25位可配置寄存器缓冲详解

    Renesas IDT74SSTUBF32866B:DDR2的25位可配置寄存器缓冲详解 在DDR2内存模块的设计中,一款合适的
    的头像 发表于 12-23 15:55 722次阅读

    嵌入式系统必懂的 20 个寄存器

    嵌入式开发看起来很复杂,但很多操作其实都离不开寄存器寄存器就是MCU内部的存储单元,它们控制着处理和外设的行为。熟悉这些寄存器,你就能更
    的头像 发表于 11-14 10:28 1372次阅读
    嵌入式系统必懂的 20 个<b class='flag-5'>寄存器</b>

    NVMe高速传输之摆脱XDMA设计32:寄存器功能验证与分析2

    寄存器最大值为 64’hFFFFFFFFFFFFFFFF,到达最大值后一个时钟周期后翻转回 0, 在随机时刻使用 force 将寄存器赋值临近最大值, 当寄存器达到最大值后, 翻转回到 0, 读取数值为 0, 仿真行为符合设计预
    的头像 发表于 10-14 17:06 896次阅读
    NVMe高速传输之摆脱XDMA设计32:<b class='flag-5'>寄存器</b>功能验证与分析<b class='flag-5'>2</b>

    ‌TPIC6B595 8位功率移位寄存器技术文档总结

    TPIC6B595器件是一款单片、高压、中电流功率8位移位寄存器,设计用于需要相对高负载功率的系统。该器件在输出端包含一个内置电压钳位,用于电感瞬态保护。功率驱动器应用包括继电器、螺线管和其他中电流
    的头像 发表于 09-09 10:16 1179次阅读
    ‌TPIC6B595 8位功率移位<b class='flag-5'>寄存器</b>技术文档总结

    SN74LV594A:2-5.5V带输出寄存器的8位移位寄存器技术解析

    Texas Instruments SN74LV594A/SN74LV594A-Q1 8位并行输出串行移位寄存器设计采用2V至5.5V V~CC~ 运行。SN74LV594A-Q1符合汽车应用类
    的头像 发表于 09-02 09:42 1164次阅读
    SN74LV594A:<b class='flag-5'>2</b>-5.5V带输出<b class='flag-5'>寄存器</b>的8位移位<b class='flag-5'>寄存器</b>技术解析

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

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