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

    文章

    5588

    浏览量

    129051
  • usb
    usb
    +关注

    关注

    60

    文章

    8372

    浏览量

    281653
  • dma
    dma
    +关注

    关注

    3

    文章

    577

    浏览量

    105343
  • 驱动开发
    +关注

    关注

    0

    文章

    138

    浏览量

    12526
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

    ‌SN74HCT595 8位移位寄存器技术解析与应用指南

    Texas Instruments SN74HCT595/SN74HCT595-Q1 8位移位寄存器包含8位串进并出移位寄存器,向8位D类存储寄存器馈送信号。存储寄存器具有并行 3 状
    的头像 发表于 09-19 14:31 568次阅读
    ‌SN74HCT595 8位移位<b class='flag-5'>寄存器</b>技术解析与应用指南

    TPIC6595 8位功率移位寄存器技术文档摘要

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

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

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

    ‌TLC6C5912 12通道移位寄存器LED驱动器技术文档总结

    该TLC6C5912是一款单片、中压、低电流功率 12 位移位寄存器 设计用于需要相对中等负载功率的系统,例如 LED。 该器件包含一个 12 位串行输入并行输出移位寄存器,可为 12 位馈电
    的头像 发表于 08-26 14:16 753次阅读
    ‌TLC6C5912 12通道移位<b class='flag-5'>寄存器</b>LED<b class='flag-5'>驱动器</b>技术文档总结

    Texas Instruments SN74LV8T594/SN74LV8T594-Q1移位寄存器特性/应用/框图

    器件输出(QA至QH)。为移位寄存器和存储寄存器提供单独的时钟(SRCLK和RCLK)和直接覆盖清除(SRCLR和RCLR)输入,允许数据单独加载,而不会发送至输出。此外,内部移位寄存器
    的头像 发表于 08-03 10:56 800次阅读
    Texas Instruments SN74LV8T594/SN74LV8T594-Q1移位<b class='flag-5'>寄存器</b>特性/应用/框图

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

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

    使用寄存器点亮LED灯

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

    如何用C语言操作寄存器——瑞萨RA系列FSP库开发实战指南(10)

    由于寄存器的数量是非常之多的,如果每个寄存器都用像*((uint32_t*)(0x40080000+0x0020*1))这样的方式去访问的话,会显得很繁琐、很麻烦。为了更方便地访问寄存器,我们会借助C语言结构体的特性去定义
    的头像 发表于 04-22 15:30 1658次阅读
    如何用C语言操作<b class='flag-5'>寄存器</b>——瑞萨RA系列FSP库<b class='flag-5'>开发</b>实战指南(10)

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

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

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

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

    STM32驱动ADS7952时怎么配置AD的寄存器

    在STM32驱动ADS7952时不懂怎么配置AD的寄存器,不知道发送什么数据偶去才能使它工作,PDF看不懂,貌似要发很多次不同的数据,请尽快求解
    发表于 01-02 07:08

    TPS80032寄存器手册

    电子发烧友网站提供《TPS80032寄存器手册.pdf》资料免费下载
    发表于 12-21 09:08 0次下载
    TPS80032<b class='flag-5'>寄存器</b>手册