打印
[通用 MCU]

TC3XX之DMA

[复制链接]
299|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DM, DMA, tc, xx
18 Direct Memory Access (DMA)
直接存储器访问(DMA,如图 190 所示)应在无需中央处理器(CPU)干预的情况下将数据从源模块移动到目标模块。



18.1 Feature List
DMA(直接存储器访问)是一个快速且灵活的 DMA 控制器,具有以下特征:

资源分区

一个运行一组特定数据移动功能的应用程序不应受到另一个运行不同数据移动功能的应用程序的干扰。
每个资源分区(RP)通过启用单独的主标签标识符来实现独立的访问启用控制,使该标识符能够对 RP 和分配的 DMA 通道进行写访问。
在 DMA 传输期间,每个 RP 都有一个唯一的主标签标识符被驱动到片上总线上。
每个 RP 以超级用户或用户模式执行片上总线访问。
DMA 通道

DMA 支持多个独立的 DMA 通道。
每个 DMA 通道应分配给一个资源分区。
每个 DMA 通道应可单独编程。
每个 DMA 通道的传输控制状态(TCS)应存储在 DMARAM(DMA 随机存取存储器)中。
DMA 通道的源地址和目标地址指针应为 32 位宽的地址计数器。
具有灵活循环缓冲区大小的环绕缓冲区寻址模式。
DMA 通道的源和目标环绕缓冲区应是可选择的。
DMA 传输的数据宽度可编程。
双缓冲操作

DMA 事务可以从两个源或目标缓冲区之一执行读取或填充 DMA 传输。
一个控制位允许将 DMA 传输从一个缓冲区重定向到另一个缓冲区。
DMA 链表(DMALL)

当前 DMA 事务可以通过覆盖现有 DMA 通道的 TCS 将下一个 DMA 通道的 TCS 加载到 DMARAM 中。
下一个 DMA 事务可以自动启动。
DMA 通道请求控制包括以下几种方式:

DMA 软件请求:通过软件指令发起 DMA 请求。
DMA 硬件请求:由硬件事件触发 DMA 请求。
DMA 菊花链请求:以菊花链的方式依次传递 DMA 请求。
DMA 自动启动请求:满足特定条件时自动启动 DMA 请求。
移动引擎(Move Engine)具有以下特性:

任何移动引擎(ME)都应处理来自任何 DMA 通道的 DMA 请求。
移动引擎优先处理编号最高的 DMA 通道的 DMA 请求。
多个移动引擎支持并行处理 DMA 请求。
从系统资源接口(SRI)源到 SRI 目的地的数据块移动吞吐量小于每个 DMA 事务 8 兆字节的 DMA 移动。
从串行外设总线(SPB)源到 SPB 目的地的数据块移动吞吐量小于每个 DMA 事务 1 兆字节的 DMA 移动。
DMA 片上总线开关

根据源地址或目标地址,DMA 片上总线开关将 DMA 读操作和 DMA 写操作导向不同的源和目的地。
总线的移动操作具有缓冲能力(每条总线至少缓冲 1 次 DMA 移动)。
中断触发具有以下特性:

每个 DMA 通道生成一个具有唯一中断向量和优先级级别的中断触发。
每个 DMA 资源分区(RP)生成一个具有唯一中断向量和优先级级别的错误中断触发。
工作频率方面:

DMA 配置和请求控制功能以串行外设总线(SPB)时钟频率工作。
移动引擎(ME)功能以系统资源接口(SRI)时钟频率工作,以便在从 SRI 源地址到 SRI 目标地址的 DMA 移动中最大化数据吞吐量。
18.2 Overview
DMA(直接存储器访问)在无需 CPU 或其他片上设备干预的情况下将数据从源位置移动到目标位置。一次数据移动由一个移动引擎(ME)执行的活动 DMA 通道的传输控制状态(TCS)控制。DMA 通道由 DMA 请求激活。

18.3 Functional Description
18.3.1 Configuration Interface
DMA 在串行外设总线(SPB)上实现了一个符合灵活外设接口(FPI)总线协议的标准 FPI 从接口。DMA 的配置接口支持单个数据传输,不支持块传输。

18.3.2 Resource Partitions
在DMA配置过程中,每个DMA通道都要分配给一个RP。

18.3.2.1 Access Enable
每个资源分区(RP)都有其自己的访问启用保护。从设备目的地控制对其总线外设接口和内核地址空间的访问。每个具有总线主控能力的片上资源都有一个唯一的主标签标识符,用于识别片上总线事务的源。基于主标签标识符的访问保护用于启用对单个从设备地址范围的写访问。

18.3.2.2 DMA Moves
每个资源分区(RP)在 DMA 读操作或 DMA 写操作期间,都有一个唯一的主标签标识符被驱动到片上总线上。模式控制选择 DMA 在片上总线访问时是在超级用户模式还是用户模式下进行。

注意:有关片上总线主标签标识符的分配,请参阅 “片上系统连接性” 章节。

18.3.2.3 DMA RP Error Interrupt Service Request
每个资源分区(RP)生成一个错误中断服务请求,以涵盖分配给该 RP 的 DMA 通道的所有错误事件,包括移动引擎(ME)对 DMA 请求的处理:

DMA 通道传输请求丢失(TRL)中断服务请求。
ME 的源错误(SER)和目标错误(DER)中断服务请求。
ME 的 DMARAM 完整性错误中断服务请求。
ME 的链表操作传输控制状态(TCS)加载错误中断服务请求。
ME 的安全灵活链接列表(SAFLL)DMA 地址校验和错误中断服务请求。
如果触发了 DMA RP 错误中断服务请求,则软件 RP 应用程序的错误处理程序(EH)应读取错误状态寄存器的内容,以确定错误的来源。

18.3.3 DMA Channels
每个 DMA 通道都被分配给一个资源分区(RP),并存储独立 DMA 操作的上下文。

18.3.3.1 DMA Channel Request Control
DMA 通道请求控制(如图 191 所示)针对每个 DMA 通道实现。

DMA 通道操作是可单独编程的。以下类型的 DMA 请求是可能的:

DMA 软件请求,由 CPU 发起。

DMA 硬件请求,由中断路由器(IR)的中断控制单元(ICU)发起。

DMA 菊花链请求,由下一个更高优先级的 DMA 通道发起。

DMA 自动启动请求由在 DMA 链表(DMALL)、累加链表(ACCLL)、安全链表(SAFLL)或条件链表(CONLL)操作期间加载下一个传输控制状态(TCS)而发起。
DMA 通道状态标志 TSR.CH 指示是否有 DMA 请求待处理。TSR.CH 可以在 DMA 传输开始时或 DMA 事务结束时被清除。由此可见,一个 DMA 请求可能触发一次单独的 DMA 传输或一个完整的 DMA 事务。



18.3.3.1.1 DMA Channel States



18.3.3.1.2 Reset Request Only After Transaction (RROAT)
DMA 通道 TSR.CH 位的清除按如下方式控制:

当 CHCFGR.RROAT = 0B 时:

DMA 通道 TSR.CH 在每次 DMA 传输开始时被清除。
一个 DMA 请求启动一次单独的 DMA 传输。
当 CHCFGR.RROAT = 1B 时:

DMA 通道 TSR.CH 在每次 DMA 事务结束时被清除。
一个 DMA 请求启动一个完整的 DMA 事务。
18.3.3.2 DMA Software Request
一个 DMA 软件请求可以启动一个完整的 DMA 事务或一次单独的 DMA 传输。

如果 DMA 通道仅由软件触发,那么应禁用 DMA 硬件请求。软件必须将 TSR.DCH 设置为 1B 以禁用 DMA 硬件请求(此时 TSR.HTRE = 0B)。



以下是在软件控制下启动一个完整 DMA 事务所需的 DMA 通道配置:

“DMA 通道 CHCFGR.RROAT = 1B”。

通过将 DMA 通道的 CHCSR.SCH 设置为 1B 可发起一个 DMA 软件请求,结果是 TSR.CH 被设置为 1B。在 DMA 事务开始时,DMA 通道的重载值 CHCFGR.TREL 的值被加载到移动引擎(ME)的 CHSR.TCOUNT 中,然后执行 DMA 传输。在每次 DMA 传输后,ME 的 CHSR.TCOUNT 递减,并计算下一个源地址和目标地址。当 TCOUNT 递减到 0D 时,DMA 通道状态标志 TSR.CH 被重置。再次将 DMA 通道的 CHCSR.SCH 设置为 1B 将以存储的传输控制状态(TCS)参数启动该 DMA 通道的新 DMA 事务。

以下是在软件控制下启动每次单独 DMA 传输所需的 DMA 通道配置:

“DMA 通道 CHCFGR.RROAT = 0B”。
每次 DMA 传输都必须通过将 DMA 通道的 CHCSR.SCH 设置为 1B 来发起一个 DMA 软件请求。

18.3.3.3 DMA Hardware Request
DMA 硬件请求通过 DMA 通道硬件事务 / 传输请求使能(HTRE)位 TSR.HTRE 进行启用 / 禁用。HTRE 的功能如下:

软件可以设置(TSR.ECH = 1B)或清除(TSR.DCH = 1B)DMA 通道的 TSR.HTRE。

由于移动引擎(ME)报告 DMA 通道的错误而被清除。

单模式:在 DMA 事务的最后一次 DMA 传输开始时。



DMA 通道模式:

DMA 通道模式位 CHCFGR.CHMODE 控制 DMA 通道模式如下:

单模式(DMA 通道 CHCFGR.CHMODE = 0B):
在 DMA 事务完成时,硬件会禁用 DMA 硬件请求。
连续模式(DMA 通道 CHCFGR.CHMODE = 1B):
在 DMA 事务完成时,硬件不会禁用 DMA 硬件请求。
Single Mode

在单模式下由硬件控制启动一个完整的 DMA 事务所需的 DMA 通道配置如下:

DMA 通道 CHCFGR.CHMODE = 0B(单模式)。
DMA 通道 CHCFGR.RROAT = 1B。
DMA 通道 CHCFGR.PRSEL = 0B。
DMA 通道 TSR.ECH = 1B。
将 DMA 通道的 TSR.ECH 设置为 1B 可启用 DMA 硬件请求(TSR.HTRE = 1B)。当中断控制单元(ICU)生成一个 DMA 硬件请求时,TSR.CH 被置为高电平。如果 DMA 通道在通道仲裁中获胜,则 DMA 通道转换到活动状态。CHCFGR.TREL 的值被加载到 MECHSR.TCOUNT 中,并通过执行第一次 DMA 传输来启动 DMA 事务。在每次 DMA 传输后,MECHSR.TCOUNT 递减,并计算下一个源地址和目标地址。当 TCOUNT 递减到 0D 时,DMA 硬件请求被禁用,状态标志 TSR.CH 和 TSR.HTRE 被重置。为了启动一个新的硬件控制的 DMA 事务,必须再次通过软件写入 TSR.ECH = 1B 来设置 TSR.HTRE 以启用 DMA 硬件请求。单模式下的硬件请求禁用功能通常在下次 DMA 硬件请求启动 DMA 事务之前,用于重新编程 DMARAM 通道的传输控制状态(TCS)。

在单模式下由硬件控制启动每次单独 DMA 传输所需的 DMA 通道配置如下:

DMA 通道 CHCFGR.RROAT = 0B。
在这种 DMA 通道配置中,TSR.CH 在每次 DMA 传输开始时被清除,并且必须生成一个新的 DMA 硬件请求以启动下一次 DMA 传输。



Continuous Mode

如果 DMA 通道被配置为连续模式(CHCFGR.CHMODE = 1B),那么在 DMA 事务结束时 TSR.HTRE 不会被重置。在当前 DMA 事务完成时(ME 的 CHSR.TCOUNT = 0D),每个新的 DMA 硬件请求将使用存储的 DMA 通道传输控制状态(TCS)启动一个新的 DMA 事务。

18.3.3.4 组合 DMA 软件请求和 DMA 硬件请求
DMA 通道可以在软件和硬件的组合控制下运行。示例(如图 194 所示)展示了组合控制:

第一次 DMA 传输由 DMA 软件请求触发,即将 DMA 通道的 CHCSR.SCH 设置为 1B。

DMA 硬件请求仍然被禁用,即 DMA 通道的 TSR.HTRE = 0B。

软件通过设置 DMA 通道的 TSR.ECH = 1B 来启用 DMA 硬件请求。

随后的每次 DMA 传输由来自中断控制单元(ICU)的 DMA 硬件请求触发。

在这个示例中,DMA 通道在单模式下运行(DMA 通道 CHCFGR.CHMODE = 0B)。在单模式下,当 DMA 事务结束时,即 ME 的 CHSR.TCOUNT = 0D 时,DMA 通道的 TSR.HTRE 会被硬件重置。



Transaction Request Lost (TRL)

当一个 DMA 通道被配置为由并行的硬件请求和软件请求触发时,如果一个 DMA 软件请求和一个 DMA 硬件请求在同一时钟周期发生冲突,那么应标记一个传输请求丢失(TRL)事件。

18.3.3.5 DMA Daisy Chain Request
DMA 通道应通过设置 DMA 通道的 CHCFGR.PRSEL 来配置为 DMA 菊花链请求。当一个较高优先级的 DMA 通道完成一个 DMA 事务时,它将通过设置访问待处理位 TSR.CH 位来在接下来的较低优先级 DMA 通道中启动一个 DMA 事务。DMA 菊花链请求仅限于较高优先级的 DMA 通道在接下来的较低优先级 DMA 通道中发起 DMA 请求。

启用菊花链会禁用下一个较高优先级 DMA 通道中的 DMA 通道中断服务请求触发。在典型的 DMA 菊花链应用中,只需要最低优先级的 DMA 通道生成 DMA 通道中断服务请求。当从最高优先级到最低优先级 DMA 通道的 DMA 事务序列完成时,菊花链中的最低优先级 DMA 通道将生成 DMA 通道中断服务请求,以表示 DMA 操作的结束。

如果 DMA 通道被配置为菊花链,那么最高优先级 DMA 通道中的 DMA 传输或 DMA 事务由 DMA 软件请求或 DMA 硬件请求启动。较低优先级 DMA 通道中的 DMA 事务由 DMA 菊花链请求触发,以提高 DMA 延迟。

18.3.3.6 DMA 通道事务请求丢失中断服务请求
DMA 通道传输请求丢失(TRL)事件在以下情况下发生:

如果检测到 DMA 请求并且 DMA 通道的 TSR.CH 被设置,DMA 通道应设置 DMA 通道的 TRL 位(TSR.TRL = 1B)。如果 DMA 通道的启用 TRL 位被设置(TSR.ETRL = 1B),则 DMA 应触发 DMA 资源分区(RP)错误中断服务请求(如图 195 所示)。

如果 DMA 通道对硬件请求被禁用并且检测到 DMA 硬件请求,DMA 应设置 DMA 通道的 TRL 位(TSR.TRL = 1B)并触发 DMA RP 错误中断服务请求。



错误处理程序应查询 DMA 通道以确定错误的来源。软件可以通过设置 DMA 通道的 TSR.CTL 或 TSR.RST 来清除 TSR.TRL。

18.3.3.7 DMA Service Requests
中断请求由中断路由器进行优先级排序,并由服务提供者(CPU 或 DMA)之一进行处理。DMA 与中断路由器(IR)中实例化的中断控制单元(ICU)进行接口。

DMA 通道与在服务请求控制(SRC)寄存器 SRC.SRPN 中编程的服务请求优先级编号(SRPN)位字段相关联。例如:

DMA 通道 000 等同于在 IR 中编程的 SRC.SRPN = 0D。
DMA 通道 001 等同于在 IR 中编程的 SRC.SRPN = 1D。
DMA 通道 002 等同于在 IR 中编程的 SRC.SPRN = 2D。
DMA 通道 003 等同于在 IR 中编程的 SRC.SRPN = 3D。
DMA 通道 004 等同于在 IR 中编程的 SRC.SPRN = 4D。
硬件服务请求到服务提供者目的地的路由由 IR 服务类型(TOS)控制位字段 SRC.TOS 确定。DMA 将确认所有服务请求。如果在 SRC.SRPN 中编程的值是针对无效的 DMA 通道,那么 DMA 将不采取任何行动。用户必须为 DMA 编程有效的 SRC.SRPN 值。

18.3.3.8 DMA 请求仲裁
DMA 仲裁器在 DMA 通道不处于暂停状态(TSR.HLTREQ = 1B)和 / 或挂起状态(SUSASR.SUSAC = 1B)时,持续监视所有 DMA 通道是否有待处理的 DMA 请求。

具有待处理 DMA 请求的最高编号 DMA 通道赢得 DMA 通道仲裁。待处理的 DMA 请求被转发到可用的最高编号移动引擎(ME)。ME 从 DMARAM 读取 DMA 通道的传输控制状态(TCS),并将 TCS 加载到 ME 活动通道寄存器组中,然后执行 DMA 传输。在每次 DMA 传输完成后,DMA 执行一个仲裁序列。

Arbitration Sequence

规则 1:如果有更高优先级的 DMA 通道存在待处理的 DMA 请求,那么:

规则 1.1:移动引擎(ME)应将活动 DMA 通道更新后的传输控制状态(TCS)写回到直接内存访问随机存取存储器(DMARAM)。
规则 1.2:ME 从 DMARAM 读取更高优先级 DMA 通道的 TCS 到 ME。
规则 1.3:ME 应执行一次 DMA 传输。
规则 1.4:在 DMA 传输完成后,DMA 执行一个仲裁序列。
规则 2:如果没有更高优先级的 DMA 通道有待处理的 DMA 请求,并且对于 ME 活动 DMA 通道,CHCFGR.RROAT = 0B,那么:

规则 2.1:更新后的 TCS 应从 ME 写回到 DMARAM。
规则 2.2:在每个时钟周期,DMA 应执行一个仲裁序列。
规则 2.3:如果接收到 DMA 请求,那么 ME 应执行一次 DMA 传输。
规则 2.4:在 DMA 传输完成后,DMA 应执行一个仲裁序列。
规则 3:如果没有更高优先级的 DMA 通道有待处理的 DMA 请求,并且对于 ME 活动 DMA 通道,CHCFGR.RROAT = 1B,那么:

规则 3.1:ME 应执行一次 DMA 传输。
规则 3.2:在 DMA 传输完成后,DMA 应执行一个仲裁序列。
规则 4:在最后一次 DMA 传输完成时,DMA 通道请求位被清除(TSR.CH = 0B)。

规则 5:仲裁序列持续进行,直到所有 DMA 通道的访问待处理请求都由 ME 处理完毕。

18.3.3.9 DMA Channel Reset
软件可以通过设置 DMA 通道复位位(TSR.RST = 1B)来重置单个 DMA 通道。当对 DMA 通道应用 DMA 通道复位时,向复位状态(TSR.RST = 0B)的转换如下:

空闲状态和待处理状态:DMA 通道应转换到复位状态。

活动状态:在当前 DMA 传输完成时,DMA 通道转换到复位状态。

复位状态:

在完成 DMA 通道复位后,DMA 通道进入复位状态,定义如下:

一、以下 DMA 通道位被重置:

DMA 事务状态寄存器:TSR.HLTREQ、TSR.HLTACK、TSR.HTRE、TSR.CH 和 TSR.TRL。
DMARAM 传输控制状态(TCS):CHCFGR.PRSEL、CHCSR.ICH、CHCSR.IPM、CHCSR.WRPD、CHCSR.WRPS、CHCSR.FROZEN、CHCSR.BUFFER、CHCSR.LXO 和 CHCHSR.TCOUNT。
二、如果为 DMA 通道启用了循环缓冲区(ADICR.SCBE 和 / 或 ADICR.DCBE),则源和 / 或目标地址寄存器将被设置为回绕边界,否则地址寄存器将被清除。

三、DMA 通道影子地址寄存器(SHADR)应被清除。

Resetting a DMA Channel

用户程序必须执行以下步骤来重置 DMA 通道:

如果启用了 DMA 硬件请求,则禁用硬件请求(TSR.DCH = 1B)。
软件请求 DMA 通道复位(TSR.RST = 1B)。
软件应监视 DMA 通道复位以及 DMA 通道的源地址寄存器(SADR)、目标地址寄存器(DADR)和影子地址寄存器(SHADR)。
一旦 DMA 清除了 DMA 通道复位(TSR.RST = 0B)并且 DMA 已经重置了 DMA 通道的 SADR、DADR 和 SHADR 寄存器,DMA 通道复位就已完成。
在 DMA 通道复位操作期间,不得通过设置 CHCSR.SCH = 1B 来发起 DMA 软件请求。

Restarting a DMA Channel

用户程序必须执行以下步骤在 DMA 通道复位后重新启动 DMA 通道:

配置 DMA 通道传输控制状态(TCS),包括:
a) DMA 双缓冲:将地址指针编程为指向基地址。
DMA 通道应按如下方式重新启动:
a) DMA 软件请求:软件发起 DMA 请求(将 DMA 通道的 CHCSR.SCH 设置为 1B)。
b) DMA 硬件请求:软件启用 DMA 请求(将 DMA 通道的 TSR.ECH 设置为 1B)。
18.3.3.10 DMA Channel Halt(中断)
DMA 通道可以在 DMA 事务期间暂停,并且状态被冻结,以便对目标内存进行后台 RAM 测试,以检测卡住的位并区分静态错误和瞬态错误。在 RAM 测试完成后,可以重新启动 DMA 通道并完成 DMA 事务。

DMA 通道暂停逻辑(如图 196 所示)利用置位 / 清除机制,在当前 DMA 传输完成时请求 DMA 通道转换到暂停状态或从暂停状态转换出来。只有向 DMA 通道写入逻辑 “1” 以设置或清除暂停请求(如图 197 所示)才会起作用。其他 DMA 通道的状态应被忽略。



Halt State

当 DMA 通道的事务状态寄存器(TSR)中的 HLTACK = 1B 时,DMA 通道被定义为处于暂停状态。

进入 DMA 通道暂停状态:

DMA 通道可以通过软件写入 DMA 通道暂停请求位(TSR.HLTREQ = 1B)来暂停。DMA 通道进入暂停状态的方式如下:

空闲状态、复位状态和待处理状态:一旦 DMA 通道接收到暂停请求,DMA 通道应立即转换到暂停状态。

活动状态:在当前 DMA 传输完成时,DMA 通道应转换到暂停状态。



DMA 通道可以通过软件写入 DMA 通道暂停清除位(TSR.HLTCLR = 1B)从暂停状态中释放。DMA 操作将恢复。如果在暂停请求被确认之前就清除了该请求,那么对 DMA 操作没有影响。

在 DMA 通道暂停期间的 DMA 通道硬件请求

如果 DMA 通道处于暂停状态且硬件事务请求已启用(TSR.HTRE = 1B),那么 DMA 通道将对 DMA 硬件请求做出如下响应:

没有 DMA 请求待处理(TSR.CH = 0B):DMA 通道应设置访问待处理位(TSR.CH = 1B)。当 DMA 通道退出暂停状态时,将处理 DMA 硬件请求。

DMA 请求待处理(TSR.CH = 1B):DMA 通道应记录一个传输请求丢失(TRL)事件。如果 DMA 通道的 TRL 使能位已设置(TSR.ETRL = 1B),那么 DMA 应触发 DMA 资源分区(RP)错误中断服务请求。

18.3.4 DMA随机存取存储器
软件将 DMA 通道传输控制状态(TCS)(如图 198 所示)存储在直接内存访问随机存取存储器(DMARAM)中,以定义每个 DMA 通道的移动功能。



Figure 198 DMARAM TCS Organization

18.3.4.1 DMA Channel Operation
DMARAM 中的传输控制状态(TCS)定义了 DMA 通道操作的类型以及所支持的片上总线访问大小。

Table 569 DMA Channel Operation

详情见1448页。

DMA 时间戳仅应在 DMA 事务完成时附加。
DMA 通道操作 “模式检测” 应适用于所有类型的 DMA 通道影子操作。
如果 DMA 通道被配置为 DMA 通道 ADICR.SHCT 的保留值,并且接收到 DMA 请求,那么 DMA 将清除 DMA 通道的 TSR.CH 并且不执行任何 DMA 移动操作。
18.3.4.2 DMA Channel Updates
软件仅应在 DMA 通道处于空闲状态(DMA 通道 CHCSR.TCOUNT = 0D)或复位状态时配置 DMARAM 通道传输控制状态(TCS)。如果 DMA 通道处于空闲状态(DMA 通道 CHCSR.TCOUNT!=0D)、待处理状态或活动状态,软件不应更新 DMARAM 通道 TCS。以下是适用于影子操作和双缓冲操作的 DMA 通道更新例外情况。

18.3.4.2.1 Shadow Operations
如果 DMARAM 通道传输控制状态(TCS)被配置为影子操作,并且 DMA 通道处于空闲状态(DMA 通道 CHCSR.TCOUNT!=0D)、待处理状态或活动状态,软件应被限制为仅更新 DMARAM 通道 TCS 中标记为 “X” 的字:






18.3.4.2.2 Double Buffering Operations
如果 DMARAM 通道的传输控制状态(TCS)被配置为双缓冲操作,并且 DMA 通道处于空闲状态(DMA 通道 CHCSR.TCOUNT!=0D)、待处理状态或活动状态,软件应被限制为仅更新 DMARAM 通道 TCS 中标记为 “X” 的字:

以下是对 “表 571 DMARAM 通道在双缓冲操作期间的更新:

见1451页。

18.3.4.3 DMA 通道重新配置
如果要配置一个 DMA 通道,软件应应用 DMA 通道复位来初始化该通道。在 DMA 通道进入复位状态后,软件应为 DMA 操作配置该 DMA 通道。

18.3.4.4 Move Operation
DMA 移动的次数(如图 199 所示)可以通过以下方式计算:

块模式(CHCFGR.BLKM)定义了一次 DMA 传输中的 DMA 移动次数。
传输重载(CHCFGR.TREL)定义了一次 DMA 事务中的 DMA 传输次数。
在一次 DMA 移动后,下一个源地址和目标地址会被计算出来。源地址和目标地址是相互独立地进行计算。以下地址计算参数可以被选择:

地址偏移量,它是所选数据宽度的倍数。
偏移方向:加法、减法或无(地址不变)。



18.3.4.4.1 Address Generation
地址控制位(在 DMA 通道的 ADICR 中)决定地址如何递增或递减。数据宽度在 CHCFGR.CHDW 中定义,并在地址计算期间被考虑在内。地址偏移计算表(如表 572 和表 573 所示)显示了在每次 DMA 移动后添加或从源地址(SMF 和 INCS 参数)和目标地址(DMF 和 INCD 参数)中减去的偏移值。

Table 572 Address Offset Calculation Table (8-bit, 16-bit and 32-bit)

表572见1452页。

18.3.4.4.2 Address Calculation Examples
以下示例展示了数据宽度为 16 位时(CHCFGR.CHDW = 001B)的地址生成:

Programmable Address Generation - Example 1

16位半字从源内存的增量源地址偏移量为10H移动到目标内存的递减目标地址偏移量为08H。



Programmable Address Generation - Example 2

16 位半字从源内存被移动,源地址偏移以 02H 递增,到目标内存中,目标地址偏移以 04H 递增。



18.3.4.4.3 Circular Buffer
通过分别设置 DMA 通道循环缓冲区使能位 ADICR.SCBE 和 ADICR.DCBE,可以启用源和目标循环缓冲区。源地址和目标地址可以被配置为分别为源数据和目标数据构建一个循环缓冲区。在循环缓冲区内,地址在循环缓冲区回绕限制内进行更新。循环缓冲区的长度由位字段 ADICR.CBLS(用于源缓冲区)和 ADICR.CBLD(用于目标缓冲区)决定。这些 4 位宽的位字段确定在地址更新期间 32 位地址的哪些位保持不变。循环缓冲区的可能缓冲区大小可以是 或 字节(=1、2、4、8、16…… 直到 64K 字节)。在 DMA 移动期间,源地址和目标地址递增或递减,源地址的所有高位 [31:CBLS] 和目标地址的 [31:CBLD] 被冻结并保持不变,即使从低位 [CBLS - 1:0] 或 [CBLD - 1:0] 发生了回绕。这种地址冻结机制总是使循环缓冲区与它的大小的整数倍对齐。如果循环缓冲区的大小小于或等于所选的地址偏移量,那么将始终访问相同的循环缓冲区地址。

18.3.4.4.4 Address Alignment(地址对其)
DMA 应符合 SRI 总线协议。所有源地址和目标地址应根据通道数据宽度(CHCFGR.CHDW)对齐到正确的地址边界,如下所示:

单次传输:源地址和目标地址边界应与通道数据宽度(字节、半字、字或双字)对齐。
块传输:源地址和目标地址边界应对齐到双字边界。SRI 总线协议为不是以块传输大小的起始地址开始的块传输定义了一种回绕寻址方案。BTR2(如图 202 所示)和 BTR4(如图 203 所示)的不同场景展示了对 DMA 事务的影响。





18.3.4.4.5 Address Counter
如果源 / 目标循环缓冲区未被启用(ADICR.SCBE/DCBE = 0B),那么源 / 目标地址将在整个 32 位地址字段中递增或递减。地址偏移量由 DMA 通道的 CHCFGR.CHDW 决定。地址将在 32 位地址边界上回绕:

如果地址是递增的,那么将从 FFFFFFFFH 回绕到 00000000H。

如果地址是递减的,那么将从 00000000H 回绕到 FFFFFFFFH。

18.3.4.4.6 DMA Address Checksum
DMA 应根据 IEEE 802.3 标准计算 SDCRC 校验和,将呈现给片上总线的源地址和目标地址作为输入数据。软件应将计算出的 DMA 地址校验和(SDCRC)与存储在内存中的预期 DMA 地址校验和进行比较,以验证 DMA 事务期间的地址生成。要检查 DMA 通道地址生成,请使用以下步骤

软件应将存储在 DAMRAM 中的 DMA 通道 DMA 地址校验和初始化为一个已知的初始值。
DMA 通道接收一个 DMA 请求。
如果 DMA 通道处于活动状态且没有报告错误或重试事件,ME(可能是某种模块或实体)应为每个 DMA 读移动和 DMA 写移动计算一个更新的 DMA 地址校验和。
在 DMA 事务完成时,DMA 应将最终的 DMA 地址校验和存储在 DMARAM 中。
软件应比较计算出的 DMA 地址校验和与预期的 DMA 地址校验和。
如果计算出的和预期的 DMA 地址校验和匹配,那么 DMA 已正确计算源地址和目标地址。如果校验和不匹配,那么软件应报告故障。
DMA 地址校验和在以下 DMA 通道操作配置中不可用:

DMA 双源缓冲仅软件切换。
DMA 双源缓冲软件切换和自动硬件切换。
DMA 双目标缓冲仅软件切换。
DMA 双目标缓冲软件切换和自动硬件切换。
条件链接列表(CONLL)。
18.3.4.4.7 DMA Channel Interrupt Service Request
每个 DMA 通道都会生成一个中断服务请求(如图 204 所示)来报告 DMA 通道事件:

DMA 通道传输中断服务请求。
DMA 通道模式匹配中断服务请求。
DMA 通道环绕缓冲区中断服务请求。
18.3.4.4.8 DMA Channel Transfer Interrupt Service Request
如果一个 DMA 通道处于活动状态,那么在 DMA 传输完成时,或者当 ME(可能是特定模块)的 CHSR.TCOUNT 在一次 DMA 传输后递减并与位字段 ADICR.IRDV 的值匹配时,可能会激活 DMA 通道传输中断服务请求。当状态标志 CSR.ICH 被设置时,表示来自 DMA 通道的中断服务请求。该状态标志可以通过软件设置 DMA 通道的 CHCSR.CICH = 1B(或者 TSR.RST = 1B)来重置。当 DMA 通道的 ADICR.INTCT [1] 被设置时,DMA 通道中断服务请求被启用。位 ADICR.INTCT [0] 选择两种中断源类型之一。对于比较操作,位字段 ADICR.IRDV(4 位)被零扩展到 14 位,然后与 14 位的 TCOUNT 值进行比较。这意味着在 DMA 事务的最后 16 次 DMA 传输中的一次之后,可能会生成 TCOUNT 匹配中断。请注意,当 IRDV = 0000B 时,匹配中断在 DMA 事务结束时(在最后一次 DMA 传输后)生成。



18.3.4.4.9 DMA 通道模式匹配中断服务请求
当 CHCFGR.PATSEL [1:0] 不等于 00B 时,DMA 通道模式检测中断服务请求被启用。当状态标志 CHCSR.IPM 被设置时,表明模式检测中断。状态标志 CHCSR.IPM 应由软件设置 DMA 通道的 CHCSR.CICH = 1B(或者 TSR.RST = 1B)来重置。

18.3.4.4.10 DMA 通道环绕缓冲区中断服务请求
每个 DMA 通道报告源缓冲区环绕和 / 或目标缓冲区环绕如下:

源缓冲区环绕由状态标志 CHCSR.WRPS 指示。
目标缓冲区环绕由状态标志 CHCSR.WRPD 指示。
软件可以通过设置 CHCSR.CWRP = 1B(或者 TSR.RST = 1B)来重置这两个缓冲区环绕状态标志。

DMA 通道环绕缓冲区中断服务请求按如下方式启用:

当设置位 ADICR.WRPSE 时,启用 DMA 通道环绕源缓冲区中断服务请求。
当设置位 ADICR.WRPDE 时,启用 DMA 通道环绕目标缓冲区中断服务请求。
DMA 通道环绕源缓冲区环绕中断服务请求和 DMA 通道环绕目标缓冲区环绕中断服务请求与其他 DMA 通道中断服务请求进行或运算,以形成一个 DMA 通道中断服务请求。

18.3.4.5 Shadow Operation
如果一个 DMA 通道被配置为影子操作,那么 DMA 会缓冲一个可变的源地址或目标地址。

18.3.4.5.1 影子操作的应用
在典型的应用中,接收数据的 ASC(异步串行通信)模块具有固定的 DMA 通道源地址,它必须通过 DMA 事务将数据传输到内存缓冲区,此时 DMA 通道的目标地址是可变的。在一定量的数据被传输后,应当启动新的 DMA 事务,以便将更多的 ASC 数据传输到另一个内存缓冲区。

当在正在运行的 DMA 事务期间,使用实际的目标地址更新目标地址寄存器时,影子机制允许对新的目标地址进行编程,而不会干扰目标地址寄存器的内容。在这种情况下,新的目标地址被写入并缓存在影子地址寄存器中。在下一个 DMA 事务开始时,目标地址寄存器将无需 CPU 干预而使用新的地址。影子操作避免了 CPU 必须在重新编程地址寄存器之前检查 DMA 事务是否结束。

18.3.4.5.2 阴影地址寄存器
影子地址寄存器存储一个新的源地址或新的目标地址。如果在下一个 DMA 事务中源地址和目标地址都必须更新,那么这个 DMA 通道正在运行的 DMA 事务必须先完成。之后,在启动下一个 DMA 事务之前,可以写入源地址寄存器和目标地址寄存器。

在 DMA 事务正在运行时,只能有一个地址寄存器被影子化,因为影子寄存器只能被分配给源地址或目标地址。请注意,影子地址传输机制在单模式和连续模式下具有相同的行为。

影子地址寄存器的功能应由影子操作的模式来定义:

只读模式:如果软件向影子地址寄存器写入数据,DMA 将返回一个总线错误。
直接写入模式:如果软件向影子地址寄存器写入数据,DMA 将在影子地址寄存器中存储一个新的影子地址。
18.3.4.5.3 只读模式
如果软件写入一个新的 DMA 通道源地址或目标地址值,DMA 应按如下方式存储新的地址值:

Idle State (DMA channel CHCSR.TCOUNT=0)

如果软件写入一个新的 DMA 通道源地址值,DMA 应将新的源地址值存储在 DMA 通道的 SADR(源地址寄存器)中。
如果软件写入一个新的 DMA 通道目标地址值,DMA 应将新的目标地址值存储在 DMA 通道的 DADR(目标地址寄存器)中。
空闲状态(DMA 通道 CHCSR.TCOUNT 不等于 0)或挂起状态

如果软件写入一个新的 DMA 通道源地址或目标地址值,DMA 应将新的地址值存储在 DMA 通道的 SHADR(影子地址寄存器)中。

活动状态

如果软件写入一个新的 DMA 通道源地址或目标地址值,DMA 应将新的地址值存储在 ME(可能是特定模块)的 SHADR(影子地址寄存器)中。

DMA事务结束

一旦 DMA 完成一次 DMA 事务,DMA 应检查 ME SHADR 的值。如果 ME SHADR 不等于 0000 0000H,ME(可能是特定模块)应将数据写回到 DMARAM(可能是特定存储区域),如下所示:

“影子操作只读模式源地址”:
DMA 应将 ME SHADR 的值存储到 DMA 通道的 SADR(源地址寄存器)中。
DMA 应将 0000 0000H 存储到 DMA 通道的 SHADR(影子地址寄存器)中。
“影子操作只读模式目标地址”:
DMA 应将 ME SHADR 的值存储到 DMA 通道的 DADR(目标地址寄存器)中。
DMA 应将 0000 0000H 存储到 DMA 通道的 SHADR(影子地址寄存器)中。
如果软件没有执行影子地址更新,ME SHADR 等于 0000 0000H。ME 应将数据写回到 DMARAM,如下所示:

“影子操作只读模式源地址”:
DMA 应将 0000 0000H 存储到 DMA 通道的 SADR(见错误条件)。
“影子操作只读模式目标地址”:
DMA 应将 0000 0000H 存储到 DMA 通道的 DADR(见错误条件)。
18.3.4.5.4 直接写入模式
如果软件写入一个新的 DMA 通道影子地址值,DMA 应按如下方式存储新的影子地址值:

“空闲状态或挂起状态”:
如果软件写入一个新的 DMA 通道影子地址值,DMA 应将新的影子地址值存储在 DMA 通道的 SHADR(影子地址寄存器)中。
“活动状态”:
如果软件写入一个新的 DMA 通道影子地址值,DMA 应将新的影子地址值存储在 ME(可能是特定模块)的 SHADR(影子地址寄存器)中。一旦 ME(可能是特定模块)将数据写回到 DMA RAM(直接内存访问随机存取存储器),DMA 应将 ME 的 SHADR 值存储在 DMA 通道的 SHADR 字中。
DMA事务开始

一旦 DMA 响应 DMA 请求,DMA 应执行影子地址传输,如下所示:

“影子操作直接写入模式源地址”:
如果 DMA 通道的 SHADR 不为 0000 0000H,DMA 应将 DMA 通道的 SHADR 值存储到 ME(可能是特定模块)的 SADR(源地址寄存器)中。
“影子操作直接写入模式目标地址”:
如果 DMA 通道的 SHADR 不为 0000 0000H,DMA 应将 DMA 通道的 SHADR 值存储到 ME(可能是特定模块)的 DADR(目标地址寄存器)中。
影子操作结束
如果软件写入一个新的 DMA 通道影子地址值为 0000 0000H,或者应用了 DMA 通道重置,那么

在下次 DMA 事务开始时,DMA 将不会执行影子地址更新。

18.3.4.5.5错误条件
如果一个 DMA 通道被配置为影子操作,并且在软件更新影子地址之前服务了一个新的 DMA 请求,那么 DMA 应执行一次向地址 0000 0000H 的 DMA 移动,这将导致一个总线错误。

18.3.4.5.6 Transfer Count Update
DMA 事务的传输计数存储在 DMA 通道位域 CHCFGR.TREL 中,如果 DMA 事务正在运行,可以对其进行编程。在 DMA 事务开始时,CHCFGR.TREL 被传输到 ME(可能是特定模块)的 CHSR.TCOUNT。如果 ME 的 CHSR.TCOUNT 不等于 0,则不会进行地址或计数器的重新加载。当 DMA 通道处于活动状态时,必须避免对特定通道的值(除了所选的影子地址寄存器之外)进行重新编程,因为数据传输可能会被破坏。

传输计数和源地址更新 —— 示例

在两次 DMA 事务期间,当有传输计数和影子源地址更新时,ME(可能是特定模块)传输计数和 ME 源地址寄存器的内容会被更新(如图 205 所示)。

在参考点 2),DMA 事务 1 完成,DMA 事务 2 开始。在 1)处,为下一个 DMA 事务用两个新参数对 DMA 通道进行重新编程:传输计数 tc2 和源地址 sa2。源地址 sa2 被缓冲在 ME SHADR 中,并在新的 DMA 事务在 2)处开始时被传输到 ME SADR。此时,传输计数 tc2 也被传输到 ME CHSR.TCOUNT。请注意,在这个例子中,如果选择了只读模式,影子地址寄存器仅在硬件的作用下被重置为 0000 0000H。

如果在 DMA 通道处于活动状态时写入 DMA 通道的 CHCFGR.TREL:

对 DMA 通道 CHCFGR.TREL 的写入将更新 ME CHCR.TREL 的值。
在回写时,DMA 通道 CHCFGR.TREL 会用最新的 ME CHCR.TREL 值进行更新。
在下次 DMA 事务开始时,ME CHSR.TCOUNT 会被更新为新的 DMA 通道 CHCFGR.TREL 的值。



18.3.4.6 DMA Timestamp
一旦最后一次 DMA 传输完成,一个 32 位的 DMA 时间戳可以被附加以记录 DMA 操作的发生。DMA 时间戳是 DMA 记录事件的时间,而不是实际时间。在 DMA 时间戳被写入后,DMA 事务完成。

18.3.4.6.1生成DMA时间戳
DMA 时间戳由一个 32 位二进制向上同步计数器生成,该计数器由 SPB 时钟除以 8 进行时钟驱动,如图 206 所示。计数在应用复位被释放后自动开始。在正常的 DMA 操作期间,不可能影响该计数器。当前的 32 位时间戳值可以通过 TIME 寄存器读取。



18.3.4.6.2 将 DMA 时间戳附加到非目标循环缓冲区
向目标数据附加 DMA 时间戳由 DMA 通道的 ADICR.STAMP 位控制。如果一个 DMA 通道被配置为附加 DMA 时间戳且不是目标循环缓冲区操作(ADICR.DCBE = 0B),那么 ME(可能是特定模块)应在由以下定义的目标地址处写入一个 DMA 时间戳:

如果 ADICR.INCD = 1B,DMA 时间戳的地址是下一个更高的字对齐的目标地址。
如果 ADICR.INCD = 0B,DMA 时间戳的地址是下一个更低的字对齐的目标地址。
DMA 时间戳附加 —示例 1

16 位半字从源内存(具有 10H 的递增源地址偏移量)被移动到目标内存(具有 08H 的递增目标地址偏移量),如图 207 所示。



DMA 时间戳附加 —示例 2

16 位半字从源内存(具有 02H 的递增源地址偏移量)被移动到目标内存(具有 04H 的递减目标地址偏移量),如图 208 所示。



Destination Address Generation

下一次 DMA 写操作(下一次 DMA 事务)的目标地址应使用以下方式计算:

上一次 DMA 写操作(当前 DMA 事务)的目标地址。
由 ADICR.INCD、ADICR.DMF 和 CHCFGR.CHDW 定义的目标地址偏移量。
ME(可能是特定模块)检查下一次 DMA 写操作的目标地址。如果当前计算出的下一次 DMA 写操作的目标地址会导致 DMA 写操作数据覆盖当前 DMA 事务的 DMA 时间戳,那么 ME 应计算一个新的目标地址:

如果 DMA 通道的 ADICR.INCD = 1B,ME 应选择以下两者中的较大值:
在上一次 DMA 写操作的目标地址上加上(2D× 目标地址偏移量)。
在上一次 DMA 写操作的目标地址上加上 8D。
如果 DMA 通道的 ADICR.INCD = 0B,ME 应选择以下两者中的较小值:
从上一次 DMA 写操作的目标地址中减去(2D× 目标地址偏移量)。
从上一次 DMA 写操作的目标地址中减去 8D。
ME 应将 DMA 通道的 TCS(包括更新后的目标地址)写回到 DMARAM(直接内存访问随机存取存储器)。

18.3.4.6.3 将 DMA 时间戳附加到目标循环缓冲区
如果一个 DMA 通道被配置为附加 DMA 时间戳且进行目标循环缓冲区操作(ADICR.DCBE = 1B),那么 ME(可能是特定模块)应在由以下定义的目标地址处写入一个 DMA 时间戳:

如果 ADICR.INCD = 1B 且 ADICR.CBLD = 1 或 0,DMA 时间戳的地址 = (DADR [31:2] + 1) << 2。
如果 ADICR.INCD = 1B 且 ADICR.CBLD > 1,DMA 时间戳的地址 = (DADR [31:CBLD] + 1) << CBLD。
如果 ADICR.INCD = 0B 且 ADICR.CBLD = 1 或 0,DMA 时间戳的地址 = (DADR [31:2] << 2) - 4。
如果 ADICR.INCD = 0B 且 ADICR.CBLD > 1,DMA 时间戳的地址 = ((DADR [31:CBLD]) << CBLD) - 4。
ME 将递增并回绕后的目标地址写回到 DMARAM(直接内存访问随机存取存储器)。

18.3.4.6.4 DMA时间戳的应用
DMA 时间戳的附加可以被软件用来检测 DMA 故障模式:

“丢失的 DMA 操作”:DMA 请求未被服务(即没有数据)。
“意外的 DMA 操作”:非预期的 DMA 请求导致意外的 DMA 事务(即意外的数据)。
“延迟的 DMA 事务”:预期的 DMA 事务完成得太晚。
软件可以分析相对的 DMA 时间戳值来确定 DMA 事务的正确顺序。

18.3.4.7 模式检测
如果一个 DMA 通道被配置为进行模式检测(PATDET),那么在每次 DMA 读操作之后,ME(可能是特定模块)会将读取的数据与存储在模式读取寄存器(PRR)中的值进行比较。模式检测操作取决于通道数据宽度(CHCFGR.CHDW)。控制字段 CHCFGR.PATSEL 针对特定的 CHDW 值选择不同的模式检测操作。

模式比较逻辑会将存储在 ME 读取寄存器中的传输数据与选定的 PRR 进行比较。如果要比较的传输数据字节分布在不同的传输数据字中,ME 可以结合当前 DMA 传输的模式匹配结果和前一次 DMA 传输的模式匹配结果(存储在 ME CHSR.LXO 中)。

Configuration

如果一个 DMA 通道被配置为进行模式检测(PATDET):

通道数据宽度(CHCFGR.CHDW)应配置为 8 位、16 位或 32 位。
源地址不应配置为缓存地址(段 8 和 9)。应配置为非缓存地址(段 A 和 B),以防止 ME 读取缓冲区重新对齐传输数据。
中断服务请求

如果一个 DMA 通道被配置为进行模式检测(PATDET)并且检测到模式匹配:

DMA 事务以当前的 DMA 传输结束。
DMA 通道状态寄存器(TSR)的 HTRE 位被清除,以停止当前活动 DMA 通道中的 DMA 传输。
当 DMA 写操作完成时,DMA 通道 TSR 的 CH 位将被清除。
ME(可能是特定模块)应回写下一次 DMA 传输的源地址(SADR)和目标地址(DADR)的值。
如果 DMA 通道被配置为影子操作只读模式,ME 不应执行影子地址更新。ME 将当前 SHADR 的值回写到 DMARAM(直接内存访问随机存取存储器)。
应触发一个模式检测中断服务请求。
软件可以读取 DMA 通道状态以确定数据流中模式匹配的位置。
Errors

如果在当前 DMA 读操作期间报告了一个 SER(可能是某种错误状态),那么 ME(可能是特定模块)不应执行模式匹配。

18.3.4.7.1模式比较逻辑
ME 比较(COMP)逻辑(如图 209 所示)在逐位级别上比较传输数据与参考模式。一个 COMP 模块控制 8 位或 16 位数据。COMP 模块可以被配置为在模式比较时屏蔽每个数据位。



在 COMP 逻辑中,来自 ME 读取寄存器的一个数据位与存储在选定的 PRR(模式读取寄存器)中的相应模式位进行比较。如果两个位相等,并且存储在另一个 PRR 位字段中的模式屏蔽位为 0B,那么比较匹配条件变为激活状态。当模式屏蔽位被设置为 1B 时,对于相关位,比较匹配条件始终为激活状态(设置)。当 COMP 逻辑中每个位的比较匹配条件都为真时,COMP 模块的比较匹配输出线变为激活状态。

18.3.4.7.2  8 位通道数据宽度的模式检测
如果一个 DMA 通道被配置为针对 8 位通道数据宽度的模式检测,ME(可能是特定模块)应使用源地址来选择要与存储在 PRR0 或 PRR1 中的模式进行比较的传输数据字节。由 DMA 通道模式选择(CHCFGFR.PATSEL [1:0])定义了三种可能的模式比较配置。模式比较逻辑允许将 DMA 传输数据的一个字节与两种不同的模式进行比较。可以对每个比较位进行屏蔽操作。

8 位通道数据宽度的模式检测(PATDET)示例。
DMA 通道(如图 210 所示)被配置为针对 8 位通道数据宽度的模式检测(CHCFGR.CHDW = 000B)。
如果当前的 DMA 读操作将传输数据字节存储在 MEm0R.RD00 中,那么:

ME(可能是特定模块)使用源地址来选择存储在 MEm0R.RD00 中的传输数据字节。
ME 将存储在 MEm0R.RD00 中的传输数据字节与 PRR0(模式读取寄存器 0)进行比较。



DMA 通道可以被配置为三种模式比较操作之一(如表 574 所示)。



两字节模式检测序列示例
如果一个 DMA 通道被配置为与 PRR0 进行两字节模式检测序列比较(CHCFGR.PATSEL [2:0]=011B),那么在每次 DMA 传输后,与 PRR0.PAT01 进行比较并由 PRR0.PAT03 屏蔽的传输数据的模式匹配结果将存储在 ME CHSR.LXO 位中。
这种 DMA 通道配置允许在来自具有 8 位数据宽度的串行外设单元的 8 位数据流中检测两字节序列,例如识别回车、换行字符等。

18.3.4.7.3  16位通道数据宽度的模式检测
如果一个 DMA 通道被配置为针对 16 位通道数据宽度的模式检测,ME(可能是特定模块)应使用源地址来选择要与存储在 PRR0 或 PRR1 中的模式进行比较的传输数据字节。由 DMA 通道模式选择(CHCFGFR.PATSEL [1:0])定义了三种可能的模式匹配配置:

对齐模式:仅比较一次 DMA 传输的完整半字。
未对齐模式:比较连续两次 DMA 传输的上字节和下字节。
组合模式:结合对齐模式和未对齐模式。
可以对每个比较位进行屏蔽操作。

16位通道数据宽度的PATDET示例

DMA 通道(如图 211 所示)被配置为针对 16 位通道数据宽度的模式检测(CHCFGR.CHDW = 001B)。

如果当前的 DMA 读操作将传输数据半字存储在 MEm0R.RD01||RD00 中,那么:

ME(可能是特定模块)使用源地址来选择存储在 MEm0R.RD01||RD00 中的传输数据半字。
ME 将存储在 MEm0R.RD01||RD00 中的传输数据半字与 PRR0(模式读取寄存器 0)进行比较。



DMA 通道可以被配置为三种模式比较操作之一(如表 575 所示)。

对齐模式。
未对齐模式 1(源地址递减):将当前 16 位 DMA 读操作的高字节与前一个 16 位 DMA 读操作的低字节进行比较。
未对齐模式 2(源地址递增):当前 16 位 DMA 读操作的低字节与前一个 16 位 DMA 读操作的高字节进行比较。
“组合模式”:如果不知道要检测的 16 位模式位于哪个字节边界(偶数地址或奇数地址),则应将 DMA 通道配置为组合模式。组合模式是最灵活的模式,它结合了对齐和未对齐的 16 位数据搜索的模式搜索能力。

18.3.4.7.4 32 位通道数据宽度的模式检测
如果一个 DMA 通道被配置为针对 32 位通道数据宽度的模式检测,ME(可能是特定模块)应将一个传输数据字与存储在 PRR0 或 PRR1 中的模式进行比较。由 DMA 通道模式选择(CHCFGFR.PATSEL [1:0])定义了三种可能的模式比较配置。在这种情况下,不可以进行屏蔽操作。

32位通道数据宽度的PATDET示例

DMA 通道(如图 212 所示)被配置为进行模式检测(PATDET)且具有 32 位通道数据宽度(CHCFGR.CHDW = 010B)。

如果当前的 DMA 读操作将传输数据字存储在 MEm0R 中,那么:

ME(可能是特定模块)使用源地址来选择存储在 MEm0R 中的传输数据字。
ME 将存储在 MEm0R 中的传输数据字与 PRR0(模式读取寄存器 0)进行比较。



DMA 通道可以被配置为三种模式比较操作之一(如表 576 所示)。

仅将低半字与存储在 PRR0 或 PRR1 中的模式进行比较。
仅将高半字与存储在 PRR0 或 PRR1 中的模式进行比较。
将完整的 32 位字与存储在 PRR0 或 PRR1 中的模式进行比较。



18.3.4.8 双缓冲操作
DMA 支持双缓冲。例如,双目标缓冲(如图 213 所示)如下:

DMA 读操作将连续的数据流从外设传输到 DMA。
DMA 写操作将读取的数据从 DMA 传输到存储在内存中的两个目标缓冲区之一。
处于休眠状态的缓冲区被冻结,可用于循环软件任务,而另一个缓冲区继续被填充。



如果一个 DMA 通道被配置为双缓冲操作之一,并且由 DMA 硬件请求触发,那么软件应将 DMA 通道配置为连续模式(DMA 通道的 CHCFGR.CHMODE = 1B)。

18.3.4.8.1 DMA双源缓冲
数据由 DMA 从存储在内存中的两个数据缓冲区(缓冲区 0 和缓冲区 1)之一流向连续的输出数据流。双源缓冲的地址如下:

源地址 SADR 应指向源缓冲区 0。
影子地址 SHADR 应指向源缓冲区 1。
18.3.4.8.2 DMA双目标缓冲
一个连续的输入数据流由 DMA 导向存储在内存中的两个数据缓冲区(缓冲区 0 和缓冲区 1)之一。双目标缓冲的地址如下:

目标地址 DADR 应指向目标缓冲区 0。
影子地址 SHADR 应指向目标缓冲区 1。
18.3.4.8.3 Size of Buffer
两个源 / 目标缓冲区的数据大小相等,由以下 TCS(可能是特定的配置参数集)参数决定:

通道数据宽度(CHCFGR.CHDW)。
块模式值(CHCFGR.BLKM)。
传输重载值(CHCFGR.TREL)。
两个源 / 目标缓冲区的内存大小由以下额外的 TCS 参数决定:

源 / 目标循环缓冲区启用 / 禁用控制(ADICR.SCBE/DCBE)。
源 / 目标地址修改因子(ADICR.DMF/SMF)。
源 / 目标地址的增量(ADICR.INCD/INCS)。
一个缓冲区的大小等于一次 DMA 事务的大小。

18.3.4.8.4 Buffer Switch
数据流从一个缓冲区到另一个缓冲区的重定向应由软件开关以及自动硬件开关控制。在缓冲区切换期间:

DMA 不应丢失任何 DMA 请求。
在两个缓冲区之间不应有数据丢失、重复或分裂。
激活缓冲区状态

在 DMA 双缓冲期间,DMA 通道的 CHCSR.BUFFER 位用于指示哪个缓冲区是活动的。

DMA 通道 CHCSR.BUFFER = 0B:DMA 正在读取或填充缓冲区 0。
DMA 通道 CHCSR.BUFFER = 1B:DMA 正在读取或填充缓冲区 1。
Frozen Buffer Status

当 DMA 切换缓冲区时,DMA 通道冻结位被设置(CHSR.FROZEN = 1B)。此时冻结的缓冲区可供循环软件任务使用。在软件任务完成后,状态位 CHSR.FROZEN 由软件清除,并且缓冲区地址指针被重新编程为起始地址,为下一次读取 / 填充该缓冲区的 DMA 事务做好准备。

Active Buffer Empty or Full

如果活动缓冲区被清空(在 DMA 双源缓冲的情况下)或被填满(在 DMA 双目标缓冲的情况下),并且在接收到软件缓冲区切换信号之前没有自动硬件切换发生,那么 DMA 通道将停止,不再进行更多的 DMA 传输。当 DMA 通道停止时,传输计数(CHCSR.TCOUNT)等于 0000H。

缓冲区空或满事件可以通过 DMA 通道中断服务请求来发出信号。DMA 通道中断控制 ADICR.INTCT 应配置为 10B,中断触发检测值 ADICR.IRDV 应为 0000B。当传输计数等于零时,DMA 通道将发出 DMA 通道中断服务请求。

DMA 通道中断处理程序可以查询 DMA 以确定是哪个 DMA 通道产生了中断服务请求。软件可以初始化 DMA 通道,准备重新启动双缓冲操作。

Active Buffer Overflow

如果数据速率比DMA能够将数据传输到其中一个缓冲区快,那么将发生TRL事件。

18.3.4.8.5 Software Switch
在 DMA 事务完成且活动缓冲区已满之前,软件应通过设置 DMA 通道的 CHCSR.SWB 来将数据流从活动缓冲区重定向到另一个缓冲区。如果一个 ME(可能是特定模块)正在积极为配置为双缓冲的 DMA 通道提供服务,那么当前的 DMA 传输应在缓冲区切换之前完成。在 DMA 传输完成后,DMA 应:

自动使用 CHCFGR.TREL 重新加载 DMA 通道的 CHCSR.TCOUNT。
切换地址指针:
缓冲区 0 地址指针(源地址或目标地址)。
缓冲区 1 地址指针(影子地址)。
TCS 地址控制因素保持不变。当下一次 DMA 请求被接收时,控制新缓冲区填充或读取的下一个 DMA 事务将开始。
如果软件通过设置 DMA 通道的 CHCSR.SWB = 1B 来重定向数据流,软件应轮询 DMA 通道的 CHCSR.FROZEN 和 CHCSR.BUFFER。如果软件读取到 DMA 通道的 CHCSR.FROZEN = 1B 以及活动缓冲区发生转换,软件可以开始分析冻结的缓冲区。

如果一个 DMA 通道被配置为仅软件切换,并且在 DMA 接收到软件切换之前 DMA 事务已完成,那么 DMA 应报告一个 TRL 事件(DMA 通道的 TSR.TRL = 1B)。如果 DMA 通道的启用 TRL 位被设置(TSR.ETRL = 1B),则 DMA 应触发一个 DMA RP 错误中断服务请求。

18.3.4.8.6 Automatic Hardware Switch
当读取或填充活动缓冲区的 DMA 事务完成时,DMA 将自动从活动缓冲区切换到另一个缓冲区。在切换缓冲区时,DMA 通道的 CHCSR.FROZEN 位被设置,以指示一个缓冲区被冻结并可用于循环软件任务。DMA 事务的完成可以通过 DMA 通道中断服务请求来发出信号。当 DMA 事务完成且 ME 的 CHSR.TCOUNT 等于 0000H 时,DMA 应:

使用 CHCFGR.TREL 自动重新加载 DMA 通道的 CHCSR.TCOUNT。
切换地址指针以选择另一个缓冲区:
缓冲区 0 地址指针(源地址或目标地址)。
缓冲区 1 地址指针(影子地址)。
DMA 通道的 TCS 地址控制因素保持不变。当接收到 DMA 请求时,控制新缓冲区填充或读取的下一个 DMA 事务将开始。
如果 DMA 通道的 CHCSR.FROZEN 等于 1B,自动硬件切换将不会发生,并且 DMA 应报告一个 TRL 事件(DMA 通道的 TSR.TRL = 1B)。如果 DMA 通道的启用 TRL 位被设置(TSR.ETRL = 1B),则 DMA 应触发一个 DMA RP 错误中断服务请求。

18.3.4.8.7 双缓冲的应用
一个典型的 DMA 双缓冲应用如图 214 所示:

DMA 通道 m 被配置为 DMA 双目标缓冲。该 DMA 通道将传感器生成的输入数据移入活动目标缓冲区。
一个循环软件任务处理存储在冻结的目标缓冲区中的输入数据,并将输出写入冻结的源缓冲区。CPU 控制源缓冲区和目标缓冲区的切换。
DMA 通道 n 被配置为 DMA 双源缓冲。该 DMA 通道将处理后的数据从冻结的源缓冲区移动到执行器。
系统配置应平衡输入数据速率、循环软件任务的持续时间和缓冲区大小,以防止 TRL 事件。



Figure 214 Application of Double Buffering







18.3.4.9 链表操作
链表操作是 DMA 通道功能的扩展,以支持更灵活地使用 DMA。链表操作应由同一 DMA 通道执行的一系列 DMA 事务组成。每个 DMA 事务应具有唯一的 TCS(可能是特定的控制参数集)。源和目标区域不必存在于连续的内存区域中。

如果一个 DMA 通道被配置为链表操作,那么一旦 ME(可能是特定模块)完成当前的 DMA 事务,ME 应从内存中读取下一个 TCS,并覆盖 DMA 通道在 DMARAM(可能是特定的存储区域)位置的当前 TCS。当前的 DMA 事务使用 32 字节对齐的地址指针指向存储在内部或外部内存中的下一个 TCS。DMA 应从字 0 开始向上读取下一个 TCS。

链表操作中的 DMA 事务数量没有限制。链表操作中的第一个 DMA 事务应由 DMA 硬件请求或 DMA 软件请求启动。后续的 DMA 事务还可以由 DMA 自动启动请求启动。

每个 DMA 通道支持以下类型的链表操作:

DMA 链表(DMALL)。
累加链表(ACCLL)。
安全链表(SAFLL)。
条件链表(CONLL)。
18.3.4.9.1 DMA自动启动请求
如果在下一个 TCS(传输控制状态,可能是特定的控制结构)中选择了 DMA 自动启动请求(CHCSR.SCH = 1B),那么下一个 DMA 事务将由 ME(可能是特定模块)启动。访问挂起位 TSR.CH 将被设置。DMA 应执行仲裁序列以确定具有最高优先级的 DMA 请求。DMA 自动启动请求将绕过中断路由器,从而减少多个 DMA 事务的累积延迟。

18.3.4.9.2非链表操作
如果下一个 TCS 未被配置为链表操作,那么下一个 TCS 应被配置为移动操作。此时 DMA 通道退出链表操作。DMA 自动启动请求不应启动下一个 DMA 事务。

18.3.4.9.3 最后一次DMA事务
DMA 通道中断服务请求可用于指示一系列链表操作中的最后一个 DMA 事务的完成。最后一个 DMA 事务将加载下一个 TCS(传输控制状态,可能是特定的控制结构)。不应选择 DMA 自动启动请求。

18.3.4.9.4 循环链表操作
可以为循环操作配置链表操作序列。同一系列的DMA事务应该被重复。

18.3.4.9.5 DMA链表(DMALL)
DMA 通道(如图 217 所示)被配置为 DMALL(DMA 链表)操作。DMA 通道的影子地址寄存器(SHADR)存储指向下一个 TCS 的 32 位地址指针。一旦当前的 DMA 事务完成,ME(可能是特定模块)读取下一个 TCS 并将其存储在 DMARAM(可能是特定的存储区域)中。

DMA地址校验和和DMA数据校验和

软件应配置在第一个 DMA 事务期间使用的 DMA 地址校验和以及 DMA 数据校验和的初始值。当 ME(可能是特定模块)读取下一个 TCS(传输控制状态,可能是特定的控制结构)时,DMA 地址校验和以及 DMA 数据校验和应初始化为 00000000H。

18.3.4.9.6 累加链表(ACCLL)
累加链表(ACCLL)是 DMA 链表(DMALL)的一种变体,在内存中的占用空间(大小和结构)完全相同。在 ACCLL 中,发送数据校验和(SDCRC)与接收数据校验和(RDCRC)会在各个 DMA 事务之间进行累加。

DMA 地址校验和与 DMA 数据校验和

当下一个 TCS(传输控制状态)被加载到 DMA 通道中时,DMA 地址校验和与 DMA 数据校验和不会被覆盖。只要 DMA 通道被配置为累加链表(ACCLL),DMA 地址校验和与 DMA 数据校验和会在所有 DMA 事务中进行计算。

18.3.4.9.7安全链表(SAFLL)
DMA通道(见图218)是为SAFLL操作配置的。SAFLL提供针对软件错误的保护。如果链表操作序列中的地址指针被错误地写入,那么地址指针可能指向内存的任何随机区域,并从错误的位置加载下一个TCS并执行它。只要为SAFLL配置了DMA通道,ME就会检查计算的DMA地址校验和是否与存储在下一个TCS中的预期DMA地址校验和匹配。

DMA地址校验和

用户需要将预期的 DMA 地址校验和值加载到发送数据校验和(SDCRC)字中。一旦 ME(可能是特定模块)从内存中读取下一个 TCS,ME 会将当前 DMA 事务计算出的 DMA 地址校验和与存储在下一个 TCS 中的预期 DMA 地址校验和进行比较。如果校验和匹配,那么 DMA 继续执行下一个 TCS。如果校验和不匹配,那么 ME 会记录一个安全链表(SAFLL)DMA 地址校验和错误,并触发一个 DMA RP 错误中断服务请求。DMA 会停止链表操作的执行。假设在链表操作序列中所有的 DMA 地址校验和值都匹配,那么 DMA 地址校验和会在所有 DMA 事务中进行计算。

DMA数据校验和

当新的TCS被加载到DMA通道中时,DMA数据校验和不被覆盖。在所有DMA事务中计算DMA数据校验和。



18.3.4.9.8 条件链表(CONLL)
链表的一种特殊用法是条件链表(CONLL,如图 219 所示)。选择指向下一个 TCS 的地址指针是由一个条件状态决定的。CONLL 使用影子地址(SHADR)以及源地址和目标地址的 CRC 寄存器(SDCRCR)作为地址指针。

CONLL 操作仅限于 8 位 DMA 移动(CHCFGR.CHDW = 000B)。源地址不应配置为缓存地址(段 8 和 9)。应配置为非缓存地址(段 A 和 B),以防止 ME 读取缓冲区重新对齐移动数据。



控制模式检测

DMA通道(图220)是为CONLL配置的。TCS选择PRR0进行模式比较。



在每次 DMA 移动期间,模式检测逻辑确定地址指针的选择:

如果由 PAT02 掩码的 PAT00 与存储在 MEm0R RD00 中的 DMA 移动数据匹配,那么一旦 DMA 移动完成,ME(可能是特定模块)应使用从存储在 SHADR 中的地址读取的下一个 TCS 加载 DMA 通道。
如果由 PAT03 掩码的 PAT01 与存储在 MEm0R RD00 中的 DMA 移动数据匹配,那么一旦 DMA 移动完成,ME 应使用从存储在 SDCRCR 中的地址读取的下一个 TCS 加载 DMA 通道。
如果由 PAT02 掩码的 PAT00 和由 PAT03 掩码的 PAT01 都与存储在 MEm0R RD00 中的 DMA 移动数据匹配,那么一旦 ME 应使用从存储在 SHADR 中的地址读取的下一个 TCS 加载 DMA 通道。
如果没有模式匹配,则 ME 继续进行 DMA 事务。
如果检测到模式匹配,则:

DMA 事务以当前的 DMA 移动结束。
当 DMA 写移动完成时,DMA 通道的 TSR.CH 将被清除。
当前DMA事务的完成

如果当前的 DMA 事务在 ME 的 CHSR.TCOUNT = 0D 时完成且没有模式匹配,那么条件链表(CONLL)将使用从存储在 SHADR 中的地址读取的下一个 TCS 加载 DMA 通道。

多模式检测条件

用户可以有意地编程,使得由 PAT02 掩码的 PAT00 不与存储在 MEm0R RD00 中的 DMA 移动数据匹配,从而在条件链表(CONLL)中跨越一系列 DMA 事务进行转换。对于每个 DMA 事务,用户可以编程一系列不同的由 PAT03 掩码的 PAT01 值,并测试每个值是否与存储在 MEm0R RD00 中的当前 DMA 移动数据匹配。如果由 PAT03 掩码的 PAT01 与存储在 MEm0R RD00 中的当前 DMA 移动数据匹配,那么一旦 DMA 移动完成,ME(可能是特定模块)应使用从存储在 SDCRCR 中的地址读取的下一个 TCS 加载 DMA 通道。

18.3.4.10 DMA数据校验和
为了支持增强的数据完整性检查,DMA 在 DMA 移动数据通过 DMA 时,根据 IEEE 802.3 标准计算一个 32 位的读取数据循环冗余校验和(RDCRC)。

移动操作或影子操作:
为了计算 DMA 移动数据的 DMA 数据校验和,除了针对 DMA 移动数据的大小进行标准的 DMA 事务配置(源地址等)之外,还必须初始化 DMA 通道的 RDCRCR(例如,写入 00000000H 或其他期望的初始值)。
如果在 DMA 移动期间没有报告错误或重试事件,那么 ME(可能是特定模块)会为每个 DMA 移动计算一个更新的 DMA 数据校验和值。在 DMA 事务完成时,ME 将 DMA 数据校验和存储在 DMA 通道的 RDCRCR 中。软件可以将计算出的 DMA 数据校验和与预期的 DMA 数据校验和进行比较,以验证 DMA 移动数据的完整性。

Swap Byte(交换字节)

DMA 数据校验和应针对所有 DMA 通道数据宽度进行计算,并且可以配置为交换字节顺序(如图 221 所示)。如果选择了 DMA 通道交换字节(CHCFGR.SWAP = 1B),那么在进行 DMA 数据校验和计算之前,字节的顺序会被交换。大端序输入会被转换为小端序,反之亦然。如果 DMA 通道被配置为 8 位通道数据宽度(CHCFGR.CHDW = 000B),那么交换字节没有效果。

交换字节不会改变 DMA 读移动和 DMA 写移动之间的数据字节顺序。

DMA 时间戳:如果 DMA 通道被配置为附加一个 DMA 时间戳,那么 DMA 时间戳不属于 DMA 数据校验和计算的一部分。

双缓冲操作:DMA 数据校验和会在移入两个缓冲区的所有 DMA 移动数据中进行累加。软件可以在软件切换后且在下一个数据样本被接收之前重新初始化 DMA 数据校验和。

DMA 链表(DMALL):在每个 DMA 事务开始时,DMA 数据校验和被初始化为 00000000H。

累加链表(ACCLL)、安全链表(SAFLL)和条件链表(CONLL):DMA 数据校验和会在链表中的所有 DMA 事务中进行累加。



18.3.4.11 DMARAM初始化
在断言应用程序重置时,DMA应将所有DMARAM数据初始化为全零,以防止在应用程序中触发DMARAM数据完整性错误。

18.3.5 Move Engine
任何 ME(模块执行器)都应处理来自任何 DMA 通道的 DMA 请求。一旦一个 DMA 通道在仲裁中获胜,TCS(传输控制状态)就会从 DMARAM(可能是特定存储区域)复制到 ME 的活动通道寄存器中,并且 DMA 请求会得到处理。ME 请求所需的总线,并根据活动 DMA 通道的 TCS 参数加载或存储数据。如果源或目标不可用,ME 能够等待。

ME 对 DMA 传输(由多个 DMA 移动组成)的处理不能被中断,并且总是会完成。DMA 通道中断、复位、停止请求或调试暂停只有在当前 DMA 传输完成时才会生效。错误情况会被报告。在 DMA 事务完成时或者当 DMA 通道在通道仲裁中失败时,ME 应将 TCS 写回 DMARAM。

18.3.5.1 ME读缓冲区
ME(模块执行器)将 DMA 读移动数据存储在八个 32 位读寄存器中。如果一个 DMA 通道被配置为 8 位、16 位、32 位、64 位或 128 位通道数据宽度,并且 DMA 读移动是到一个缓存地址,那么 ME 应将对片上总线的读访问转换为对 32 字节对齐地址的 BTR4 访问。ME 将 DMA 读移动数据与 32 字节对齐地址一起存储在八个 ME 读寄存器中,以作为 ME 读缓冲区,如下所示:

Hit,如果下一个 DMA 读移动的 32 字节对齐地址与存储在 ME 读缓冲区中的 32 字节对齐地址匹配,那么 DMA 读移动数据从 ME 读缓冲区中读取。不会发生对片上总线的读访问。
Miss,如果下一个 DMA 读移动的 32 字节对齐地址与存储在 ME 读缓冲区中的 32 字节对齐地址不匹配,那么 ME 使 ME 缓冲区的内容无效。ME 通过对片上总线执行读访问来执行 DMA 读移动。
ME 在 DMA 传输开始时使 ME 读缓冲区无效。

18.3.5.1.1 DMA地址校验和
如果 DMA 读移动是到一个缓存地址,那么 ME(可能是特定模块)应使用 32 字节对齐的地址源地址来计算 DMA 地址校验和。

18.3.5.2 ME Error Conditions
ME(可能是特定模块)报告 TCS(传输控制状态)以及源 / 目标错误状态。在存在多个错误的情况下,错误位会根据错误条件进行设置(即可能会设置多个错误标志)。对于所有的 ME 错误情况,DMA 应执行以下操作:

ME 应在 ME 最后错误通道位字段 ERRSR.LEC 中记录 DMA 通道的编号。
如果 DMA 通道已启用 DMA 通道硬件请求,那么 DMA 通道的 TSR.HTRE 将被清除。
DMARAM 完整性错误:
当一个 DMA 通道在仲裁中获胜时,ME 会访问 DMARAM 以读取 TCS。如果检测到 ECC(错误检查和纠正)错误,ME 应设置错误标志 ERRSRm.RAMER。此时 DMA 事务不应发生。

源和目标错误

SER(源错误)和 DER(目标错误)包括访问保护错误和不支持的总线事务类型。

ME 的 SER 标志 ERRSR.SER 表示在从源地址进行 DMA 读移动期间发生了错误。
ME 的 DER 错误标志 ERRSR.DER 表示在向目标地址进行 DMA 写移动期间发生了错误。
如果报告了 SER 或 DER,那么 ME 完成 DMA 事务。如果在 DMA 读移动期间报告了 SER,那么 DMA 写移动不会执行,但目标地址会被更新。

ME 的总线错误标志 ERRSR.SPBER 表示在 DMA 移动期间发生了 SPB 总线错误。
ME 的总线错误标志 ERRSR.SRIER 表示在 DMA 移动期间发生了 SRI 总线错误。
链表操作TCS加载错误

在 DMALL(DMA 链表)、ACCL(累加链表)、SAFLL(安全链表)和 CONLL(条件链表)操作期间,如果在从片上总线加载下一个 TCS(传输控制状态)时报告了错误,ME(可能是特定模块)应设置 ME 错误标志 ERRSR.DLLER。链表操作应被中止,并且 DMA 通道事务请求状态位 TSR.CH 位应被清除。

DMA地址校验和错误

ME(可能是特定模块)会将当前 DMA 事务计算出的 DMA 地址校验和与存储在下一个 TCS(传输控制状态)中的预期 DMA 地址校验和进行比较。如果校验和不匹配,那么 ME 应设置 ME 错误标志 ERRSR.SLLER。

18.3.5.3 Error Interrupt Service Request
18.3.5.3.1 DMARAM完整性错误中断服务请求
RAMER 表示 ME(可能是特定模块)检测到 DMARAM(可能是特定存储区域)完整性错误:

RAMER 由 ME 错误状态标志 ERRSRm.RAMER 指示。
DMA(直接内存访问)应触发一个 DMA RP(可能是特定的错误处理机制)错误中断服务请求。
如果软件设置 CLREm.CRAMER,DMA 应清除错误状态标志 ERRSRm.RAMER。
18.3.5.3.2源目的中断业务请求错误
ME(可能是特定模块)应检测以下错误情况(见图 222):

SER(源错误)表示在从源地址进行 DMA 读移动期间发生了总线错误。
SER 由 ME 错误状态标志 ERRSRm.SER 指示。
如果 EERm.ESER 被设置,DMA 应触发一个 DMA RP 错误中断服务请求。
如果软件设置 CLREm.CSER,DMA 应清除错误状态标志 ERRSRm.SER。
DER(目标错误)表示在向目标地址进行 DMA 写移动期间发生了总线错误。
DER 由 ME 错误状态标志 ERRSRm.DER 指示。
如果 EERm.EDER 被设置,DMA 应触发一个 DMA RP 错误中断服务请求。
如果软件设置 CLREm.CDER,DMA 应清除错误状态标志 ERRSRm.DER。



18.3.5.3.3链表操作TCS中断业务请求错误
DLLER 表示 ME(可能是特定模块)在从片上总线加载下一个 TCS(传输控制状态)时检测到错误。

DLLER 由 ME 错误状态标志 ERRSRm.DLLER 指示。
DMA(直接内存访问)应触发一个 DMA RP 错误中断服务请求。
如果软件设置 CLREm.CDLLER,DMA 应清除错误状态标志 ERRSRm.DLLER。



18.3.5.3.4 SAFLL DMA地址校验和错误中断业务请求
SLLER 表示 ME(可能是特定模块)检测到计算出的 DMA 地址校验和与预期的 DMA 地址校验和之间存在差异。

SLLER 由 ME 错误状态标志 ERRSRm.SLLER 指示。
DMA(直接内存访问)应触发一个 DMA RP 错误中断服务请求。
如果软件设置 CLREm.CSLLER,DMA 应清除错误状态标志 ERRSRm.SLLER。
18.3.6 DMA On Chip Bus
18.3.6.1 DMA片上总线开关
DMA(直接内存访问)片上总线交换机(如图 224 所示)在来自 ME(可能是特定模块)和 Cerberus(可能是特定的硬件模块)的每个片上总线请求之间进行仲裁。整个内存映射的地址路由将请求引导至片上总线主接口。



18.3.6.1.1 SRI主接口
对于生产设备,DMA 应实例化一个 SRI 主接口(MIF0)。对于仿真设备,DMA 可以实例化额外的 SRI 主接口(MIF1 和 MIF2),如下使用:

DMA 移动到 EMEM(可能是特定的存储区域)存储体 0 和 2 应通过 SRI 主接口 MIF1 进行路由。
DMA 移动到 EMEM 存储体 1 和 3 应通过 SRI 主接口 MIF2 进行路由。
18.3.6.1.2 DMA片上总线交换机仲裁
如果 ME(可能是特定模块)和 Cerberus(可能是特定硬件模块)的请求发生冲突,DMA 片上总线交换机优先级(见表 577)决定仲裁结果。



片上总线支持流水线操作。高优先级和低优先级的 ME0、ME1 和 Cerberus 请求可以进行流水线处理。

18.3.6.2片上总线主接口
芯片总线主接口上的DMA实例到SPB总线和到SRI总线。

DMA SPB 主接口支持:

单数据读和写事务(8 位、16 位、32 位)。
从不同的访问请求者(ME 和 Cerberus)生成交错的 FPI 事务。
在重试后取消请求,以防止总线阻塞。
来自不同源的乱序事务,以避免不同的访问请求者(ME 和 Cerberus)之间的副作用(阻塞)。
DMA 的 SRI 主接口支持:

单数据读和写事务(8 位、16 位、32 位、64 位)。
块传输读和写事务(128 位、256 位)。
从不同的访问请求者(ME 和 Cerberus)生成交错的 SRI 事务。
读 - 修改 - 写(RMW)支持:
DMA 不支持对片上总线的读 - 修改 - 写访问。

18.3.6.3 SRI告警信息
SRI 总线协议通过扩展协议以包括 ECC(错误检查和纠正)保护来支持在源和目的地之间可靠地传输数据。在 DMA 读移动期间,ME(可能是特定模块)检查从 SRI 总线源接收的数据的完整性。ME 将带有 ECC 保护的 DMA 移动数据存储在 ME 寄存器中。在 DMA 写移动期间,ME 为对 SRI 目的地的写访问生成符合 SRI 总线协议的 ECC 信息。ME 应在以下位置检查 DMA 移动数据的数据完整性:

在 DMA 读移动期间,ME 检查从 SRI 源地址接收的数据的完整性。
在 DMA 写移动期间,ME 检查存储在 ME 读寄存器中的数据的完整性。
如果 ME 检测到 ECC 错误,那么 DMA 应向 SMU(可能是特定的管理单元)触发 SRI 警报。
系统外设总线:
从 SPB(系统外设总线)源接收的 DMA 读移动数据没有 ECC 保护。在 ME 将数据和 ECC 存储在 ME 读寄存器中之前,ME 应生成 ECC 保护。

数据完整性测试:
软件可以触发 SRI 警报。CPU(中央处理器,CPUx_SEGEN.ADFLIP = 01B 且 CPUx_SEGEN.ADTYPE = 10B)可以用于在用作 DMA 读移动源的 CPU 从接口中生成 ECC 错误条件。当数据通过 DMA 时,它将生成 ECC 错误条件。

18.3.7 Power Modes
DMA 禁用状态位(DMA_CLC.DISS)报告内部 DMA 时钟信号(fDMA)的状态。在应用复位被断言后,DMA 是启用的(DMA_CLC.DISS = 0B),即 fDMA 是启用的。

18.3.7.1 Sleep Mode
DMA 应如下进入睡眠模式:

如果睡眠模式使能控制位被启用(DMA_CLC.EDIS = 0B)且 DMA 睡眠控制被激活,当 ME(模块执行器)完成任何未完成的 DMA 传输时,DMA 应进入睡眠模式。
如果软件写入 DMA 禁用请求(DMA_CLC.DISR = 1B),当 ME 完成任何未完成的 DMA 传输时,DMA 应进入睡眠模式。
如果 DMA 处于睡眠模式(DMA_CLC.DISS = 1B):

DMA 应禁用 fDMA 以最小化 DMA 功耗。
DMA 特殊功能寄存器(SFR):
如果 DMA 处于睡眠模式且软件写入 DMA_CLC,DMA 应更新 DMA_CLC。
如果 DMA 处于睡眠模式且软件写入其他 DMA SFR,DMA 应返回总线错误。
如果 DMA 处于睡眠模式且软件读取 DMA SFR,DMA 应完成读访问。
DMARAM(可能是特定存储区域):
如果 DMA 处于睡眠模式且软件写入 DMARAM,DMA 应返回总线错误。
如果 DMA 处于睡眠模式且软件读取 DMARAM,DMA 应完成读访问。
如果 DMA 睡眠控制被取消激活且软件清除 DMA 禁用请求(DMA_CLC.DISR = 0B):

DMA 应启用 fDMA。
DMA 应恢复处理 DMA 请求。
18.4 Register
见数据手册1489页。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_50882387/article/details/142969156

使用特权

评论回复
沙发
AdaMaYun| | 2024-11-11 13:07 | 只看该作者
DMA是自动搬运的

使用特权

评论回复
板凳
中国龙芯CDX| | 2024-11-28 10:34 | 只看该作者
直接存储器访问在无需中央处理器(CPU)干预的情况下将数据从源模块移动到目标模块。

使用特权

评论回复
地板
Amazingxixixi| | 2024-12-2 11:35 | 只看该作者
非常不错的文章,总结精炼,分析到位。

使用特权

评论回复
5
suncat0504| | 2024-12-2 14:25 | 只看该作者
有了DMA,提高了数据传输速度,解放了中央处理器。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

4130

帖子

5

粉丝