英飞凌 Aurix2G TC3XX DMA 模块详解

英飞凌 Aurix2G TC3XX DMA 模块详解

本文主要介绍 Infineon Aurix2G TC3XX 系列芯片 DMA 模块硬件原理,以及MCAL相关配置,和部分代码实现。


1 模块介绍

直接存储器访问(Direct Memory Access,DMA)是计算机系统中的一种机制,允许外部设备(如硬盘驱动器、网络适配器等)直接访问系统内存,而无需通过中央处理器(CPU)的干预。这可以提高数据传输的效率,因为数据可以直接在设备和内存之间传输,而不必通过 CPU 来中转。 DMA 通常用于大容量数据传输,如文件传输、网络数据包处理等。

Aurix2G TC3XX 系列中 DMA 模块不仅能够实现内存之间的数据搬运,还能支持外设数据的搬运,比如利用 DMA 进行 SPI 数据的异步发送。

2 功能介绍

2.1 模块总览

我们来通过框图看 DMA 整体结构。
在这里插入图片描述

DMA 的整体结构还是比较简单的,首先看左下角的 Configuration Interface,我们通过访问外设寄存器完成对 DMA 的配置;然后是上面的 DMA Channels,里面存放所有 DMA 通道的属性;当存在软硬件搬运请求时,DMA 模块会对请求队列进行仲裁,然后通过右边的 Move Engine 与内存总线进行交互,完成搬运。

DMA 模块同样也会产生不同类型的中断,发送到中断路由模块。而中断路由模块可以将所有其他模块的中断信号路由到 DMA 作为硬件触发信号。

这里我们需要先了解一些缩写:

  • CH:Channel,DMA 通道;
  • ME:Move Engine,搬运引擎,负责与总线交互进行数据搬运;
  • RP:Resource Partition,资源分区,DMA 支持分区权限管理,每个 RP 有指定的权限和内存区域,每个 RP 有自己的错误中断;
  • TCS:Transaction Control Set,交换控制集;

和一些术语:

  • DMA Hardware Request:由中断路由模块发起的搬运请求称为硬件请求;
  • DMA Move:DMA 数据搬运,一次 Move 包含从源地址读数据,和往目的地址写数据;
  • DMA Transfer:一个 Transfer 包含 1, 2, 3, 4, 5, 8, 9 或 16 个 Move;
  • DMA Transaction:一个 DMA Transaction 包含至少一个 Transfer;
  • Linked List:一个链表包含同一个通道的多个 Transaction;

所以 DMA 的一般结果是 Transaction 包含 TransferTransfer 包含 MoveMove 是数据处理的最小颗粒度;而 Transfer 是触发的最小颗粒度,也就是说你可以选择一次请求触发一次 Transaction,或者只触发一个 Transfer。如果你想搬运的数据并非连续或者规则的,比如有两块比较远的内存,需要在一次操作中处理,这个时候你就需要配置 Linked List,一个 Linked List 包含多个 Transaction。

2.2 DMA 通道

DMA 通道的请求有 4 种:

  • DMA Software Request:软件请求,顾名思义就是软件写寄存器请求一次 DMA 搬运;
  • DMA Hardware Request:硬件请求,其他外设的中断信号发送至中断路由模块 IR,IR 将信号路由至 DMA 模块,请求一次 DMA 搬运;
  • DMA Daisy Chain Request:Daisy 链请求,比如通道 5 使能了 Daisy 链配置,那它在完成之后会触发通道 4 的搬运请求;
  • DMA Auto Start Request:用于 Linked List,同一通道配置了多个 TCS,第一个 TCS 完成之后会触发下一个 TCS 的搬运请求;

然后根据请求和执行的情况,DMA 通道有不同的状态:

  • Idle State:当前通道空闲,TSR.CH=0;
  • Reset State:当前通道处于 Reset 状态,TSR.CH=0;
  • Halt State:通道处于 Halt 状态,不工作,TSR.HLTACK = 1;
  • Pending State:通道已经被请求,但是没有被服务,TSR.CH=1;
  • Active State:通道的搬运正在执行;

前面提到 DMA 搬运触发的最小颗粒度是 Transfer,通过 CHCFGR.RROAT 寄存器来配置:

  • CHCFGR.RROAT=0:每个 Transfer 搬运完成之后请求即被清除;
  • CHCFGR.RROAT=1:Transaction 中的最后一个 Transfer 搬运完成之后请求被清除;
2.2.1 DMA Software Request 软件请求

用户可以通过写寄存器进行软件搬运请求,在进行软件请求的时候需要通过将 TSR.DCH 写 1 关闭硬件请求。

软件请求的搬运流程如下图所示,图中有两个部分,区别在于 CHCFGR.RROAT。
在这里插入图片描述

我们可以看到,图中上部分的搬运流程中,CHCFGR.RROAT=1,当软件进行一次请求后,硬件会装载 Transfer Count 寄存器的值 CHSR.TCOUT,然后开始搬运,每搬运一个 Transfer 之后 CHSR.TCOUNT 的值便会减一,当 TCOUT 的值为 0 之后搬运完成,会向中断路由模块发送 DMA 通道搬运完成中断

下部分的搬运流程中 CHCFGR.RROAT=0,这里仅有的区别是每次请求只执行一次 Transfer 的搬运。

2.2.2 DMA Hardware Request 硬件请求

硬件请求相对于软件请求多了一个硬件使能的相关配置,我们可以设置 TSR.ECH=1 来使能硬件请求,或者设置 TSR.DCH=1 来关闭硬件请求,通过只读寄存器 TSR.HTRE 查看中断使能状态。

另外还有一个重要的配置是 CHCFGR.CHMODE,当 CHMODE=0 时,为单次模式,每次 Transaction 完成之后硬件使能会被自动关掉,需要手动再打开,否则硬件请求不会被处理;当 CHMODE=1 时,则为连续模式,不会关闭硬件请求使能。

关于硬件请求,需要在中断模块中进行配置,把其他外设的中断信号路由到 DMA(SRC.TOS 选择 DMA),优先级 SRC.SRPN 设置为对应的 DMA 通道号即可。

其他方面就和软件请求一样了,我们来看搬运流程图。
在这里插入图片描述

图中的两个转换流程都是单次模式,在上面的搬运流程中 CHCFGR.RROAT=1,需要先使能硬件请求,然后一个硬件搬运请求触发后,会完成整个 Transaction,同样的 TCOUNT 会自动递减,归零后触发 DMA 通道完成中断。

下面的搬运流程中 CHCFGR.RROAT=0,每次硬件请求只会完成一次 Transfer,需要不停地触发;一个 Transaction 中的所有的 Transfer 完成之后硬件请求使能会被关闭。

连续模式下与上面的描述只有一个区别,就是硬件请求使能不会被硬件关闭,后续的硬件请求能够连续执行。

2.2.3 DMA Daisy Chain Request Daisy 链请求

用户可以通过设置 CHCFGR.PRSEL 来配置 Daisy 链。当一个通道配置了 Daisy 链使能,在它的 Transaction 完成之后,会自动请求相邻的低优先级的通道搬运(DMA 通道号即优先级,越高优先级越高)。所以我们可以通过对多个相邻的 DMA 通道配置使能 Daisy 链,完成多个 DMA 通道搬运的链式触发。

另外在配置 Daisy 过程中,除了最低优先级的通道以外,其他通道需要关闭中断使能,仅最后一个通道使能中断,也就是说,中断需要在 Daisy 链全部完成之后触发。

2.2.4 通道请求丢失中断

在以下两种情况下,会发生中断请求丢失(DMA Channel Transaction/Transfer Request Lost,TRL)事件:

  • 当一个通道处于 Pending 状态(TSR.CH=1)时收到了通道请求;
  • 当一个通道未使能硬件请求,但是收到了硬件搬运请求;

发生 TRL 之后 TSR.TRL 会置位,如果此时使能了所在 RP 的错误中断(TSR.ETRL=1),则会触发所在 RP 的错误中断。
在这里插入图片描述

2.2.5 请求仲裁

DMA 仲裁单元会对所有处于 Pending 状态的通道进行仲裁,然后选择其中通道号最高的通道处理。如果有当前正在搬运的 Transaction,而出现了高优先级的通道的 Transaction,则会打断低优先级的,但是打断的最小颗粒度是 Transfer,也就是正在处理的 Transfer 会完成。

Aurix2G 的 DMA 模块有两个 Move Engine,它们和通道的关系不是绑定的,而是选择空闲的使用,仲裁胜出的通道会优先送往 Engine1,如果非空闲则选择 Engine0。

2.3 搬运流程

当仲裁完成之后,DMA 通道请求就会送到 Move Engine 去进行数据搬运,前面我们提到,Transaction 包含多个 Transfer,Transfer 包含多个 Move,而 Move 是搬运的最小颗粒度,也就是说,ME 是按照 Move 逐个操作的,Move 中定义源地址、目的地址,地址偏移等信息。
在这里插入图片描述

DMA 的搬运源地址通过 CHx.SADR 寄存器设置,目的地是通过 CHx.DADR 设置。DMA 每个 Move 在完成之后,源地址和目的地址都可以进行偏移,以支持我们搬运连续的内存空间,当然也可以原地保持不变,循环搬运。源地址和目的地址的偏移都是独立计算的。

地址的偏移有两种,一种是递增或递减,每次以固定的偏移值进行调节;另一种就是循环 Buffer。

2.3.1 地址偏移模式

如果我们需要搬运的数据,它的地址是不连续的,比如 ADC 采样的结果寄存器,每个结果寄存器我们只需要前 16 个 Bit,而我们可能需要多个通道的采样结果,那我们就需要通过设置 Move 的地址偏移,来进行搬运。

我们需要通过 CHCFGR.CHDW 设置 Move 的搬运宽度,数据宽度 DataWidth=8*2^CHDW,单位是 Bit,最大支持 256Bit。在地址偏移模式中,每次 Move 完成之后偏移的地址值,是数据宽度的整倍数。

通道地址控制寄存器 ADICR 中包含了源地址、目的地址的偏移参数:

  • SMF:Source Address Modification Factor,源地址偏移参数;
  • INCS:Increment of Source Address,源地址偏移方向,递增或递减;
  • DMF:Destination Address Modification Factor,目的地址偏移参数;
  • INCD:Increment of Destination Address,目的地址偏移方向,递增或递减;

在地址偏移模式中,以上 4 个参数定义了地址偏移的格式。它的算法是这样的,偏移值=2^SMF*DataWidth,INCS 为 1 就是增加,INCS 为 0 就是减(源地址和目的地址相同算法相同)。我们可以看下面这个实例:
在这里插入图片描述

在这个示例中,搬运 Move 的数据宽度为 16Bit,源地址的 SMF=3,INCS=1,则每次搬运之后地址增加2^316=128Bit。而目的地址 DMF=2,INCD=0,那每次搬运之后地址减少2^216=64Bit。

我们再来看下一个示例,它将一段连续地址空间的数据搬运到带间隙的地址空间上去。
在这里插入图片描述

这个示例中的数据宽度同样也是 16bit,源地址的 SMF=0,INCS=1,所以每次搬运之后地址增加 2^016=16Bit,也就是没有间隙,依次读取数据。而目的地址的 DMF=1,INCD=1,所以每次搬运之后地址增加 2^116=32Bit,实现了间隙式搬运。

这里需要注意的是,在一个 Transaction 搬运完成之后,源地址和目的地址并不会重置,而是停留在最后一次搬运所指向的地址,如果要开启新一轮的搬运,则需要重新再设置地址。

2.3.2 循环 Buffer 模式

循环 Buffer 模式,和地址偏移模式的区别,就是增加了一个地址空间的上下限,超过这个限制就会按照设定的方向滚动。

同样我们需要在 ADICR 寄存器中设置相关参数,除了地址偏移模式的位域以外,还有以下位域:

  • CBLS:Circular Buffer Length Source,源地址循环 Buffer 尺寸;
  • CBLD:Destination Circular Buffer Enable,目的地址循环 Buffer 尺寸;
  • SCBE:Source Circular Buffer Enable,源地址循环 Buffer 使能;
  • DCBE:Destination Circular Buffer Enable,目的地址循环 Buffer 使能;

首先我们按照需求来使能源地址或者目的地址的循环 Buffer,然后和偏移地址模式一样设置我们的偏移参数,最后通过 CBLS 或 CBLD 设置我们的 Buffer 尺寸。Buffer 尺寸为 2^CBLS,单位为 Byte,最大为 64kByte。

举个例子,比如我源地址为 0x7000CC40,CBLS=4,则循环 Buffer 尺寸为 2^4=16Byte,在搬运完 0x7000CC4C~0x7000CC4F 的 4 字节之后(每个 Move 4字节),源地址回到 0x7000CC40。

另外如果想要地址保持不变,则设置 CBLS 为 0 即可。

这里有一个需要注意的地方是,Buffer 的上下限必须是按 Buffer 尺寸字节对齐的,比如 Buffer 尺寸为 16 字节,则源地址必须为 16 字节对齐,如果源地址为 0x7000CC44,则前 4 个字节不会被搬运。

3 MCAL 配置示例

下面我们结合示例来说明 DMA 模块的原理,以及在 MCAL 中的相关配置。本实例是通过软件触发,把一块内存的数据搬运到另一块内存中。

3.1 DMA General

General 界面没有什么特别的配置,一般都是软件相关接口使能。
在这里插入图片描述

3.2 Channel General

我们来到 Channel 之后,首先是一页 General 配置,这里配置通道的基本属性,比如通道 ID 等。
在这里插入图片描述

用户也可以配置 Notification 函数,在 DMA 完成中断中会触发该函数。

3.3 DmaChannelTransactionSet

TransactionSet 这里是通道的详细配置,包括刚才提到的转换配置,地址偏移等,我们一个个介绍。
在这里插入图片描述

  • DmaTcsIndex:这个参数是 Transaction 的 Id,如果通道中只有一个,就是 0 就可以,如果有 Linked List,存在多个 Transaction,就需要依次排序;

  • DmaTcsSourceAddress & DmaTcsDestinationAddress:搬运的源地址和目的地址,这里可以使用地址值,也可以使用变量、寄存器名等,但是前提是下面的头文件引用能够包含该信息;

  • DmaUserHeaderFileWithExternDeclarations:引用头文件;

  • DmaTcsMoveLength:Move 搬运的数据宽度,这里我们一次搬运 32bit;

  • DmaPatternMode:数据匹配模式,能够进行数据匹配,这里未使用;

  • DmaTcsTransferLength:一个 Transfer 中 Move 的数量;这里我们选择 1;

  • DmaTcsTransactionLength:一个 Transaction 中 Transfer 的数量,这里我们配置 4;
    在这里插入图片描述

  • DmaTcsCircularBufferSourceEnable:源地址循环 Buffer 使能;

  • DmaTcsCircularBufferDestinationEnable:目的地址循环 Buffer 使能;

  • DmaTcsCircularBufferSourceLength:源地址循环 Buffer 尺寸,这里我们配置 16 字节循环;

  • DmaTcsCircularBufferDestinationLength:目的地址循环 Buffer 尺寸,这里我们配置 16 字节循环;

  • DmaTcsSourceAddressModificationFactor:源地址偏移值,这里我们配置 1 个 Move 宽度,不留间隙;

  • DmaTcsDestinationAddressModificationFactor:目的地址偏移值,这里我们配置 1 个 Move 宽度,不留间隙;

  • DmaTcsAppendTimeStamp:时间戳功能,不使用;

  • DmaTcsSourceAddressMovement:源地址偏移方向,这里配置为增加;

  • DmaTcsDestinationAddressMovement:目的地址偏移方向,这里配置为增加;

  • DmaTcsShadowRegisterConfiguration:影子寄存器配置,未使用;

  • DmaTcsTriggerFrequency:Transaction 触发频率,也就是选择一次触发是完成一个 Transfer 还是完成一个 Transaction,这里配置为 Transaction;

  • DmaTcsHardwareTrigger:是否使用硬件触发,单次还是连续;

  • DmaTcsDaisyChaining:是否配置为 Daisy 链,如果勾选则完成后触发相邻的低通道的请求,这里不使用;

3.4 示例代码

示例代码这里我们还是使用 Infineon 原厂 MCAL 代码,首先是模块初始化:

Dma_Init(&Dma_Config);

然后我们声明转换需要的源数据和目的数据,这里 Buffer 为 16 字节,所以我加了对齐:

#pragma align 16
uint32 DmaTestSrc[DMATEST_BUFFERLEN];
uint32 DmaTestDes[DMATEST_BUFFERLEN];
#pragma align restore

然后就在运行过程中请求转换就可以了:

Dma_ChStartTransfer(19);    /* 入参为通道号 */

然后我们调试看结果,我这里 DmaTestSrc 源地址为 0x7000CC40,目的地址 DmaTestDes 为 0x7000CC30。启动后将源数据进行了初始化:

在这里插入图片描述

然后我们启动一次转换,可以看到执行了 4 个 Transfer,16 字节数据全部搬运:

在这里插入图片描述

4 小结

本文介绍了 Infineon Aurix2G DMA 模块的硬件原理和搬运流程,对搬运的数据结构和地址逻辑进行了说明,最后通过实例展示了 DMA 模块的 MCAL 配置和使用方法,为读者进行实操提供了参考。

参考资料

  1. Infineon-AURIX_TC3xx_Part1-UserManual-v02_00-EN.pdf

写在最后:若大家有任何问题或建议,欢迎关注公众号【TechLink汽车软件】,在后台留言与我们交流。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值