This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C6414:McBSP EDMA -问题

Guru**** 2549940 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/664193/tms320c6414-mcbsp-edma---issue

器件型号:TMS320C6414

尊敬的 TI -专家:

请在以下主题中为我提供帮助、事实上是一个问题。

应用描述

在 C6414上运行的 DSP 应用(上一个芯片修订版本2.0的 TMS320C6414TCLZ)利用所有三个 McBSP 端口来驱动 EDMA。
RX 和 TX (REVT、XEVT)通过通用乒乓技术同时处理。 不使用 DSP/BIOS、仅 CSL 和 EDMA_INT (errupt)、执行整个信号处理。 EDMA_INT 是应用程序中的唯一中断。
应用程序不使用 EDMA 中断、而是使用事件生成的 CPU (XINT)中断:
发送中断(XINT)模式-由一个新的帧同步生成。

以 TDM 模式运行的 McBSP (每个128个时隙)、完全从外部计时。  所有三个 McBSP 的时钟来自相同的源:

FPGA 将与外部时钟相同的串行位时钟和帧时钟扩展到所有三个 McBSP。

共享的 EDMA_INT 中断用于所有传输完成(TCC)中断。 在其中、EDMA CIR (中断挂起寄存器)被监控以检测传输完成。 更准确地说、在特定时间(XINT)中断等待全部3个(McBSP)传输完成代码的 TX 和 RX 指示完成。  

按照 SPRU234C EDMA 参考指南(第1.15.1段)的建议、ISR 会检查(等待)所有挂起的中断、并继续、直到所有已布置的中断都得到服务。

说到(E) DMA,除了 McBSP 之外,在应用程序中,还只有一个外设也在使用 EDMA:
主机端口接口(HPI)、按字运行、无需软件设置。  

初始 EDMA 设置 传输请求队列 Q1 (3 x McBSP)和 Q2 (HPI)被使用(使用缺省设置的 PQAR 和 TRCTL 寄存器)。
使用元素同步1维传输。 未使用 QDMA。
问题描述

在某些电路板上、随机(6-10次/24小时)完成所有6个 McBSP 传输(所有3个端口的 Rx 和 Tx)所需的时间比通常要长!  

在最坏的情况下、下一帧已经到达、导致其丢失!
发生什么事了?

在受影响的电路板上、所有三个 McBSP 的 RX 和 TX 传输有时会延迟很长(RX 传输最长)。
EDMA 通道中断挂起寄存器(CIPRL)传输完整代码(TCC:6个)未被置位!  

测量值 当然、我们已经执行了串行时钟的测量。 在发生问题时和之前的某个时间、不能观察到时钟丢失行为。
尝试处理此问题

由于单个优先级上的请求按顺序连续处理;而不同优先级上的请求可以同时处理、因此我尝试更改 EDMA 队列的用法、以便从并行处理中受益。

我通过以下方式利用 McBSP 的更多队列来更改初始 EDMA 设置:
Q0:McBSP0 Rx、Tx;Q1:McBSP1 Rx、Tx;Q2:HPI、 McBSP2 Rx、Tx)。

不幸的是,尽管发生了这些变化,但仍然发生了失败。  

我的问题:

为了缩小故障范围、我还能做些什么? 什么可能导致该问题?

谢谢!

满载

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

    BR
    Tsvetolin Shulev
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请允许我附加两张图片作为问题的图示。

    最底部的黄色信号是一个显示 ISR 处理时间的信号。
    其他信号包括 McASP0  BCLKX (位时钟)FSX (FrSyncTx)DX (TX-DATA)。  

    第一幅图像展示了一个良好的情况、显示 ISR 需要大约350ns 的处理时间(包括等待全部3 x 2事件在 CIPR 中挂起):

    在 ISR 中、它等待 CIR 中的所有6个事件都挂起、在正常情况下、几乎同时发生。  

    第二幅图说明了一个问题-案例:出于某种原因、ISR 需要更多的时间来处理(846而不是350ns):

    下一帧将完全丢失(请参阅右侧的黄色信号)、保持高电平。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    满载、

    您能否澄清一下有关您的系统操作的几个方面?

    [引用 USER="malden2507]EDMA 的所有三个 McBSP 端口。 RX 和 TX (REVT、XEVT)通过通用乒乓技术同时处理。[/QUERPLET]

    我看到的一种常见乒乓技术是、在前一个数据缓冲区传输完成时、有一个完整的数据缓冲区准备好传输、并在允许填充另一个缓冲区的同时处理一个接收数据缓冲区。 此技术允许完成所有处理的整个128通道帧周期。 您的方法似乎有所不同、您能解释一下您的乒乓缓冲方法吗?

    [引用 USER="malden2507]DSP/BIOS 未使用、仅 CSL 和 EDMA_INT (errupt)执行整个信号处理。 EDMA_INT 是应用程序中的唯一中断。[/quot]

    此说明听起来好像 DSP 上的整个应用程序正在为 EDMA_INT 提供服务、因此没有其他任何东西可以中断信号处理代码。 是这样吗?

    "整个信号处理"的结果是什么? 这是否会消耗最新的接收数据并生成下一个要传输的数据? 如果是这样、那么新的发送数据是否会在信号处理所处的同一数据帧内发出? 这就是我从这样一个事实中暗示的意思:运行 ISR 的时间过长会导致整个128通道传输帧失败。

    为了帮助您识别和调试问题、我建议至少有4个可能导致此问题的方面:
    正在处理的算法中的某项操作需要额外的一对一时间、这就是导致 ISR 时间延长的原因。 这是不可能的、因为您早就知道了这一点。
    EDMA 内部操作因系统中的其他操作而停止。 这可能来自高速缓存活动或内存端点的内存冲突。 从您的系统描述中看、这不太可能、但需要考虑一些因素。
    ISR 与下一组 EDMA 传输之间发生了一些交互。 某些关键时序窗口不能满足、因此错过了 EDMA 事件、直到下一帧才会发生数据传输。
    EDMA 速度或 DSP 速度无法跟上 McBSP 数据速率。

    尝试缩小问题源范围的"简单"操作是改变 McBSP 数据的时钟速率。 如果运行速度慢10-25%,并且问题仍然存在,或者如果问题完全消失,则任一结果都将有助于找到或消除问题的根源。

    您还可以尝试改变 DSP 的速度、尽管这通常更困难、尤其是由于存储器时序也发生变化、使其运行速度更快。

    还可以尝试降低 ISR 期间执行的信号处理代码中的处理要求。 良好的测试方法是简单地注释掉代码的一部分、并简单地减少处理的通道数。 减少正在处理的通道数量的优势在于代码将仍然具有与之前相同的存储器签名、并且即使处理时间更短、您也可以观察 ISR 持续时间的变化。

    每个 TDM 通道的数据长度是多少?

    您正在使用哪些存储器目标端点(内部、外部)?

    在 ISR 执行时、还有什么正在运行?

    在 ISR 的同时、EDMA 的其他用途可能是什么?

    这是我提出问题和意见及建议的起点。 我通常会建议 ISR 运行速度更快、EDMA 效率更高、或者修改代码系统架构以留出更多的 ISR 时间。 但是、您的澄清和测试结果将有助于更清楚地指出查看的位置。

    此致、
    RandyP

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Randy、您好!

    以下是您的问题的答案。

    • 乒乓技术:
      是的、我们确实使用了乒乓技术、但从单个 TDM 通道或时隙的角度来看、缓冲器深度仅为1 (1D 传输用于128通道 TDM、即仅每通道1个样本-为了音频延迟)。 例如、在读取一个128样本帧期间、另一个由 EDMA 填充。

    • 中断 生成:
      我在第一个帖子中犯了一个错误(我同时查看了蓝色的已删除/编辑的部分)。
      应用程序不使用 EDMA 中断、而是使用事件生成的 CPU (XINT)中断。
      发送中断(XINT)模式-由一个新的帧同步生成。

    • 没有其他任何东西可以中断信号处理代码。 是这样吗?
      是:XINT 中断具有最高优先级(另外只有一个具有较低优先级的软件中断)。

    • 可以通过以下方式描述该问题:
      尽管发生了新的 TX 帧中断、但有时/很少会在中检测到任何事件
      EDMA 通道中断挂起寄存器(CIPRL)-传输完整代码(TCC:3x2)未设置!

    同时、我们假设外部时钟可能会混乱。

    此致、
    Malden

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Randy、您好!

    请回答以下问题(与同一主题相关):

    您对我的以下想法有何看法?

    C6000 McBSP 手册提到了意外的接收/发送帧同步、并提供了控制位 RSYNCERR/XSYNCERR 来发出专用的未同步中断。

    在 SPCR (McBSP 的串行端口控制寄存器)中、我们通常使用 XINTM (发送中断模式)位:
    2h:XINT 由一个新的帧同步生成。
    因此、我们为每个(外部提供的)帧提供一个 XINT 中断。

    我准备的“测试功能”包括只为其中一个端口准备特殊设置,例如 McBSP2,以使 XSYNCERR“可见”。

    我准备了以下“测试功能”。

    想法 使用 XSYNCERR 的 XINT-setup 来检查/评估外部提供时钟的质量。  
    换言之、监控/检测同步问题。  
    实施
    详细信息

    SPCR2 (McBSP2的串行端口控制寄存器) XINTM 部分的配置方式如下:  
    3h:XINT 由 XSYNCERR 生成

    一个专用中断例程被准备好、映射到 IRQ_EVT_XINT2、以便它在发生时递增一些(准备好的)全局变量。 以评估最初是否发生中断。
    稍后、我打算切换一些可用于使用示波器进行测量的测试引脚。
    最终实施。 测试

    手动置位 XSYNCERR / SPCR2寄存器、然后取消选中它。
    实际上:已准备好的 XINT-INTERRUPT (使我的测试变量递增)!  

    实时

    遗憾的是、相同的实现方式无法实时检测时钟的错误行为。 为什么?
    准备好的中断根本不会被触发。

    我认为以下操作可防止发生 XSYNCERR 中断:

     发送控制寄存器(XCR)中的 XFIG (发送帧忽略位) 必须被清零!

     XConfig 的含义如下:
    在第一个脉冲重新开始传输后、0个发送帧同步脉冲。
    忽略第一个脉冲后的1个发送帧同步脉冲。  

    请确认我是否理解所有内容、以及 XSYNCERR 的 XINTM 设置是否可用于检查外部提供时钟的质量。  

    此致、
    Malden

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Randy、您好!

    一切都很好、正如我所期待的。  

    SPCR (串行端口控制寄存器) XSYNCERR (位19)或 RSYNCERR (位3)可被用于模拟一个 McPSP 端口发出的错误条件。  

    就像这样一个实际故障、在 McBSP 检测到帧同步错误(预期的帧同步脉冲)时。  

    因此、McBSP 的 XSYNCERR 特性可被视为一个出色的测量特性!

    XSYNCERROR 用于驱动 XINTM 中断;与一些指示(通过专用 GPIO 引脚)一起、可用于支持测量外部测量设备(例如触发示波器)并修复外部时钟问题。

    回到我们的主要主题:McBSP XSYNCERR 特性表明 、我们的 DSP 使用的外部时钟不像原来那样稳定。  

    此致、
    满载

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    满载、

    感谢您的状态更新、并非常好地找到问题的根源。 我们很高兴有一些测量功能对我们有所帮助。

    请将上述帖子标记为"已验证答案"、以便此主题将关闭、未来的读者将知道哪篇帖子是查找答案最重要的帖子。

    此致、
    RandyP