NXP EDMA学习(1):TCD寄存器详解

eDMA(Enhanced DMA)即增强型DMA,它是NXP芯片中独有的功能,其最重要的一个特性也是eDMA的核心就是TCD(Transfer Control Descriptor)即传输控制描述符。所以,我们就来看一下这个结构体中各个字段的内容的含义,对这些字段有一个基础印象,这样在后续代码中使用到的时候才不会摸不着头脑,到时候再回来看这些寄存器的定义也能理解地更加深刻。


每一个DMA通道都需要一个32字节的TCD来决定每次的数据传输操作,每个TCD都按DMA通道0~15的顺序保存在内存中。
在这里插入图片描述
图中出现的寄存器的含义如下:

1、SADDRSOFF

Field(DMA_TCDn_XXX)Description
SADDR(Souce address)源地址
SOFF(Source address signed offset)在读取完一次源地址中的数据后,源地址的偏移(有符号)

2、TCD Transfer Attributes

ATTR(TCD Transfer Attributes)TCD传输属性寄存器,包含以下4个字段
SMOD[15:11] (Source Address Modulo)源地址的模(顾名思义,可以用来实现循环缓冲区):该字段为0为disable,非0时该值可以理解为循环缓冲区的长度所占的位数,SOFF设置为循环缓冲区的长度
SSIZE[10:8] (Source data transfer size)源数据传输大小(8/16/32bit或16/32 byte burst),其中burst传输是防止使用DMA FIFO时最后合并数据时被打断
DMOD[7:3] (Destination Address Modulo)目标地址的模,同SMOD
DSIZE[2:0] (Destination data transfer size)目标数据传输大小,同SSIZE

3、TCD Minor Byte Count

该字段分为三种情况,分别为失能次循环映射、使能次循环映射但没有使用和使能次循环映射且使用,不同情况下寄存器中各个位的含义都不同

(1)失能minor loop mapping(CR[EMLM]=0)

DMA_TCDn_NBYTES_MLNODescription
NBYTES[31:0] (Minor Byte Transfer Count)每次请求DMA后传输的字节数,当该值减为0后,SADDR和DADDR的值会重新写入TCD中,主循环计数也减一并保存到TCD中,如果主循环计数减到0,则会执行其他操作

(2)使能minor loop mapping(CR[EMLM]=1)

此时有两种情况:使用和不使用次循环映射,使用与否是通过设置0008H的最高两位的两个字段SMLOEDMLOE来判断的。

FieldDescription
SMLOE[31] (Source Minor Loop Offset Enable)是否在每次次循环完成后将次循环的偏移量加到源地址SADDR上
DMLOE[30] (Destination Minor Loop Offset Enable)是否在每次次循环完成后将次循环的偏移量加到目标地址DADDR上

SMLOE=0DMLOE=0

DMA_TCDn_NBYTES_MLOFFNODescription
NBYTES[29:0] (Minor Byte Transfer Count)同前面NBYTES的描述

SMLOE=1DMLOE=1

DMA_TCDn_NBYTES_MLOFFYESDescription
MLOFF[29:10]在每次次循环完成后,源地址或目标地址的偏移量(有符号)
NBYTES[29:0] (Minor Byte Transfer Count)同前面NBYTES的描述

4、SLASTDADDRDOFF

Field(DMA_TCDn_XXX)Description
SLAST(Last Souce Address Adjustment)在每次主循环完成后,源地址的偏移量(该寄存器用补码来表示正负数)
DADDR(Destination Address)目标数据的地址
DOFF(Destination Address Signed Offset)每次目标写操作完成后,目标地址的偏移量(有符号)

5、TCD Current Minor Loop Link, Major Loop Count(TCDn_CITER寄存器)

该寄存器的最高位为ELINK

FieldDescription
ELINK[15] (Enable to-channel linking on minor-loop complete)当一个DMA通道完成了次循环,它可以链接到另一个通道。1为使能通道链接,0为失能。

(1)ELINK=1

此时TCDn_CITER寄存器也称为DMA_TCDn_CITER_ELINKYES寄存器,除了最高位ELINK外的字段如下:

DMA_TCDn_CITER_ELINKYESDescription
Reserved[14:13]保留
LINKCH[12:9] (Minor Loop Link Channel Number)在次循环完成后,eDMA引擎通过设置TCD_CSR的START位来初始化一个通道服务来请求链接通道,该通道号由此字段指定
CITER[8:0] (Current Major Iteration Count)表示当前DMA通道的主循环计数

(2)ELINK=0

此时TCDn_CITER寄存器也称为DMA_TCDn_CITER_ELINKNO寄存器,除了最高位ELINK外的字段如下:

DMA_TCDn_CITER_ELINKYESDescription
CITER[14:0] (Current Major Iteration Count)表示当前DMA通道的主循环计数

6、TCD Last Destination Address Adjustment/Scatter Gather Address

DMA_TCDn_DLASTSGADescription
DLASTSGA[31:0] (Destination last address adjustment or the memory address for the next transfer control descriptor to be loaded into this channel i.e. scatter/gather)当ESG位(下面介绍)为0时,该字段表示主循环完成后加到目标地址的值(改字段用补码来表示正负数);当ESG位为1时,该地址指向一个32位的TCD,用于每次主循环结束时重新加载此TCD到内存中(scatter/gather模式)

7、TCD Control and Status

DMA_TCDn_CSRDescription
BWC[15:14] (Bandwidth Control)控制eDMA消耗的总线带宽,通常在进行次循环时,会一直执行到计数值为0,而该字段可以在次循环的每一次读写完成后暂停
Reserved[13:12]保留
MAJORLINKCH[11:8] (Major Loop Link Channel Number)主循环链接通道号,0为不使用通道链接,否则在每次主循环计数器减为0时,eDMA引擎通过设置START位来初始化一个通道服务来请求链接通道
DONE[7] (Channel Done)指示eDMA完成了主循环,在CITER计数减为0时置位。向该位写0可以清除该位,或者在每次激活通道时由硬件清除
ACTIVE[6] (Channel Active)指示DMA通道是否正在执行数据搬运,在通道服务开始时置位,在次循环完成后或产生任意错误后清零
MAJORELINK[5] (Enable channel-to-channel linking on major loop complete)当主循环完成后,若该字段设为1则允许连接到另一个通道,通道号由MAJORLINKCH指定。目标通道会在START位置位后,初始化通道服务请求
ESG[4] (Enable Scatter/Gather Processing)使能Scatter/Gather特性,当主循环完成后,将加载DLASTSGA指向的TCD到实际通道的TCD内存中
DREQ[3] (Disable Request)当该位为1时,eDMA硬件会在主循环计数减为0时清除DMA_ERQ中对应通道的位来关闭DMA请求
INTHALF[2] (Enable an interrupt when major counter is half complete)当该位为1时,在主循环计数到一半时产生一个中断(需要打开相应中断掩码)
INTMAJOR[1] (Enable an interrupt when major iteration count completes)当该位为1时,在主循环计数到0时产生一个中断(需要打开相应中断掩码)
START[0] (Channel Start)当设置该位为1时,DMA通道开始请求服务,在DMA通道开始执行后,该位被硬件置1

8、TCD Beginning Minor Loop Link, Major Loop Count(TCDn_BITER寄存器)

该寄存器的最高位与TCDn_CITER一样为ELINK

FieldDescription
ELINK[15] (Enable to-channel linking on minor-loop complete)当一个DMA通道完成了次循环,它可以链接到另一个通道。1为使能通道链接,0为失能。注意:当软件更改TCD时,该字段必须等于CITER中对应的字段;当主循环计数完成后,该字段的值会加载到CITER中

(1)ELINK=1

此时TCDn_BITER寄存器也称为DMA_TCDn_BITER_ELINKYES寄存器,除了最高位ELINK外的字段如下:

DMA_TCDn_BITER_ELINKYESDescription
Reserved[14:13]保留
LINKCH[12:9] (Minor Loop Link Channel Number)在次循环完成后,eDMA引擎通过设置TCD_CSR的START位来初始化一个通道服务来请求链接通道,该通道号由此字段指定
BITER[8:0] (Starting Major Iteration Count)表示当前DMA通道的开启主循环计数。当软件更改TCD时,该字段必须与CITER中对应的字段相同;当主循环计数完成后,该字段的值会被加载到CITER中
  • BITER(初始主次循环计数寄存器)就是在每次主循环计数结束后加载到CITER(当前主次循环计数寄存器)中

(2)ELINK=0

此时TCDn_BITER寄存器也称为DMA_TCDn_BITER_ELINKNO寄存器,除了最高位ELINK外的字段如下:

DMA_TCDn_BITER_ELINKYESDescription
CITER[14:0] (Current Major Iteration Count)表示当前DMA通道的主循环计数,当软件更改TCD时,该字段必须与CITER中对应的字段相同;当主循环计数完成后,该字段的值会被加载到CITER中
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
引用\[1\]中的代码片段展示了在DSP6678上使用EDMA进行数据传输的部分代码。在这段代码中,首先打开指定的QDMA通道,并将其映射到指定的参数入口。然后获取参数入口句柄,并使用paramSetup信息配置参数入口。最后,使能指定的通道进行数据传输。 引用\[2\]中提到了Parameter RAM(PaRAM),它用于维护通道和重载参数集的参数设置条目。需要将PaRAM写入所需通道和链接参数集的传输上下文。 引用\[3\]中提到了在使用EDMA进行数据传输时可能遇到的缓存一致性问题。由于EDMA是独立于CPU的功能模块,CPU并不知道EDMA在搬运数据。因此,可能会出现缓存中的数据与DDR中的数据不一致的情况。为了解决这个问题,可以使用Cache_Invalid函数将DDR对应的Cache置为无效,或者使用Cache回写函数将Cache中的数据回写到DDR中,以保持DDR和Cache的一致性。 综上所述,DSP6678上的EDMA是一种用于数据传输的功能模块。通过配置参数和映射通道,可以实现高效的数据传输。在使用EDMA时,需要注意缓存一致性问题,以确保数据的正确性。 #### 引用[.reference_title] - *1* [C6678学习-EDMA](https://blog.csdn.net/g360250466/article/details/130473874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [DSP篇--C6678功能调试系列之EDMA3调试](https://blog.csdn.net/nanke_yh/article/details/128156123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [TMS320C6678 EDMA传输配置](https://blog.csdn.net/HSU0911/article/details/117984837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值