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

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

3天内不再提示

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

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

本文转自公众号,欢迎关注

基于DWC2的USB驱动开发-发送相关的寄存器DMA寄存器详解 (qq.com)

前言

如下寄存器DIEPxxx,对应IN端点,和发送数据相关,这一篇先介绍和DMA相关的两个寄存器,其他的后续再讲,

并且通过观察其寄存器的实际值的变化来加深理解。

了解这些值的含义以及何时如何变化,可以在有问题时帮助进行调试,知道当前出于何种状态。

以下实例是以Scatter/Gather DMA模式IN端点1进行操作

寄存器的地址偏移分别是

0x900+i*0x20

0x908+i*0x20

0x910+i*0x20

0x914+i*0x20

0x918+i*0x20

0x91C+i*0x20

图片

DIEPDMA****i

寄存器偏移:0x914 + i*20

Scatter/Gather DMA模式时该寄存器的值即用户指定的描述符链表的地址

非Scatter/Gather DMA时该寄存器的值即用户指定的DMA待发送数据的地址。

必须DWORD即8字节对齐。

比如这里描述符链表使用了全局数组,用attribute指定对齐大小

attribute ((aligned(8))) static uint32_t s_dam[1024][2];

注意该寄存器在每次处理完描述符后会递增,用户可以通过该寄存器判断DMA是否进行了描述符的处理。

注意该寄存器需要CTL寄存器ENA置位后才能回读否则读到的是0.

我们以一个实例来看该寄存器值的变化,以下是关键代码,即准备一次DMA发送,前面描述符的准备过程不在这里贴出。

void ep_writedma(uint32_t dma, uint8_t epnum)
{
  REG_DIEP_DMA(epnum) = dma;
  REG_DIEP_CTL(epnum) |= (DEP_ENA_BIT | DEP_CLEAR_NAK);
}

以下是执行REG_DIEP_DMA(epnum) = dma;前,寄存器DIEPDMA1的值为0

传入的参数即描述符链表的地址是0x81008d8是8字节的对齐的

此时a0为0x81008d8,即我们的描述符链表的地址

a4为寄存器地址0x3000934,sw a0,0(a4) 即将0x81008d8写入寄存器0x3000934
图片

注意在CTL寄存器使能端点之前是不能回读该寄存器的值的,如下为0

执行完sw语句再来看,此时DIEPDMA1还是0

图片

在执行完使能,CTL寄存器的ENA置位后才能看到,如下此时看待DIEPDMA1的值变为了0x08100968,为什么不是写入的0x81008d8呢,也就时之前说的,ENA一置位,DMA就会去处理该描述符,0x08100968-0x81008d8=0x90=144 ,144/8=18个描述符(一个描述符2个WORD8字节)。

图片

那么为什么该寄存器值递增了这么多呢

那是因为我们这里配置p_dam就是配置了18个描述符,如下18个DWORD,所以可以看到如下18个描述符一起处理完了,最后一个描述符标志了是最后一个。

图片

DIEPDMABi

寄存器偏移:0x91C + i*20

该寄存器只有Scatter/Gather DMA模式有效,非Scatter/Gather DMA模式,DIEPDMAi就是用户缓冲区的地址,也就是Scatter/Gather DMA模式的本寄存器。

用于指示当前正在处理的用户缓冲区的地址,DMA处理完指定缓冲区后就会更新。

所以从该寄存器可以看到是否处理了用户的缓冲区数据。

同样是CTL的ENA置位后,处理完描述符后更新,从以下可以看出最后一个描述的用户数据缓冲区地址为0x8704400长度为0x3C1,所以处理完后DIEPDMAB1更新为了0x87047C1

图片

总结

这里重点讲解了DMA相关的两个寄存器,主要是他们可以协助分析数据发送,比如有时候数据没有发出,可以从这里看出是否处理了描述符,是否处理了用户数据,来协助判断当前状态。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117719
  • usb
    usb
    +关注

    关注

    59

    文章

    7432

    浏览量

    258136
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99019
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-0x06 DWC2 USB2.0 IP 头文件与寄存器的读写操作

    上一篇我们介绍了控制器的寄存器,而驱动的编写底层无非就是配置各种寄存器,所以第一步先要准备寄存器的头文件,对寄存器的操作进行封装。 我们这
    的头像 发表于 05-16 14:04 2003次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x06 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP 头文件与<b class='flag-5'>寄存器</b>的读写操作

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

    上一篇我们介绍了IN端点,发送DMA相关的两个寄存器,这一篇继续讲另外的几个寄存器
    的头像 发表于 07-17 07:41 948次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-IN端点<b class='flag-5'>发送</b><b class='flag-5'>相关</b>的<b class='flag-5'>寄存器</b><b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-DOEP接收相关的其他寄存器详解

    前面介绍了DOEP的DMA相关寄存器,这一篇继续来讲剩下的寄存器
    的头像 发表于 07-19 10:50 967次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-DOEP接收<b class='flag-5'>相关</b>的其他<b class='flag-5'>寄存器</b><b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-0x05 DWC2 USB2.0 IP 寄存器介绍

    本文对控制器的寄存器有了一个整体上的概览,先了解个大概,了解寄存器的组织结构,大致了解一下常用的寄存器。后面编程时再一个个对照每一个寄存器的描述去编写代码。
    的头像 发表于 05-16 12:50 2047次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x05 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP <b class='flag-5'>寄存器</b>介绍

    基于DWC2USB驱动开发-0x0D PHY寄存器读写代码编写与测试

    我们前面重点介绍了ULPI接口和PHY的寄存器,这一篇来进行PHY寄存器读写的代码编写与测试。从这一篇开始就正真进入了驱动编写的过程了。
    的头像 发表于 06-06 13:03 1242次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x0D PHY<b class='flag-5'>寄存器</b>读写代码编写与测试

    基于DWC2USB驱动开发-DOEP接收相关DMA寄存器详解

    前面我们详细介绍了发送即DIEP相关的一些寄存器,这一篇我们来看看接收即DOEP相关的一些寄存器。形式上DOEP和DIEP
    的头像 发表于 07-19 09:00 699次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-DOEP接收<b class='flag-5'>相关</b>的<b class='flag-5'>DMA</b><b class='flag-5'>寄存器</b><b class='flag-5'>详解</b>

    基于DWC2USB驱动开发-控制传输中断相关寄存器

    本篇讲解Scatter/Gather DMA模式下控制传输相关寄存器。控制传输是USB驱动的核心部分,控制传输调通了
    的头像 发表于 07-24 00:07 1303次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-控制传输中断<b class='flag-5'>相关</b><b class='flag-5'>寄存器</b>

    编程寄存器相关详解

    目录一,涉及编程寄存器相关详解二,源代码及解析:三,时钟设置的框图步骤分解stm32上电后默认使用的是内部8MHZ的HSI,速度比较慢,所以上电后要首先进行时钟的配置,让CPU工作在72MHZ
    发表于 08-12 06:41

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定义  寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用
    发表于 03-08 14:26 2.1w次阅读

    数据寄存器,数据寄存器是什么意思

    数据寄存器,数据寄存器是什么意思 数据寄存器数据寄存器包括累加器AX、基址寄存器BX、计数寄存器
    发表于 03-08 14:38 1.2w次阅读

    ARM寄存器详解

    ARM有37个寄存器,其中31个通用寄存器,6个状态寄存器。   这里尤其要注意区别的是ARM自身寄存器和它的一些外设的寄存器的区别。
    发表于 07-10 10:04 2645次阅读

    DSP2812寄存器详解

    DSP2812寄存器详解DSP2812寄存器详DSP2812寄存器详解
    发表于 01-08 14:17 8次下载

    51寄存器的所有寄存器名称,(包括寄存器每一位的作用及用法)资源详解

    51寄存器的所有寄存器名称,(包括寄存器每一位的作用及用法)资源详解
    发表于 10-16 13:04 14次下载
    51<b class='flag-5'>寄存器</b>的所有<b class='flag-5'>寄存器</b>名称,(包括<b class='flag-5'>寄存器</b>每一位的作用及用法)资源<b class='flag-5'>详解</b>

    移位寄存器怎么用_如何使用移位寄存器_移位寄存器的用途

    移位寄存器是一个具有移位功能的寄存器,是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移。本文主要介绍了移位寄存器的用途以及移位寄存器
    发表于 12-22 15:49 1.9w次阅读

    工程监测无线中继采集仪的寄存器(参数)汇总详解

    工程监测无线中继采集仪的寄存器(参数)汇总详解 工程监测无线中继采集仪 一、 寄存器(参数)汇总 无线中继采集发送仪有很多参数(寄存器),对
    的头像 发表于 05-19 10:39 371次阅读
    工程监测无线中继采集仪的<b class='flag-5'>寄存器</b>(参数)汇总<b class='flag-5'>详解</b>