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.

[参考译文] PROCESSOR-SDK-OMAPL138:EDMA 数据传送至 McASP XBUF 时出现 OMAPL138欠载错误。

Guru**** 2609895 points
Other Parts Discussed in Thread: TLV320AIC29

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/648792/processor-sdk-omapl138-omapl138-underrun-error-in-edma-data-transmition-to-mcasp-xbuf

器件型号:PROCESSOR-SDK-OMAPL138
主题中讨论的其他器件:TLV320AIC29OMAPL138

您好!

我正在使用 OMAPL138-C6748处理器通过  外设配置总线通过 EDMA 完成数据传输。 McASP 以  tlv320aic29作为主器件完成数据传输、EDMA 使用 AB 同步传输。 系统 在开始时正常运行、但随着时间的增加(可能在两天之后)、系统运行异常、在 XSTAT 寄存 器中出现欠运转错误(XUNDRn 位= 1、而 XDATA 位= 1)。 此时 EDMA 不再传输数据、CCNT 寄存器既不是最大计数也不是零。 MCASP 的接收部分仍然正常工作。 MCASP 的初始配置如下所示:  是否有人可以提供帮助?

 //重置 McASP。

mcasp0regs->GBLCTL = 0;

//配置接收寄存器。

mcasp0regs->RMASK      = 0x0000FFFF;

mcasp0regs->RFMT        = 0x00018078;

mcasp0regs->AFSRCTL   = 0x00000102;

mcasp0regs->ACLKRCTL=0x00000029  ;

mcasp0regs->AHCLKRCTL = 0x00008004;

mcasp0regs->RTDM        = 0x00000001;

mcasp0regs->RCLKCHK   = 0x00FF0008;

mcasp0regs->REVTCTL   = 0x00000000;

//配置发送寄存器。

mcasp0regs->XMASK      = 0x0000FFFF;  

mcasp0regs->XFMT        = 0x0001807C;//1位延迟;MSB 优先;时隙大小为16位;向右旋转16位位置。

mcasp0regs->AFSXCTL   = 0x00000102;/2槽 TDM (I2S 模式)、单位、内部生成的发送帧同步、发送帧同步的上升沿(AFSX)指示帧的开始

mcasp0regs->ACLKXCTL  = 0x00000029;//上升沿、单个位、来自可编程位时钟分频器输出的内部发送时钟源(CLKXDIV=0x09)

mcasp0regs->AHCLKXCTL = 0x00008004;//内部发送高频时钟源(HCLKXDIV=0x04)

mcasp0regs->XTDM        = 0x00000003;//时隙0、1

mcasp0regs->RCLKCHK  = 0x00FF0008;

mcasp0regs->XEVTCTL   = 0x00000000;//发送数据 DMA 请求被启用。

//配置串行器(14= xmit、15= rcv)。

mcasp0regs->SRCTL14 = 0x00000001;

mcasp0regs->SRCTL15 = 0x00000002;

//配置引脚功能和方向。

mcasp0regs->PFUNC = 0;

mcasp0regs->Pdir = 0x1C004000;

mcasp0regs->DITCTL = 0x00000000;

mcasp0regs->DLBCTL = 0x00000000;

mcasp0regs->AMUTE = 0x00000000;

while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XHCLKRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RHCLKRST_MASK)))))

mcasp0regs->GBLCTL ||((CSL_MCASP_GBLCTL_XHCLKRST_ACTIVE)<CSL_MCASP_GBLCTL_XHCLKRST_SHIFT) | (CSL_MCASP_GBLCTL_RHCLKRST_ACTIVE<<CSL_MCASP_GBLCTL_RHCLKRST_SHIFT));

while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XCLKRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RCLKRST_MASK)))))

mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XCLKRST_ACTIVE)<<CSL_MCASP_GBLCTL_XCLKRST_SHIFT) | (CSL_MCASP_GBLCTL_RCLKRST_ACTIVE<<CSL_MCASP_GBLCTL_RCLKRST_SHIFT));

//启用发送和/或接收中断

IER |= 0x4000;

edma_mcasp0rx_set();

eDMA_mcasp0tx_set();

//清除相应的发送器和接收器状态寄存器

mcasp0regs->RSTAT=0x0000FFFF;

Task_delay();

mcasp0regs->XSTAT=0x0000FFFF;

//使各自的串行器脱离复位状态

while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XSRCLR_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RSRCLR_MASK))))

    mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XSRCLR_ACTIVE)<<CSL_MCASP_GBLCTL_XSRCLR_SHIFT) | (CSL_MCASP_GBLCTL_RSRCLR_ACTIVE<<CSL_MCASP_GBLCTL_RSRCLR_SHIFT));

while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XSMRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RSMRST_MASK)))))

 {

mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XSMRST_ACTIVE)<<CSL_MCASP_GBLCTL_XSMRST_SHIFT) | (CSL_MCASP_GBLCTL_RSMRST_ACTIVE<<CSL_MCASP_GBLCTL_RSMRST_SHIFT));

//使相应的帧同步发生器脱离复位状态

while ((0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_XFRST_MASK)||(0 =(mcasp0regs->GBLCTL 和 CSL_MCASP_GBLCTL_RFRST_MASK))))

mcasp0regs->GBLCTL |=((CSL_MCASP_GBLCTL_XFRST_ACTIVE)<<CSL_MCASP_GBLCTL_XFRST_SHIFT) | (CSL_MCASP_GBLCTL_RFRST_ACTIVE<<CSL_MCASP_GBLCTL_RFRST_SHIFT));

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

    我已通知 RTOS 团队。 他们将直接在此处发布反馈。

    请发布您正在使用的 RTOS SDK 版本。

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

    您好!

    您使用的是哪个 SDK 版本?

    您是否已经参考了 TRM 的发送/接收部分初始化部分中列出的初始化过程?

    http://www.ti.com/lit/ug/spruh79c/spruh79c.pdf#page=1073

    存在一个已知问题、即如果 n 槽 TDM 内的任何时隙处于非活动状态、则可能会发生随机欠运转错误。 请参阅以下内容:

    在所有芯片版本上、在任何配置了带有 n 槽 TDM 的传输串行器的 McASP 串行器中、如果以下两个条件都为真、数据传输可能会失败:

    1. n 槽 TDM 内的一个或多个时隙配置为非活动和

    EDMA 用于将数据传输到 McASP

    如果存在上述条件、发送操作可能无法通过发送状态寄存器(XSTAT)中的 XDATA 位启动、或者如果发送操作已开始、则可能会在中断数据传输操作时发生随机欠载错误。

    为了确保 EDMA 触发数据传输时 McASP 发送操作正确无误、n 槽 TDM 中的所有时隙都应配置为活动时隙。 例如、如果串行器配置为使用5槽 TDM 帧进行传输操作、其中仅需在插槽0至2中传输数据、则应在发送 TDM 时隙寄存器(XTDM)中将所有五个插槽(0至4)配置为有效。 在此示例中、剩余的时隙(插槽5及以上)可配置为非活动。 EDMA 配置和用户应用程序应考虑将插槽3和4的额外数据传输到 McASP。

    这在《器件勘误表: http://www.ti.com/.../sprz303h.pdf》中列出

    最棒的

    Sahin

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

    很抱歉我犯了个错误、可能是我选择了错误的器件型号。 由于我不知道 RTOS SDK 版本的含义、编译器环境(即 CCS3.3)或开发板。 我使用5.41.02.41的 DSP/BIOS 系统、如下图所示。 如果你不是这样说,你能再给我解释一下吗?

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

    首先感谢您的回复。 我展示了我用来回复 Yordan Kovachev 的 DSP/BIOS (5.41.02.14)版本,我不知道它是否准确。 我已经按照 TRM 的发送/接收部分初始化部分中的初始化程序配置了 McASP。 我在发送操作中选择了一个发送串行器的双槽 TDM (I2S 模式)、这两个槽都配置为非活动。 但我使用 EDMA 将数据传输到 McASP。 那么、如何避免数据传输操作中的欠载错误呢?

    然后、我对您列出的示例了解不够、剩余的时隙3和4需要 extern 无用数据才能填充? 如果我配置 n 槽 TDM、是否需要将所有插槽配置为有效以避免数据传输操作中出现欠载错误? 现在、我为 I2S 模式,使用2个插槽、这两个插槽在该过程中都不会处于非活动状态。

    顺便说一下、无法打开末尾列出的芯片勘误表链接、您可以再次发送吗?

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

    正确、所有插槽都需要配置为活动状态以避免欠运转错误、用户应用程序应处理插槽3和4中的额外数据。

    抱歉、链接断开、可在以下位置找到勘误表: www.ti.com/.../sprz303h.pdf

    奇怪的是、欠运转不会在操作开始后的两天发生。 您的系统中是否有任何可能导致延迟增加的东西? EDMA 似乎没有及时将数据传输到 McASP。

    该线程有类似的问题、可以通过禁用所有 printf 来解决该问题。 似乎是一个奇怪的解决方案、但请尝试一下:
    e2e.ti.com/.../1676806

    此外、您是否参考了我们软件包中提供的 McASP 示例?
    C:\ti\OMAPL138_StarterWare_1_10_04_01\examples\lcdkOMAPL138\McASP
    C:\ti\pdk_omapL138_1_01_00_02\packages\ti\drv\examplpleProjects\MCASP_AudioExampleProject

    此帖子中还提供了示例代码:
    e2e.ti.com/.../1352229

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

    我以前曾尝试禁用所有 printf、但它没有任何效果。 我还怀疑 EDMA 是否无法及时将数据传输到 McASP、我猜 EDMA 数据传输中的错误可能是由内存冲突引起的。

    我还尝试了另一项测试:我为 EDMA 的乒乓转换定义了两个新存储器、其他数据处理无法操作这两个存储器。 然后、如果我禁用所有数据处理、系统将正常运行、并且不会发生欠运转错误。 但是、如果我保持数据处理活动、则随着时间的推移、下行错误会再次发生。

    在这种情况下、我认为数据处理不能影响 EDMA 数据转换、因为 McASP 有自己的时钟、所以我无法理解为什么错误再次出现。 也不存在存储器冲突或处理超时。 这个问题很奇怪,我很困扰。 我不知道问题在哪里。

    因为如果使用 EDMA 将数据传输到 McASP、可能会发生随机欠载错误。 那么、在将 n 槽 TDM 中的所有时隙配置为活动时隙的前提下、如何避免欠运转错误?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是n`t 的旧版驱动程序(2009-2011年)、我们不能与开发人员联系、以便评估此欠运转问题、因为此时该版本的驱动程序没有得到积极维护。 日本客户目前报告了类似的问题、您可以在此处查看 E2E 主题上与开发人员的讨论:
    e2e.ti.com/.../391351

    您可以查看 McASP 错误寄存器、并在出现欠运转错误时采取纠正措施、如果您不使用 AFEIFO、请尝试使用 EDMA 将数据移动到 FIFO、而不是直接将数据移动到 MCASP 寄存器中。 另一种调试技术是在器件发生欠载错误时转储 MCASP 寄存器、并在进行数据传输时将其与初始清除状态进行比较、以查看 MCASP 设置中是否发生了变化。

    目前、要获得 TI 的有效支持、您需要更新到 Processor SDK RTOS McASP 驱动程序、因为 TI 不会主动维护该版本的驱动程序、客户可以"按原样"使用该驱动程序

    此致、
    Rahul