1.50 特 性 24 通 道 八 个 优 先 级 别 128 个 数 据 操 作 描 述 符 (Transaction Descriptor, TD) 8 位 16 位 32 位 数 据 传 输 可 配 置 源 和 目 标 地 址 支 持 字 节 序 兼 容 数 据 传 输 完 成 后 可 生 成 中 断 用 于 协 助 应 用 开 发 的 DMA 向 导 概 述 DMA 组 件 使 数 据 能 传 输 出 入 存 储 器 组 件 和 寄 存 器 控 制 器 支 持 8 位 宽 16 位 宽 和 32 位 宽 的 数 据 传 输, 并 且 可 以 进 行 配 置, 以 在 具 有 不 同 字 节 序 的 源 和 目 标 之 间 传 输 数 据 能 将 TD 串 接 在 一 起 进 行 复 杂 操 作 可 根 据 电 平 或 上 升 沿 信 号 触 发 DMA 更 多 详 细 信 息, 请 参 考 硬 件 要 求 参 数 选 择 Cypress Semiconductor Corporation 198 Champion Court San Jose, CA 95134-1709 408-943-2600 Document number: 001-67955 Rev *A 第 1 页, 共 26 页
何 时 使 用 DMA 组 件 当 您 要 释 放 CPU 的 传 输 数 据 任 务 负 担, 或 者 当 需 要 通 过 可 预 先 设 置 的 可 预 测 方 式 传 输 数 据 时, DMA 组 件 是 很 有 用 的 下 面 是 几 种 基 本 的 使 用 案 例 : 存 储 器 到 存 储 器 存 储 器 到 外 设 外 设 到 存 储 器 外 设 到 外 设 TD 可 以 单 独 执 行 或 者 链 接 在 一 起 以 执 行 复 杂 的 传 输 DMA Wizard(DMA 向 导 ) PSoC Creator 提 供 了 DMA 向 导, 以 帮 助 快 速 精 确 地 开 发 使 用 DMA 的 应 用 向 导 会 全 程 引 导 您 定 义 TD 并 生 成 必 需 的 C 代 码, 您 可 以 将 该 代 码 复 制 并 粘 贴 到 您 的 应 用 中 通 过 PSoC Creator 的 Tools( 工 具 ) 菜 单 中 启 动 向 导 相 关 详 细 信 息, 请 参 见 PSoC Creator 帮 助 PSoC 3 Addresses(PSoC 3 地 址 ) 在 PSoC 3 中, 除 闪 存 外,DMA 传 输 中 涉 及 的 所 有 位 置 都 在 存 储 器 的 前 64 K 空 间 中 对 于 除 闪 存 之 外 的 所 有 位 置, 地 址 的 高 16 位 的 值 必 须 为 0 Keil 编 译 器 无 法 识 别 前 64 K 空 间 以 外 的 地 址, 而 是 用 高 16 位 储 存 其 他 信 息, 导 致 高 位 字 节 不 为 0 因 此, 不 能 直 接 使 用 指 向 该 位 置 指 针 的 高 16 位 更 多 详 细 信 息, 请 参 见 Keil 中 的 泛 型 指 针 对 于 闪 存 而 言, 地 址 的 高 16 位 的 使 用 正 确 值 为 : HI16(CYDEV_FLS_BASE) 这 是 由 编 译 器 完 成 的 具 体 处 理 要 创 建 在 PSoC 3 和 PSoC 5 中 都 能 够 正 确 运 行 的 代 码, 可 以 使 用 以 下 代 码 格 式 假 设 "src" 为 闪 存 中 的 变 量,"dst" 为 SRAM 中 的 变 量 : #if (defined( C51 )) /* PSoC 3 - Source is Flash */ dmachan = DMA_1_DmaInitialize(1, 0, HI16(CYDEV_FLS_BASE), 0); #else 第 2 页, 共 26 页
/* PSoC 5 */ dmachan = DMA_1_DmaInitialize(1, 0, HI16(src), HI16(dst)); #endif PSoC 5 SRAM Access( 访 问 ) 在 PSoC 5 中,DMAC 无 法 从 0x1FFF8000 到 0x1FFFFFFF 访 问 SRAM, 但 是 可 以 访 问 同 一 存 储 器 的 0x20008000 到 0x2000FFFF CPU 访 问 : 0x1FFF8000-0x1FFFFFFF C-BUS 32KB 0x20000000-0x20007FFF S-BUS 32KB DMA 访 问 : 0x20000000-0x20007FFF S-BUS 32KB 0x20008000-0x2000FFFF C-BUS 32KB 重 新 映 射 由 设 置 DMA 的 API 自 动 处 理 传 递 至 API 的 参 数 应 为 由 DMA API 自 动 处 理 的 CPU 原 生 地 址 的 高 16 位 和 低 16 位 请 注 意, 当 DMA 引 擎 增 加 地 址 时, 仅 增 加 低 16 位 因 此, 紧 跟 0x2000FFFF 的 地 址 为 0x20000000, 这 使 得 存 储 器 空 间 仍 可 用 作 存 储 器 的 连 续 64-KB 字 节 存 储 器 块 Input/Output Connections( 输 入 / 输 出 连 接 ) 本 节 介 绍 DMA 的 各 种 输 入 和 输 出 连 接 I/O 列 表 中 的 星 号 (*) 表 示, 在 I/O 说 明 中 列 出 的 情 况 下, 该 I/O 可 能 隐 藏 在 该 符 号 中 nrq Output( 输 出 ) nrq 终 端 可 能 连 接 至 中 断, 或 连 接 至 组 件, 以 将 DMA 传 输 完 成 的 信 息 传 送 至 组 件 当 DMA 传 输 完 成 时,DMA 在 nrq 上 生 成 一 个 宽 度 为 2 总 线 时 钟 的 脉 冲 drq Input( 输 入 ) * drq 终 端 连 接 至 一 个 能 够 请 求 DMA 操 作 的 组 件 第 3 页, 共 26 页
drq 输 入 对 电 平 或 边 沿 敏 感 如 果 drq 为 电 平 敏 感, 当 drq 激 活 后,DMA 请 求 将 持 续 发 生 如 果 drq 为 边 沿 敏 感,DMA 请 求 的 宽 度 至 少 应 为 一 个 总 线 时 钟 周 期 trq Input( 输 入 ) * trq 终 端 连 接 至 一 个 能 够 终 止 DMA 操 作 的 组 件 当 组 件 获 知 无 数 据 可 用 时, 可 能 需 要 提 供 DMA 的 数 据 组 件 使 用 该 信 号 终 止 操 作 当 任 务 链 中 的 当 前 TD 被 终 止 时, 它 也 就 完 成, 如 同 传 输 计 数 完 成 一 样 因 此, 是 否 终 止 操 作, 取 决 于 链 中 是 否 有 其 他 TD 以 及 定 义 的 数 据 操 作 是 何 种 类 型 ( 例 如, 乒 乓 循 环 自 动 重 复 等 ) 该 信 号 仅 在 通 道 尝 试 传 输 数 据 时 使 用 会 忽 略 其 他 时 间 内 该 线 路 的 上 升 沿 Component Parameters( 组 件 参 数 ) 将 一 个 DMA 组 件 拖 放 到 您 的 设 计 上, 并 双 击 以 打 开 配 置 对 话 框 DMA 提 供 以 下 参 数 第 4 页, 共 26 页
Hardware Request( 硬 件 要 求 ) 该 参 数 配 置 可 能 处 理 DMA 触 发 的 波 形 类 型 除 禁 用 之 外 的 所 有 选 项 均 添 加 了 drq 终 端, 该 终 端 使 硬 件 能 够 发 出 DMA 请 求 可 用 的 选 项 有 : Disabled( 禁 用 ) 不 显 示 drq 终 端 在 这 种 情 况 下, 只 能 通 过 CPU 触 发 DMA Derived( 派 生 ) 连 接 到 固 定 功 能 块 (I 2 C USB CAN 等 ) 时, 检 查 drq 的 驱 动, 派 生 出 它 连 接 时 所 依 据 的 DMA 类 型 该 自 动 分 配 根 据 器 件 数 据 手 册 中 的 信 息 进 行 如 果 未 连 接 至 固 定 功 能 块, 则 使 用 上 升 沿 选 项 上 升 沿 在 源 信 号 的 上 升 沿 上 触 发 DMA DMA 需 要 根 据 事 件 而 触 发 时, 选 择 该 选 项 例 如, 会 定 期 发 生 的 DMA 将 在 上 升 沿 模 式 中 进 行 配 置, 并 且 DRQ 信 号 可 以 被 连 接 至 速 率 设 置 适 当 的 时 钟 信 号 电 平 将 连 接 至 DMA 的 源 选 为 电 平 敏 感 请 求 在 只 要 满 足 特 定 的 条 件 就 需 要 持 续 触 发 DMA 时, 选 择 该 选 项 这 通 常 针 对 视 FIFO 填 充 电 平 而 触 发 的 DMA 这 是 使 用 通 信 组 件 ( 例 如, I2S) 的 典 型 配 置 Hardware Termination( 硬 件 终 止 ) 该 参 数 可 设 为 启 用 或 禁 用 启 用 添 加 了 trq 终 端, 允 许 终 止 来 自 硬 件 的 DMA 请 求 当 终 端 被 禁 用 时, 只 能 通 过 CPU 请 求 终 止 DMA 传 输, 或 者 等 DMA 完 成 数 据 传 输 时 才 能 终 止 Resources( 资 源 ) Digital Blocks( 数 字 模 块 ) API Memory (Bytes) ( 存 储 器 ( 字 节 )) Datapaths Macro cells Status Registers Control Registers Counter7 Flash RAM ( 随 机 Pins (per External I/O) ( 数 据 路 ( 宏 单 ( 状 态 寄 存 ( 控 制 寄 ( 计 数 器 7 ( 闪 访 问 内 ( 引 脚 ( 每 个 DRQ 径 ) 元 ) 器 ) 存 器 ) ) 存 ) 存 ) 外 部 I/O)) 1 N/A( 不 可 N/A( 不 N/A( 不 可 N/A( 不 N/A( 不 可 2332 7 0 用 ) 可 用 ) 用 ) 可 用 ) 用 ) 第 5 页, 共 26 页
Application Programming Interface( 应 用 程 序 编 程 接 口 ) 应 用 程 序 编 程 接 口 (API) 子 程 序 允 许 您 使 用 软 件 配 置 组 件 下 表 列 出 了 每 个 函 数 的 接 口, 并 进 行 了 说 明 以 下 各 节 将 更 详 细 地 介 绍 每 个 函 数 默 认 情 况 下,PSoC Creator 将 实 例 名 称 "DMA_1" 分 配 给 指 定 设 计 中 组 件 的 第 一 个 实 例 您 可 以 将 该 实 例 重 命 名 为 符 合 标 识 符 语 法 规 则 的 任 意 唯 一 值 实 例 名 称 会 成 为 每 个 全 局 函 数 名 称 变 量 和 常 量 符 号 的 前 缀 出 于 可 读 性 考 虑, 下 表 中 使 用 的 实 例 名 称 为 "DMA" 每 个 DMA 实 例 的 API Function( 函 数 ) Description( 说 明 ) DMA_DmaInitialize() 分 配 一 个 DMA 通 道, 并 将 其 初 始 化, 以 供 调 用 方 使 用 DMA_DmaRelease() 释 放 并 禁 用 与 该 组 件 实 例 相 关 联 的 DMA 通 道 第 6 页, 共 26 页
uint8 DMA_DmaInitialize(uint8 burstcount, uint8 requestperburst, uint16 uppersrcaddress, uint16 upperdestaddress) 分 配 一 个 DMA 通 道, 并 将 其 初 始 化, 以 供 调 用 方 使 用 uint8 burstcount 指 定 该 TD 需 分 割 为 多 大 的 突 发 (1 至 127) 突 发 大 小 应 为 spoke 大 小 的 倍 数 如 果 该 值 为 零, 则 整 个 传 输 在 一 次 突 发 中 完 成 在 这 种 情 况 下,TD 的 传 输 计 数 参 数 决 定 一 次 突 发 中 传 输 的 字 节 数 (uint8) requestperburst: 如 果 完 成 操 作 处 理 要 求 如 此 的 话, 数 据 整 体 可 分 为 多 个 突 发 : Value ( 值 ) Action( 操 作 ) 0 将 自 动 请 求 并 执 行 首 个 突 发 后 的 所 有 后 续 突 发 1 必 须 单 独 请 求 首 个 突 发 后 的 所 有 后 续 突 发 uint16 uppersrcaddress: 源 地 址 的 高 16 位 uint16 upperdestaddress: 目 标 地 址 的 高 16 位 uint8:dma 活 动 的 调 用 方 能 使 用 的 通 道 如 果 无 通 道 剩 余, 则 返 回 DMA_INVALID_CHANNEL (0xFF) void DMA_DmaRelease(void) 释 放 与 该 组 件 实 例 相 关 联 的 通 道 除 非 再 次 调 用 DMA_DmaInitialize(), 否 则 无 法 再 次 使 用 该 通 道 第 7 页, 共 26 页
DMA 库 API( 由 所 有 DMA 实 例 共 享 ) DMA Controller Functions(DMA 控 制 器 函 数 ) Function( 函 数 ) Description( 说 明 ) CyDmacConfigure() 使 用 默 认 值 设 置 DMAC 配 置 寄 存 器 CyDmacError() 从 DMAC 获 取 错 误 位 CyDmacClearError() 清 除 DMAC 错 误 寄 存 器 中 的 错 误 位 CyDmacErrorAddress() 获 取 前 一 次 DMAC 错 误 发 生 的 地 址 void CyDmacConfigure(void) 为 所 有 要 分 配 的 TD 创 建 链 接 列 表 该 函 数 由 启 动 代 码 调 用, 用 户 通 常 无 需 调 用 它 如 果 所 有 DMA 通 道 都 处 于 非 活 动 状 态, 用 户 可 以 调 用 该 函 数 第 8 页, 共 26 页
uint8 CyDmacError(void) 返 回 DMA_ERROR 类 型 的 值, 其 中 包 含 前 一 次 失 败 的 DMA 操 作 的 错 误 类 型 从 DMA_ERROR 类 型 返 回 错 误 数 据 (4 位 ) Bit ( 位 ) Define( 定 义 ) Description( 说 明 ) Bit 3( 位 3) DMAC_PERIPH_ERR 当 外 设 对 总 线 数 据 操 作 做 出 错 误 响 应 时, 设 置 为 1 通 过 写 入 1 进 行 清 除 Bit 2( 位 2) DMAC_UNPOP_ACC 当 尝 试 访 问 无 效 地 址 时, 设 置 为 1 通 过 写 入 1 进 行 清 除 Bit 1( 位 1) DMAC_BUS_TIMEOUT 当 总 线 发 生 超 时 时, 设 置 为 1 通 过 写 入 1 进 行 清 除 超 时 值 由 PHUBCFG 寄 存 器 中 的 BUS_TIMEOUT 字 段 决 定 第 9 页, 共 26 页
void CyDmacClearError(uint8 error) 清 除 DMAC 错 误 寄 存 器 中 的 错 误 位 uint8 error:dma_error 类 型 中 需 清 除 的 错 误 位 的 位 掩 码 Bit( 位 ) Define( 定 义 ) Description( 说 明 ) Bit 3( 位 3) DMAC_PERIPH_ERR 当 外 设 对 总 线 数 据 操 作 做 出 错 误 响 应 时, 设 置 为 1 通 过 写 入 1 进 行 清 除 Bit 2( 位 2) DMAC_UNPOP_ACC 当 尝 试 访 问 无 效 地 址 时, 设 置 为 1 通 过 写 入 1 进 行 清 除 Bit 1( 位 1) DMAC_BUS_TIMEOUT 当 总 线 发 生 超 时 时, 设 置 为 1 通 过 写 入 1 进 行 清 除 超 时 值 由 PHUBCFG 寄 存 器 中 的 BUS_TIMEOUT 字 段 决 定 uint32 CyDmacErrorAddress(void) 当 BUS_TIMEOUT UNPOP_ACC 以 及 PERIPH_ERR 发 生 时, 错 误 地 址 会 被 写 入 错 误 地 址 寄 存 器 并 可 由 该 函 数 读 取 如 果 存 在 多 个 错 误, 则 仅 保 存 首 个 错 误 的 地 址 引 起 错 误 的 地 址 Channel Specific Functions( 通 道 特 定 函 数 ) Function( 函 数 ) Description( 说 明 ) CyDmaChAlloc() 分 配 一 个 DMA 通 道 以 供 调 用 方 使 用 第 10 页, 共 26 页
Function( 函 数 ) Description( 说 明 ) CyDmaChFree() 释 放 由 CyDmaChAlloc() 分 配 的 通 道 CyDmaChEnable() 为 执 行 启 用 DMA 通 道 CyDmaChDisable() 禁 用 DMA 通 道 CyDmaClearPendingDrq() 清 除 一 个 待 处 理 的 DMA 数 据 请 求 CyDmaChPriority() 设 置 DMA 通 道 的 优 先 级 CyDmaChSetExtendedAddress() 设 置 源 和 目 标 地 址 的 高 16 位 CyDmaChSetInitialTd() 设 置 通 道 的 初 始 TD CyDmaChSetRequest() 终 止 一 个 TD 链 一 个 TD 或 启 动 DMA 的 请 求 CyDmaChGetRequest() 检 查 是 否 满 足 CyDmaChSetRequest() 请 求 CyDmaChStatus() 确 定 当 前 TD 的 状 态 CyDmaChSetConfiguration() 设 置 通 道 的 配 置 信 息 uint8 CyDmaChAlloc(void) 从 DMAC 中 分 配 一 个 通 道 以 供 所 有 需 要 通 道 句 柄 的 函 数 使 用 所 分 配 通 道 的 编 号 零 是 有 效 的 通 道 编 号 无 通 道 可 用 时, 则 返 回 DMA_INVALID_CHANNEL 第 11 页, 共 26 页
cystatus CyDmaChFree(uint8 chhandle) 释 放 由 CyDmaChAlloc() 分 配 的 通 道 句 柄 uint8 chhandle:cydmachalloc 或 DMA_DmaInitalize 先 前 返 回 的 句 柄 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 12 页, 共 26 页
cystatus CyDmaChEnable(uint8 chhandle, uint8 preservetds) 启 用 DMA 通 道 软 件 或 硬 件 请 求 仍 必 须 在 通 道 被 执 行 前 发 出 uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 uint8 preservetds: TD 完 成 后, 保 留 原 始 TD 状 态 该 参 数 适 用 于 通 道 中 的 所 有 TD Value ( 值 ) Action( 操 作 ) 0 TD 完 成 后,DMAC 不 会 将 TD 配 置 值 恢 复 到 原 始 状 态, 而 是 保 持 当 前 状 态 1 TD 完 成 后,DMAC 将 恢 复 TD 的 原 始 配 置 值 设 置 了 preservetds 时, 编 号 与 通 道 编 号 相 等 的 TD 槽 变 为 RESERVED 状 态, 即 工 作 寄 存 器 所 在 之 处 例 如, 如 果 您 正 使 用 CH06 并 设 置 了 preservetds,td 槽 6 将 不 可 使 用 DMA 引 擎 将 其 收 回, 留 作 私 用 注 意 如 果 通 道 的 preservetds 被 设 为 0, 请 勿 链 接 回 已 完 成 TD 如 果 TD 已 完 成 被 设 置 为 0 的 通 道 preservetds, 则 传 输 计 数 将 为 0 如 果 启 动 了 一 个 传 输 计 数 为 0 的 TD, 则 该 TD 将 传 输 不 确 定 量 的 数 据 如 果 preservetds 被 设 为 0, 那 么 在 使 用 硬 件 请 求 ( DRQ ) 选 项 时 请 多 加 注 意, 因 为 您 可 能 正 在 请 求 错 误 数 据 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 13 页, 共 26 页
cystatus CyDmaChDisable(uint8 chhandle) 禁 用 DMA 通 道 一 旦 调 用 该 函 数, 则 可 调 用 CyDmaChStatus(), 以 确 定 何 时 禁 用 通 道 以 及 正 在 执 行 哪 些 TD uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM cystatus CyDmaClearPendingDrq(uint8 chhandle) 清 除 待 处 理 的 DMA 数 据 请 求 chhandle:dma 通 道 的 句 柄 如 果 成 功, 则 返 回 CYRET_SUCCESS 或 CYRET_BAD_PARAM cystatus CyDmaChPriority(uint8 chhandle, uint8 priority) 设 置 DMA 通 道 的 优 先 级 当 用 户 想 在 运 行 中 更 改 优 先 级 时, 可 使 用 该 函 数 如 果 DMA 通 道 的 优 先 级 仍 未 改 变, 用 户 可 在.cydwr 文 件 中 配 置 优 先 级 uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 uint8 priority: 要 设 置 的 通 道 优 先 级,0-7 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 14 页, 共 26 页
cystatus CyDmaChSetExtendedAddress(uint8 chhandle, uint16 source, uint16 destination) 为 DMA 通 道 设 置 源 和 目 标 地 址 的 高 16 位 ( 适 用 于 链 中 的 所 有 TD) uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 uint16 source: DMA 传 输 源 的 高 16 位 地 址 uint16 destination DMA 传 输 目 标 的 高 16 位 地 址 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM cystatus CyDmaChSetInitialTd(uint8 chhandle, uint8 starttd) 调 用 CyDmaChEnable() 函 数 时, 为 通 道 设 置 要 执 行 的 初 始 TD uint8 chhandle:cydmachalloc() 或 DMA_DmaInitialize() 之 前 返 回 的 句 柄 uint8 starttd: 设 置 为 与 通 道 相 关 联 的 首 个 TD 的 TD 索 引 零 是 有 效 的 TD 索 引 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 15 页, 共 26 页
cystatus CyDmaChSetRequest(uint8 chhandle, uint8 request) 允 许 调 用 方 终 止 一 个 TD 链, 终 止 单 个 TD, 或 创 建 一 个 直 接 请 求 以 启 动 DMA 通 道 uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 uint8 request: 以 下 常 量 之 一 各 常 量 均 为 3 位 的 值 Request Values( 请 求 值 ) Description( 说 明 ) CPU_REQ CPU_TERM_TD CPU_TERM_CHAIN 创 建 一 个 直 接 请 求 以 启 动 DMA 通 道 终 止 一 个 TD 终 止 一 个 TD 链 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM cystatus CyDmaChGetRequest(uint8 chhandle) 该 函 数 使 CyDmaChSetRequest() 的 调 用 方 能 够 确 定 请 求 是 否 已 完 成 uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 返 回 一 个 3 位 字 段, 该 字 段 对 应 于 请 求 中 描 述 先 前 已 发 布 请 求 状 态 的 3 位 如 果 值 为 零, 则 请 求 已 完 成 如 果 句 柄 无 效, 则 返 回 DMA_INVALID_CHANNEL 第 16 页, 共 26 页
cystatus CyDmaChStatus(uint8 chhandle, uint8 * currenttd, uint8 * state) 确 定 DMA 通 道 的 状 态 uint8 chhandle:cydmachalloc() 或 DMA_DmaInitalize() 先 前 所 返 回 的 句 柄 uint8 * currenttd: 存 储 当 前 TD 索 引 的 地 址 如 果 不 需 要 该 值, 则 可 以 为 NULL( 空 ) uint8 * state: 存 储 通 道 状 态 的 地 址 如 果 不 需 要 该 值, 则 可 以 为 NULL( 空 ) Bit 1 ( 位 1) Bit 0 ( 位 0) STATUS_TD_ACTIVE STATUS_CHAIN_ACTIVE 0: 通 道 当 前 未 处 于 DMAC 的 处 理 中 1: 通 道 当 前 正 处 于 DMAC 的 处 理 中 0:TD 链 处 于 非 活 动 状 态 ; 没 有 DMA 请 求 触 发 新 链 或 者 先 前 的 链 已 完 成 1:DMA 请 求 触 发 了 TD 链 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 17 页, 共 26 页
cystatus CyDmaChSetConfiguration(uint8 chhandle, uint8 burstcount, uint8 requestperburst, uint8 tddone0, uint8 tddone1, uint8 tdstop) 设 置 通 道 的 配 置 信 息 uint8 chhandle:cydmachalloc() 或 DMA_DmaInitialize() 之 前 返 回 的 句 柄 uint8 burstcount 指 定 数 据 传 输 需 分 割 为 多 大 的 突 发 (1 至 127) 如 果 该 值 为 零, 则 整 个 传 输 在 一 次 突 发 中 完 成 (uint8) requestperburst: 数 据 整 体 可 分 为 多 个 突 发, 如 果 完 成 事 务 处 理 必 须 如 此 的 话 : Value ( 值 ) Action( 操 作 ) 0 将 自 动 请 求 并 执 行 首 个 突 发 后 的 所 有 后 续 突 发 1 必 须 单 独 请 求 首 个 突 发 后 的 所 有 后 续 突 发 uint8 tddone0: 选 择 一 个 TERMOUT0 中 断 线 以 发 送 完 成 信 号 该 线 与 nrq 终 端 相 连, 将 确 定 TERMOUT0_SEL 定 义, 并 且 应 按 照 cyfitter.h 所 提 供 的 那 样 进 行 使 用 uint8 tddone1: 选 择 一 个 TERMOUT1 中 断 线 以 发 送 完 成 信 号 该 线 与 nrq 终 端 相 连, 将 确 定 TERMOUT1_SEL 定 义, 并 且 应 按 照 cyfitter.h 所 提 供 的 那 样 进 行 使 用 uint8 tdstop: 选 择 一 个 TERMIN 中 断 线 以 向 DMAC 发 送 终 止 TD 的 信 号 与 trq 终 端 相 连 的 信 号 将 确 定 使 用 哪 一 个 TERMIN( 终 止 请 求 ) 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 chhandle 无 效, 则 返 回 CYRET_BAD_PARAM 数 据 操 作 描 述 符 函 数 Function( 函 数 ) Description( 说 明 ) CyDmaTdAllocate() 从 空 闲 列 表 中 选 取 一 个 TD 以 分 配 进 行 使 用 CyDmaTdFree() 将 一 个 TD 返 回 至 空 闲 列 表 中 CyDmaTdFreeCount() 获 得 可 用 的 空 闲 TD 的 数 量 第 18 页, 共 26 页
CyDmaTdSetConfiguration() 设 置 TD 的 配 置 CyDmaTdGetConfiguration() 获 得 TD 的 配 置 CyDmaTdSetAddress() 设 置 源 和 目 标 地 址 的 低 16 位 CyDmaTdGetAddress() 获 得 源 和 目 标 地 址 的 低 16 位 uint8 CyDmaTdAllocate(void) 分 配 一 个 TD 以 与 分 配 的 DMA 通 道 配 合 使 用 TD 索 引 从 零 开 始, 将 供 调 用 方 使 用 因 为 总 共 有 128 个 TD, 减 去 预 留 TD(0 到 23), 因 此 返 回 值 的 范 围 是 24 到 127, 而 不 是 24 到 128 如 果 无 可 用 的 空 闲 TD, 则 返 回 DMA_INVALID_TD void CyDmaTdFree(uint8 tdhandle) 将 一 个 TD 返 回 至 空 闲 列 表 中 uint8 tdhandle: TD 句 柄 由 CyDmaTdAllocate() API 返 回 第 19 页, 共 26 页
uint8 CyDmaTdFreeCount(void) 返 回 可 分 配 的 空 闲 TD 的 数 量 空 闲 TD 的 数 量 第 20 页, 共 26 页
cystatus CyDmaTdSetConfiguration(uint8 tdhandle, uint16 transfercount, uint8 nexttd, uint8 configuration) 对 TD 进 行 配 置 uint8 tdhandle: CyDmaTdAlloc() 先 前 所 返 回 的 句 柄 uint16 transfercount: 该 TD 数 据 传 输 的 大 小 ( 按 字 节 计 ) 如 果 大 小 为 零, 则 传 输 将 无 限 期 地 进 行 下 去 该 参 数 被 限 制 在 4095 字 节, 如 果 传 递 了 更 大 的 值, 则 TD 根 本 不 会 得 到 初 始 化 uint8 nexttd: TD 链 中 下 一 个 传 输 描 述 符 的 索 引 从 零 开 始 零 是 指 向 下 一 TD 的 有 效 指 针 ; DMA_END_CHAIN_TD 是 链 的 末 端 uint8 配 置 : 存 储 配 置 位 的 位 字 段 Configuration Options( 配 置 选 项 ) Description( 说 明 ) TD_SWAP_EN TD_SWAP_SIZE4 执 行 字 节 序 交 换 交 换 大 小 = 4 字 节 TD_AUTO_EXEC_NEXT 当 前 TD 完 成 后, 链 中 的 下 一 个 TD 将 会 自 动 触 发. TD_TERMIN_EN DMA TD_TERMOUT_EN TD_INC_DST_ADR TD_INC_SRC_ADR 如 果 trq 输 入 线 路 发 生 上 升 沿, 则 终 止 该 TD 在 一 次 突 发 过 程 中 必 须 发 生 上 升 沿 DMAC 仅 在 此 时 对 其 进 行 侦 听 该 TD 完 成 时,TERMOUT 信 号 将 生 成 一 个 脉 冲 请 注 意, 该 选 项 名 称 视 实 例 而 定 : 实 例 名 称 后 加 两 个 下 划 线 本 例 中, 实 例 名 称 为 DMA 根 据 突 发 中 每 个 数 据 操 作 的 大 小 而 定 的 增 量 DST_ADR 根 据 突 发 中 每 个 数 据 操 作 的 大 小 而 定 的 增 量 SRC_ADR 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 tdhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 21 页, 共 26 页
cystatus CyDmaTdGetConfiguration(uint8 tdhandle, uint16 * transfercount, uint8 * nexttd, uint8 * configuration) 检 索 TD 的 配 置 如 果 将 空 指 针 作 为 参 数 传 递, 则 将 跳 过 该 参 数 用 户 可 能 仅 请 求 他 们 感 兴 趣 的 值 uint8 tdhandle: CyDmaTdAlloc() 先 前 所 返 回 的 句 柄 uint16 * transfercount: 存 储 该 TD 数 据 传 输 的 大 小 ( 按 字 节 计 ) 的 地 址 如 果 大 小 为 零, 则 可 能 表 示 TD 已 完 成 其 传 输, 也 可 能 是 TD 正 在 进 行 无 限 期 传 输 uint8 * nexttd: 存 储 TD 链 中 下 一 个 TD 索 引 的 地 址 uint8 * configuration: 存 储 配 置 位 位 字 段 的 地 址 见 CyDmaTdSetConfiguration() 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 tdhandle 无 效, 则 返 回 CYRET_BAD_PARAM 如 果 TD 传 输 计 数 为 N 且 已 执 行, 则 该 传 输 计 数 会 变 为 0 如 果 重 新 执 行 该 TD, 则 传 输 计 数 零 将 解 释 为 无 限 传 输 在 请 求 传 输 计 数 为 零 的 TD 时 要 注 意 cystatus CyDmaTdSetAddress(uint8 tdhandle, uint16 source, uint16 destination) 仅 为 该 TD 设 置 源 和 目 标 地 址 的 低 16 位 uint8 tdhandle: CyDmaTdAlloc() 先 前 所 返 回 的 句 柄 uint16 source: 数 据 传 输 源 的 低 16 位 地 址 uint16 destination 数 据 传 输 目 标 的 低 16 位 地 址 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 tdhandle 无 效, 则 返 回 CYRET_BAD_PARAM 第 22 页, 共 26 页
cystatus CyDmaTdGetAddress(uint8 tdhandle, uint16 * source, uint16 * destination) 仅 为 该 TD 设 置 源 和 目 标 地 址 的 低 16 位 如 果 NULL( 空 ) 被 当 做 指 针 参 数, 则 将 跳 过 该 值 用 户 可 能 仅 需 要 他 们 感 兴 趣 的 值 uint8 tdhandle: CyDmaTdAlloc() 先 前 所 返 回 的 句 柄 uint16 * source: 存 储 数 据 传 输 源 的 低 16 位 地 址 的 地 址 uint16 * destination: 存 储 数 据 传 输 目 标 的 低 16 位 地 址 的 地 址 如 果 成 功, 则 返 回 CYRET_SUCCESS 如 果 tdhandle 无 效, 则 返 回 CYRET_BAD_PARAM Sample Firmware Source Code( 固 件 源 代 码 示 例 ) PSoC Creator 在 查 找 示 例 项 目 对 话 框 中 提 供 了 大 量 包 括 原 理 图 和 代 码 示 例 的 示 例 项 目 要 获 取 组 件 特 定 的 示 例, 请 打 开 组 件 目 录 中 的 对 话 框 或 原 理 图 中 的 组 件 实 例 要 获 取 通 用 的 示 例, 请 打 开 开 始 页 或 File ( 文 件 ) 菜 单 中 的 对 话 框 根 据 需 要, 使 用 对 话 框 中 的 滤 波 器 选 项 可 缩 小 可 选 项 目 的 列 表 更 多 信 息, 请 参 考 PSoC Creator 帮 助 中 的 查 找 示 例 项 目 主 题 DMA Address Portability(DMA 地 址 可 移 植 性 ) 传 递 到 DMA_DmaInitialize() 函 数 或 CyDmaChSetExtendedAddress() 函 数 中 的 高 位 地 址 意 义 对 于 PSoC 3 和 PSoC 5 设 备 而 言 并 不 相 同 PSoC 3 和 PSoC 5 器 件 的 DMA 地 址 不 能 互 相 移 植 高 位 地 址 需 设 置 为 物 理 源 和 目 标 地 址 的 高 16 位 以 下 各 节 提 供 了 示 例 代 码 第 23 页, 共 26 页
PSoC 3 Devices(PSoC 3 器 件 ) 对 于 PSoC 3 器 件, 由 于 高 位 地 址 值 不 对 应 于 指 针 的 高 位 字 节, 所 以 需 要 手 动 设 置 高 位 地 址 值 Keil 编 译 器 ( 与 PSoC 3 器 件 配 合 使 用 ) 用 指 针 的 高 位 字 节 代 表 存 储 器 类 型, 而 不 是 物 理 地 址 要 读 取 闪 存,PSoC 3 器 件 源 的 高 位 地 址 定 义 必 须 为 :CYDEV_FLS_BASE 从 RAM 到 RAM uint8 DMA_1_Chan; uint8 DMA_1_TD[1]; /* DMA Configuration for DMA_1 */ #define DMA_1_BYTES_PER_BURST 16 #define DMA_1_REQUEST_PER_BURST 1 #define DMA_1_SRC_BASE (CYDEV_SRAM_BASE) #define DMA_1_DST_BASE (CYDEV_SRAM_BASE) DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); DMA_1_TD[0] = CyDmaTdAllocate(); CyDmaTdSetConfiguration(DMA_1_TD[0], 128, DMA_INVALID_TD, DMA_1 TD_TERMOUT_EN TD_INC_SRC_ADR TD_INC_DST_ADR); CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)memory1), LO16((uint32)memory2)); CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); CyDmaChEnable(DMA_1_Chan, 1); From Flash to RAM( 从 闪 存 到 RAM) uint8 DMA_1_Chan; uint8 DMA_1_TD[1]; /* DMA Configuration for DMA_1 */ #define DMA_1_BYTES_PER_BURST 1 #define DMA_1_REQUEST_PER_BURST 1 #define DMA_1_SRC_BASE (CYDEV_FLS_BASE) #define DMA_1_DST_BASE (CYDEV_SRAM_BASE) DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); DMA_1_TD[0] = CyDmaTdAllocate(); CyDmaTdSetConfiguration(DMA_1_TD[0], 128, DMA_INVALID_TD, DMA_1 TD_TERMOUT_EN TD_INC_SRC_ADR TD_INC_DST_ADR); CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)buf1), LO16((uint32)buf2)); CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); CyDmaChEnable(DMA_1_Chan, 1); 第 24 页, 共 26 页
From Flash to DAC( 从 闪 存 到 DAC) uint8 DMA_1_Chan; uint8 DMA_1_TD[1]; /* DMA Configuration for DMA_1 */ #define DMA_1_BYTES_PER_BURST 1 #define DMA_1_REQUEST_PER_BURST 1 #define DMA_1_SRC_BASE (CYDEV_FLS_BASE) #define DMA_1_DST_BASE (CYDEV_PERIPH_BASE) DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); DMA_1_TD[0] = CyDmaTdAllocate(); CyDmaTdSetConfiguration(DMA_1_TD[0], 64, DMA_INVALID_TD, TD_INC_SRC_ADR); CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)fFashMem), LO16((uint32)VDAC8_1_Data_PTR)); CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); CyDmaChEnable(DMA_1_Chan, 1); PSoC 5 Devices(PSoC 5 器 件 ) 对 于 PSoC 5 器 件 而 言, 高 位 地 址 可 以 设 置 为 源 和 目 标 地 址 的 高 16 位 从 RAM 到 RAM uint8 DMA_1_Chan; uint8 DMA_1_TD[1]; /* DMA Configuration for DMA_1 */ #define DMA_1_BYTES_PER_BURST 1 #define DMA_1_REQUEST_PER_BURST 1 #define DMA_1_SRC_BASE (buffer1) #define DMA_1_DST_BASE (buffer2) DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); DMA_1_TD[0] = CyDmaTdAllocate(); CyDmaTdSetConfiguration(DMA_1_TD[0], 128, DMA_INVALID_TD, DMA_1 TD_TERMOUT_EN TD_INC_SRC_ADR TD_INC_DST_ADR); CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)buffer1), LO16((uint32)buffer2)); CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); CyDmaChEnable(DMA_1_Chan, 1); 从 闪 存 到 DAC: uint8 DMA_1_Chan; uint8 DMA_1_TD[1]; /* DMA Configuration for DMA_1 */ #define DMA_1_BYTES_PER_BURST 1 第 25 页, 共 26 页
#define DMA_1_REQUEST_PER_BURST 1 #define DMA_1_SRC_BASE (FlashMem) #define DMA_1_DST_BASE (CYDEV_PERIPH_BASE) DMA_1_Chan = DMA_1_DmaInitialize(DMA_1_BYTES_PER_BURST, DMA_1_REQUEST_PER_BURST, HI16(DMA_1_SRC_BASE), HI16(DMA_1_DST_BASE)); DMA_1_TD[0] = CyDmaTdAllocate(); CyDmaTdSetConfiguration(DMA_1_TD[0], 64, DMA_INVALID_TD, DMA_1 TD_TERMOUT_EN TD_INC_SRC_ADR); CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)FlashMem), LO16((uint32)VDAC8_1_Data_PTR)); CyDmaChSetInitialTd(DMA_1_Chan, DMA_1_TD[0]); CyDmaChEnable(DMA_1_Chan, 1); Boundary Conditions( 边 界 条 件 ) 单 一 DMA 通 道 无 法 超 出 64-KB 边 界 因 此, 如 果 一 个 DMA 偶 然 超 出 了 64-KB 边 界, 操 作 就 会 失 败 且 无 任 何 通 知 这 点 仅 对 PSoC 5 器 件 很 重 要, 因 为 PSoC 3 器 件 的 存 储 器 空 间 不 会 超 过 64- KB 闪 存 或 8-KB 的 RAM 使 用 数 据 结 构 时, 必 须 确 保 其 不 超 过 64-KB 边 界 可 以 使 用 以 下 关 键 词 进 行 确 认 : attribute ((section())) attribute ((aligned())) 对 这 两 个 关 键 词 的 描 述, 可 参 考 指 定 变 量 属 性 一 节 中 的 GCC 帮 助 如 果 您 需 要 使 变 量 出 现 在 特 定 的 部 分 和 位 置 上, 则 可 以 使 用 节 关 键 词 使 用 对 齐 的 关 键 词 以 使 编 译 器 将 变 量 分 配 到 特 定 的 边 界 赛 普 拉 斯 半 导 体 公 司,2010-2012 此 处 所 包 含 的 信 息 可 能 会 随 时 更 改, 恕 不 另 行 通 知 除 赛 普 拉 斯 产 品 的 内 嵌 电 路 之 外, 赛 普 拉 斯 半 导 体 公 司 不 对 任 何 其 他 电 路 的 使 用 承 担 任 何 责 任 也 不 根 据 专 利 或 其 他 权 利 以 明 示 或 暗 示 的 方 式 授 予 任 何 许 可 除 非 与 赛 普 拉 斯 签 订 明 确 的 书 面 协 议, 否 则 赛 普 拉 斯 产 品 不 保 证 能 够 用 于 或 适 用 于 医 疗 生 命 支 持 救 生 关 键 控 制 或 安 全 应 用 领 域 此 外, 对 于 可 能 发 生 运 转 异 常 和 故 障 并 对 用 户 造 成 严 重 伤 害 的 生 命 支 持 系 统, 赛 普 拉 斯 不 授 权 将 其 产 品 用 作 此 类 系 统 的 关 键 组 件 若 将 赛 普 拉 斯 产 品 用 于 生 命 支 持 系 统 中, 则 表 示 制 造 商 将 承 担 因 此 类 使 用 而 招 致 的 所 有 风 险, 并 确 保 赛 普 拉 斯 免 于 因 此 而 受 到 任 何 指 控 PSoC 是 赛 普 拉 斯 半 导 体 公 司 的 注 册 商 标,PSoC Creator 和 Programmable System-on-Chip 是 赛 普 拉 斯 半 导 体 公 司 的 商 标 此 处 引 用 的 所 有 其 他 商 标 或 注 册 商 标 归 其 各 自 所 有 者 所 有 所 有 源 代 码 ( 软 件 和 / 或 固 件 ) 均 归 赛 普 拉 斯 半 导 体 公 司 ( 赛 普 拉 斯 ) 所 有, 并 受 全 球 专 利 法 规 ( 美 国 和 美 国 以 外 的 专 利 法 规 ) 美 国 版 权 法 以 及 国 际 条 约 规 定 的 保 护 和 约 束 赛 普 拉 斯 据 此 向 获 许 可 者 授 予 适 用 于 个 人 的 非 独 占 性 不 可 转 让 的 许 可, 用 以 复 制 使 用 修 改 创 建 赛 普 拉 斯 源 代 码 的 派 生 作 品 编 译 赛 普 拉 斯 源 代 码 和 派 生 作 品, 并 且 其 目 的 只 能 是 创 建 自 定 义 软 件 和 / 或 固 件, 以 支 持 获 许 可 者 仅 将 其 获 得 的 产 品 依 照 适 用 协 议 规 定 的 方 式 与 赛 普 拉 斯 集 成 电 路 配 合 使 用 除 上 述 指 定 的 用 途 之 外, 未 经 赛 普 拉 斯 的 明 确 书 面 许 可, 不 得 对 此 类 源 代 码 进 行 任 何 复 制 修 改 转 换 编 译 或 演 示 免 责 声 明 : 赛 普 拉 斯 不 针 对 此 材 料 提 供 任 何 类 型 的 明 示 或 暗 示 保 证, 包 括 ( 但 不 仅 限 于 ) 针 对 特 定 用 途 的 适 销 性 和 适 用 性 的 暗 示 保 证 赛 普 拉 斯 保 留 在 不 做 出 通 知 的 情 况 下 对 此 处 所 述 材 料 进 行 更 改 的 权 利 赛 普 拉 斯 不 对 此 处 所 述 之 任 何 产 品 或 电 路 的 应 用 或 使 用 承 担 任 何 责 任 对 于 可 能 发 生 运 转 异 常 和 故 障 并 对 用 户 造 成 严 重 伤 害 的 生 命 支 持 系 统, 赛 普 拉 斯 不 授 权 将 其 产 品 用 作 此 类 系 统 的 关 键 组 件 若 将 赛 普 拉 斯 产 品 用 于 生 命 支 持 系 统 中, 则 表 示 制 造 商 将 承 担 因 此 类 使 用 而 招 致 的 所 有 风 险, 并 确 保 赛 普 拉 斯 免 于 因 此 而 受 到 任 何 指 控 产 品 使 用 可 能 受 适 用 的 赛 普 拉 斯 软 件 许 可 协 议 限 制 第 26 页, 共 26 页