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.

[参考译文] OMAP-L138:McBSP Tx 锁定

Guru**** 2544960 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595908/omap-l138-mcbsp-tx-lockup

器件型号:OMAP-L138

大家好、

我将 OMAP-L138 与 C674x DSP 搭配使用。 McBSP 通过 FIFO 连接到 EDMA。 在正常操作下、我的应用程序工作正常、它将经常停止并启动 EDMA 和 McBSP。 串行端口配置为使用外部 FSX 和 CLKX。 一旦串行端口启动、锁定似乎总是发生、而不是在操作过程中、因此故障可能发生在先前关闭串行端口或重新初始化和启动故障发生时。

为了使锁定更频繁地发生、我已经为 McBSP 提供了一个过大的噪声时钟、并且观察到与最初锁定相同的症状(如下所述)。 我在提供时钟时有时不可靠的器件上遇到了问题(过去时钟消失时、我遇到了问题)。 我知道坏时钟是导致问题的原因、但我想更具体地了解这个问题是如何发生的以及症状是什么。 提供时钟的器件是第三方器件、因此它基本上是我的另一个黑盒。

发生锁定后、我已经对寄存器进行了调查、以了解可能出现的问题。 EDMA 没有 McBSP Tx 事件的中断挂起(IPR)、EMR 和 SER 都是清零的。 EDMA 指向第65个元素、该元素是要加载到 FIFO 中的下一个元素、它位于 EDMA 参数集的中间位置。 FIFO 似乎已满(长度64)。 Mcbsp0DSP.SPCR 为0x02032007 (McBSP 接收器正在使用中并且仍在运行)、显示:

  • XRDY 为"1-是"
  • XEMPTY 为'0-Yes'
  • XRST 已启用
  • XSYNCERR 为'0-no'。
  • XINTM 为'00-XRDY'

我将此读作表示 McBSP 认为它已发送 DXR (已设置为 EDMA 传输的第一个元素)、因为它认为它是空的并已准备好在 DXR 中接收新数据。 作为仿真器中的实验、我切换了 XRST 以禁用并重新启用 McBSP。 我看到 DXR 更新到我预期的元素#2、XRDY 和 XEMPTY 处于与上面相同的状态。 FIFO 保持满、EDMA 增加了一个指向第66个元件的位置。 串行端口仍保持锁定在[现在]第二个元件上。 看起来整个"链"仍然正常工作、因此我怀疑问题不在 EDMA 或 FIFO 中。 我还对 DXR 引脚的活动进行了物理监控、看不到任何活动(常量为零)。 即使在切换 XRST 之后、我也看不到 DXR 引脚上没有任何活动(甚至没有单次传输)、即使我希望 McBSP 持续传输 DXR 的内容、即使它认为它有下溢(FREE ="1 - ENABLE")。

因此、这篇文章的第二部分是、我正在寻找一种从这种情况中恢复的方法。 执行软复位(重新加载 C674x 代码)不会恢复、下次启动串行端口时、会出现相同的症状。 DSP 应用的重新启动非常严格地遵循用户指南中的 McBSP 初始化过程。 我唯一找到的恢复方法是通过硬复位关闭整个模块。 在这种情况下、我尝试使用 PSC 禁用并重新启用 McBSP0、但不管我尝试转换到什么状态、pstat 都保持为'1-正在转换'、就好像它没有从 McBSP0接收任何类型的通信一样。 然后、如果我尝试读取任何 McBSP0寄存器、我的内核会挂起且调试终止、唯一的恢复是硬断电复位。

因此、我将寻找两个问题的答案:

1) 1)锁定到底是什么?它是如何进入此状态的?

2) 2)除关闭模块电源外、是否还有任何恢复机制?

感谢您的观看、

马歇尔

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

    我将对此进行研究。 我将使用我的反馈返回到该主题。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Paul
    从您的摘要中可以看到 McBSP 状态机可能没有响应,更像尝试通过 PSC 对 McBSP 模块执行本地复位/启用/禁用时不工作, 如果模块状态机的某些部分仍处于活动状态、通常会发生这种情况、因此它不会确认 PSC 请求的"时钟停止"。

    看起来 EDMA CC/TC 正常、最好仔细检查诸如 CCSTAT/TTCSTAT 等状态寄存器

    很难说出导致锁定的原因。 从您的电子邮件中、您好像是按照第26.2.12.1节中列出的初始化顺序执行 McBSP 初始化-它具有使用外部时钟/帧同步等时所需的所有其他注意事项/时钟周期-请确保在手册后面都有这些注意事项。

    您需要探测这些线,以查看在执行重新启动等操作时通过与失败情形之间的区别

    我不热衷于提供恢复机制、也不了解导致锁定的系统中发生的情况的根本原因...
    但是,执行软件启动的复位的方法可能很少,尽管我通常不会建议这样做
    1)您可以尝试 PLLC0 RSTCTRL,这是一种软件启动的复位,它基本上可以复位整个芯片逻辑。
    2)在 McBSP 上,您可能会尝试执行26.2.15“电源管理”部分中列出的所有步骤,这些步骤用于正常关闭模块的电源管理, 并执行一系列步骤、确保状态机中没有挂起的活动-如果状态机挂起、这可能不起作用。
    3) 3)您可以对 McBSP 的 PSC.MDCTLn 寄存器中的位31进行写入、这是一个强制位以及禁用/启用等、正如说明中的注释所述、除非另有说明、否则我们通常不建议对该位进行写入、 本质上、该位将覆盖未被外设确认的任何时钟停止请求、并且蛮力强制执行 PSC 转换-通常不建议这样做、因为您希望不尝试更改模块的电源/时钟状态 如果它的逻辑中有一部分仍然处于激活状态或等待某些传输...

    希望这对一些人有所帮助。
    此致
    Mukul
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Mukul 的详细答复。 今天、我完成了您的许多建议、我想分享我的结果、并希望在某些方面添加更多详细信息。

    从您的摘要中可以看到 McBSP 状态机可能没有响应,更像尝试通过 PSC 对 McBSP 模块执行本地复位/启用/禁用时不工作, 如果模块状态机的某些部分仍处于活动状态、通常会发生这种情况、因此它不会确认 PSC 请求的"时钟停止"。  

    我同意、感觉 PSC 和 McBSP 失败了一些握手、导致 PSC 在尝试关闭 McBSP 时"挂起"。 我尝试了全部3个关断状态:SwRstDisable、SyncReset、Disable。 所有三种状态都具有先前描述的相同症状 、其中 pstat 保持为0x1。 我想补充一点、在这个状态(pstat = 0x1)下、我连接了调试器、如果我尝试读取 McBSP 寄存器、我会在我上电复位器件之前、收到关于器件内核挂起的持续错误。

    看起来 EDMA CC/TC 正常、最好仔细检查诸如 CCSTAT/TTCSTAT 等状态寄存器  

    好主意、我错过了这些状态寄存器。 我在正常运行和锁定后检查了这些寄存器。 锁定时没有突出显示、一切看起来都空闲。

    很难说出导致锁定的原因。 从您的电子邮件中、您好像是按照第26.2.12.1节中列出的初始化顺序执行 McBSP 初始化-它具有使用外部时钟/帧同步等时所需的所有其他注意事项/时钟周期-请确保在手册后面都有这些注意事项。  

    是的、我尝试尽可能严格地遵循此程序。 我已经检查并重新检查了该过程几次。 我注意到 spruh0中列出了两个过程:2.12.2.2和2.12.1。 我关注的是2.12.2.2 (外部 FSXM)、但两者看起来几乎相同、但等待 FSX 边缘的额外步骤(我确实这么做)。 我在适当的位置确实有"两个周期等待"-这只是基于时钟速度的定时等待、我实际上不会寻找时钟边沿(因此不能被坏时钟缩短)。 此外,在这一步中,其实还有相当多的“其他处理”会增加我们的等待时间,我认为我等待的时间足够长,但如果你认为这需要进一步的审查 (或如果程序2-2中步骤3和6之间的延迟不好)、我当然可以再次访问。

    您需要探测这些线,以查看在执行重新启动等操作时通过与失败情形之间的区别  

    我之前曾暗示过、我已经了解过它们、如果需要、我可以提供示波器捕获。 在锁定状态下、即使 DXR 为非零、数据发送引脚也会一直处于逻辑低电平。 我本来希望它能持续推出 DXR、即使在 XRDY 位置位时也是如此、但我想它不会做任何事情。

    我不热衷于提供恢复机制、也不了解导致锁定的系统中发生的情况的根本原因...
    但是,执行软件启动的复位的方法可能很少,尽管我通常不会建议这样做

    我也很感谢您列出了这些选项。 我们有一位客户看到了该问题、任何 可能的恢复都将是一个很好的帮助、因为客户无需对器件进行电源复位。 我仍计划在创建恢复机制后继续找到问题的根本原因。

    1)您可以尝试 PLLC0 RSTCTRL,这是一种软件启动的复位,它基本上可以复位整个芯片逻辑。

    我尝试过这种方法、它确实能够为器件提供软件复位。 复位后、我无法连接调试器(处于复位状态)或任何其他方法。 器件似乎卡在复位状态、我不确定在触发该方法后如何使其退出复位状态。 我没有再看太多了。 我是否缺少了一些有助于我们摆脱复位的特殊步骤?

    2)在 McBSP 上,您可能会尝试执行26.2.15“电源管理”部分中列出的所有步骤,这些步骤用于正常关闭模块的电源管理, 并执行一系列步骤、确保状态机中没有挂起的活动-如果状态机挂起、这可能不起作用。  

    我按照这些步骤、在进行分流之前将 McBSP 置于低功耗模式。 你是对的、我遇到了问题。 一切都顺利进行、直到第5/6/7步。 我向 DXR 写入了一个虚拟值、从未看到 XRDY 清零为"0"。 写入第二个虚拟值、XRDY 保持为"1"。 这提醒我、即使在锁定状态下(未在2.15电源管理中执行步骤1-4)、我也可以写入 DXR、但从未看到 XRDY 清零。 也许这是有关 McBSP 如何锁定的提示。

    3) 3)您可以对 McBSP 的 PSC.MDCTLn 寄存器中的位31进行写入、这是一个强制位以及禁用/启用等、正如说明中的注释所述、除非另有说明、否则我们通常不建议对该位进行写入、 本质上、该位将覆盖未被外设确认的任何时钟停止请求、并且蛮力强制执行 PSC 转换-通常不建议这样做、因为您希望不尝试更改模块的电源/时钟状态 如果它的逻辑中有一部分仍然处于激活状态或等待某些传输...  

    嗯、我知道你不会喜欢听到这个-但是这成功地从这个死锁中恢复了。 我能够"强制"McBSP 关闭、重新加载 DSP 代码、并且 McBSP 在没有断电复位的情况下再次开始正常执行。 我计划继续将此作为我们的客户恢复机制、然后再继续解决此问题的根本原因。  

    我有一个问题-应该使用什么复位模式?  SwRstDisable、SyncReset 或 Disable? 是否有一个比其他人"安全"? 一个"更完整"的项目? 我计划设置此恢复机制、以便在启动时检测 McBSP 是否处于此状态、因此我想我应该强制它在复位时处于任何状态、以使状态尽可能保持一致。

     此外、我计划首先尝试对 McBSP 执行"非强制"复位(因为 TI 不建议使用强制位)。 您是否有关于执行强制重置之前、我应该等待 pstat 清除多长时间的建议?

    //编辑

    我还假设我应该在强制复位后等待 pstat = 0x0、然后再继续?

    谢谢、

    马歇尔

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

    感谢您运行实验并分享您的详细观察结果。
    我必须承认,我在 McBSP 方面的专业知识有限,但在一般情况下,McBSP 方面的专业知识可能有限:)因此,我(现在)将重点关注对您的恢复机制的响应 (您和我一致认为、这是一种临时解决方案、可帮助您的最终客户取得进展、我们仍应找出根本原因)。

    在查询是否使用强制位时,我会说您可以使用 SwRstDisable,因为这既会禁用/启用锁定,又会将本地复位置为有效/取消置为模块。 文档将提到 SyncReset 和 SwRstDisable 不会在软件中启动,但使用强制位也是如此:)。

    很难说您应该等待 PTSTAT 清除的周期数、它不应该超过几百个周期、我认为是对 PSC 寄存器空间的读取、可能是最坏情况下的30-40个周期(或更低) 假设在超时之前有几个读取循环-一般情况下,如果模块运行状况良好,PTSTAT 应立即转换。

    在 PLL 启动的复位上,应该已经工作过,但它相当于热复位,因此您将失去与 JTAG 的连接,并且需要重新建立,并且可能会再次进行引导(在非仿真模式下)。

    显然、您还可以选择将片上看门狗计时器设置为在特定时间后跳闸。

    使用 McBSP 的整体力位似乎是一种局部方法、可以使您获得所需的恢复、因此您应该能够坚持使用它。

    将在稍后解析您的 McBSP 部分信息。

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

    穆库尔-

    本周、我已经实施、测试了恢复机制、并为最终客户提供了该机制。 感谢您深入介绍这一选项以及我应该如何使用它。

    我还开始跟踪可能导致此问题的原因。 其中一些可能需要查看:

    使用噪声源作为位时钟:当我启动/停止串行端口时、我会更频繁地看到锁定、而不是使串行端口持续运行。 这使我相信、在 McBSP 的初始化过程中、某些东西对位时钟很敏感。

    因此、我重新专注于尝试了解我们的[外部]时钟如何产生噪声或不可靠。 我最后发现了使用另一个串行端口时可能出现的串扰问题。 显然、这不是 TI 的问题、我正在研究解决方案。  我附上了一个示例屏幕截图、其中显示了串扰、您是否同意这看起来足够糟糕、从而导致问题? 黄色是位时钟、蓝色是有问题 TX 中的串行端口、紫色是有问题 Rx 中的串行端口。

    我还想知道 McBSP 初始化过程的哪个部分对时钟很敏感、这可能有助于创建一个能够可靠地重现锁定的测试。 在继续之前、是否有一个需要良好稳定时钟的特定步骤?

    谢谢、

    马歇尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,马歇尔
    我将再次查看该主题、看看是否有更多线索需要了解。
    我也要去 cc 他倡导了几个这样的问题、并且可能会有更多的指导。


    当您说它仅发生在启动/停止串行端口时、了解这在器件状态方面的确切含义、以及在启动和停止期间如何管理外部时钟和帧同步等、将是一个好方法。

    TRM 还讨论 GPIO 等的使用-您是否这样做?


    26.2.12.2.1如何检测第一个帧同步
    虽然 McBSP 能够在检测到帧时生成一个到 CPU 的中断
    同步(串行端口控制寄存器(SPCR)中的 XINTM = 2h 和/或 RINTM = 2h)、McBSP
    要求 McBSP 的相关部分(接收器/发送器)复位后才能执行
    将生成中断。 因此、不是直接使用 McBSP 中断来检测第一个帧
    您可以使用 GPIO 外设。 这可以通过将帧同步信号连接到来实现
    GPIO 引脚。 软件可以轮询 GPIO 引脚以检测第一个帧同步、或对 GPIO 进行编程
    外设、以便在检测到第一个帧同步边沿时生成到 CPU 的中断。 了解详情
    有关 GPIO 外设的信息、请参阅通用输入/输出(GPIO)一章。
    以下是器件上的一些推荐 GPIO 引脚、可用于检测第一个引脚
    McBSP 外部帧同步:
    •GPIO 引脚位于 McBSP 引脚附近。 将外部帧同步连接到两个 McBSP
    FSX/FSR 引脚和专用 GPIO 引脚。
    •与 McBSP FSX 信号复用的 GPIO 引脚。 请注意、在器件上、GPIO 引脚(的
    GPIO 外设)与 McBSP 引脚复用。 软件可以对器件的引脚进行编程
    复用寄存器(PINMUX)将这些引脚默认为 GPIO 功能、并且只将它们切换为
    在检测到第一个帧同步时的 McBSP 功能。 仅当使用外部时、才建议使用此方法
    器件是帧同步和时钟主器件;也就是说、外部器件驱动 FSX 和
    CLKX 信号。 如果 McBSP 是时钟主控(驱动 CLKX)、则不建议使用此方法
    和/或 CLKR)、因为"动态"引脚多路复用开关会在 CLKX/CLKR 引脚上引起干扰。
    有关引脚多路复用的更多详细信息、请参阅器件专用数据手册。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在供电时、外部时钟应该一直保持。 因此、当时钟继续计时时、我将动态启动和停止 McBSP。 GPIO 轮询机制(下面将进一步详细介绍)应该有助于我从一个"好"的位置开始。

    我停止发送串行器的过程:

    1. 清除 SPCR->XRST (已禁用)。
    2. 清除 WFIFOCTL->Wena (已禁用)。
    3. 停止 EDMA3
      1. 禁用 Mcbsp0Tx 事件(EECR)
      2. 清除 Mcbsp0Tx 事件(ECR)
      3. 禁用中断(IECR)
      4. 清除中断(ICR)

    我重新启动传输串行器的过程(每次启动 McBSP 时执行此过程):

    1. 停止 EDMA3 (与上述方法相同)
    2. 在 PSC 中启用模块。 每次启动传输串行器时都会执行此操作、即使我们在初始启动后从未关闭模块。 正是在启动期间、我实现了上述恢复机制、我尝试将 PSC 置于 SWRSTDISABLE 状态、如果命令超时、我使用强制位强制 PSC 转换到 SWRSTDISABLE、从而从锁定状态"恢复"我们。
    3. 将 McBSP 引脚配置为 McBSP。
    4. 清除 SPCR->XRST
    5. 清除 WFIFOCTL->Wena
    6. 通用 McBSP 配置(SPCR、XCR、PCR、XCEREn、WFIFOCTL)
    7. 这里有一段时间、EDMA3缓冲区会在所有数据开始前填充数据。 这意味着正在加载 EDMA3参数集。
    8. EDMA3缓冲区满后、等待两个时钟周期(这是基于定时器的硬等待、我不轮询这里的时钟边沿)
    9. 设置 SPCR->XRST (已启用)
    10. 等待两个时钟周期(与步骤8相同、不轮询时钟边沿)
    11. 清除 SPCR->XRST (已禁用)
    12. 清除 WFIFOCTL->Wena
    13. 启动 EDMA3
      1. 加载最终参数集
      2. 启用中断
      3. 清除遗漏的事件寄存器
      4. 清除辅助事件寄存器
      5. 使能事件
    14. 将 FSX0设置为 GPIO
    15. 等待 FSX0下降沿(FSXP 配置为'ACTIVE_HIGH'、CLKXP 配置为'FALLING')
    16. 设置 WFIFOCTL->Wena (已启用)
    17. 设置 SPCR->XRST (已启用)
    18. 将 FSX0设置为 FSX0 (McBSP 函数)

    只需清除并解决您关于使用 GPIO 轮询的问题:是的、我正在等待第一个 FSX 边沿、然后再打开 McBSP。 26.2.12.2.1中的最后一个要点是我如何实现它(通过使用器件的多路复用器切换到 GPIO 并返回 McBSP 功能)。 FSX 和 CLKX 均由外部提供。 我遵循了2.12.2.2中的初始化过程、其中包含使用 GPIO 轮询 FSX 边沿的步骤。 这实际上是为了解决一段时间后的另一个问题!

    谢谢、祝您周末愉快!

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

    [引用用户="Marshall Schiring"]

    • 停止 EDMA3 (与上述方法相同)
    • 在 PSC 中启用模块。 每次启动传输串行器时都会执行此操作、即使我们在初始启动后从未关闭模块。 正是在启动期间、我实现了上述恢复机制、我尝试将 PSC 置于 SWRSTDISABLE 状态、如果命令超时、我使用强制位强制 PSC 转换到 SWRSTDISABLE、从而从锁定状态"恢复"我们。

    [/报价]

    我建议您尝试一个将 SWRSTDISABLE 状态整合到标准初始化过程中的实验。  具体而言、在上面显示的第二步中、首先将 McBSP 更改为禁用状态。  如果时间过长、则需要超时功能、必要时可利用"强制"位。  在需要"强制"位的情况下、您应该打印一条消息。

    我想了解实施这种变化是否完全消除了任何锁定、或者它是否改善了情况(以及大致多少)。

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

    布拉德-

    我在标准初始化过程的第2步之前尝试了 SWRSTDISABLE 方法、 我不再观察到锁定情况。 但是、我不认为这是可取的、因为我使用的是 McBSP0的接收器侧-所以我不希望在接收器使用时有可能将 McBSP 置于禁用/复位状态。 虽然我没有看到锁定情况、但我确实看到了错误消息、警告我使用了强制位来禁用 McBSP。 这表明仍然存在锁定串行端口的条件(它不会 ACK PSC disable 命令)、但我们将强制恢复以确保传输最终开始。 这让我想到、当我禁用串行端口而不是在初始化过程中、可能会发生锁定。 您是否同意此评估? 我可以尝试在明天更深入地了解关断过程、但我认为这非常简单。

    我确实认为我在步骤2中所做的事情有点奇怪。 我认为每次打开串行端口时、我都不应该启用 McBSP -启动时一次就足够了。 我尝试了执行此操作的代码、但仍然收到锁定。 如果启用已启用的模块会导致此锁定、这应该消除了任何问题。

    马歇尔

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

    我们需要更仔细地查看您禁用发送器的过程。 首先、您能否告诉我 McBSP 是驱动 CLKX 和 FSX 信号、还是 McBSP 的这些输入?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brad
    感谢您对此提供的帮助。
    根据 Marshall 之前的帖子、"串行端口配置为使用外部 FSX 和 CLKX。 "
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哎呀、谢谢。 这些外部信号是否始终保持开启状态? 还是在某个点停止?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另一个帖子

    "在供电时、外部时钟应该一直保持。 因此、当时钟继续计时时、我将动态启动和停止 McBSP。 GPIO 轮询机制(下面将进一步详细介绍)应该有助于我从一个"好"的位置开始。

    但我同意,马歇尔最好再次确认这一点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否将 EDMA 配置为在"关断"期间无限期发送零缓冲器、而不是动态停止/启动 McBSP?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mukul/Brad -

    是的、CLKX 和 FSX 都在器件外部。 两个时钟始终运行。

    我不确定是否可以选择永久运行串行端口、我需要更多地查看它。 我知道在使用之间可能会有 EDMA3参数集更改、这可能不是太大、但更重要的是、我有时需要同步传输和接收。

    停止过程非常简单:

    1. SPCR->XRST 至已禁用
    2. WFIFOCTL->Wena 已禁用
    3. EDMA3停止
      1. 禁用事件
      2. 清除事件
      3. 禁用中断
      4. 清除中断

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我怀疑您的问题与 TRM 的第26.2.15章"电源管理"有关。 其中提到以下内容:

    "为了让 PSC 将 McBSP 置于断电模式、请确保 XRDY 和 RRDY
    串行端口控制寄存器(SPCR)中的标志被清除"

    我认为这至少与您需要对 PSC 使用"武力"的原因有关。 但是、我想知道它是否实际会比这更进一步、并且与锁定本身相关。

    首先、我在您的原始帖子中注意到、您在失败的案例中看到 XRDY=1。 这似乎与上面讨论的内容直接相关。 此外、26.2.15中列出了清除此条件的详细程序。 尽管如此,我们可能希望*尝试*进行一些小的修改,以便使接收器侧正常工作。 但是、我认为目标应该是清除 XRDY。

    也许在您开始整个过程之前、每次停止 McBSP 发送器时、只需打印 XRDY (或更好的整个 SPCR)的值可能会很有用。 我想看看 SPCR 值和锁定之间是否有任何关联、例如、锁定时 XRDY 是否始终为1?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、您好!

    好的观察、XRDY 已设置这一事实可能是我无法使用 PSC 禁用 McBSP 模块的原因。 我的另一个理论是,在关闭之前,PSC 和 McBSP 之间可能存在某种握手或确认,并且由于 McBSP 似乎被锁定,因此它可能不会发送适当的 ACK,因此 PSC->pstat 挂起。 Mukul 的一项建议实际上提到了如何进行第2.15节中概述的"正常"关闭。 下面是我对尝试此程序的答复(Mukul 为红色、Marshall 为黑色)。

    [引述]

    2)在 McBSP 上,您可能会尝试执行26.2.15“电源管理”部分中列出的所有步骤,这些步骤用于正常关闭模块的电源管理, 并执行一系列步骤、确保状态机中没有挂起的活动-如果状态机挂起、这可能不起作用。

    我按照这些步骤、在进行分流之前将 McBSP 置于低功耗模式。 你是对的、我遇到了问题。 一切都顺利进行、直到第5/6/7步。 我向 DXR 写入了一个虚拟值、从未看到 XRDY 清零为"0"。 写入第二个虚拟值、XRDY 保持为"1"。 这提醒我、即使在锁定状态下(未在2.15电源管理中执行步骤1-4)、我也可以写入 DXR、但从未看到 XRDY 清零。 也许这是有关 McBSP 如何锁定的提示。

    [/报价]

    简而言之、向 DXR 写入虚拟值不会清除 XRDY。

    我确实有一种方法可以转储相关的寄存器值。 我用这个方法来验证现场看到的问题与我在工作台上看到的问题相同。 在我看到这个锁定的每一个情况中、XRDY 位被置位(并且 XEMPTY 位被清零)。

    [引述]

    *** C6000寄存器转储***

    EDMA3寄存器
    EMR:0x00000000
    ER:0x0C000C00
    EER:0x0000C00C
    SER:0x00008000
    IER:0x000C000C
    IPR:0x00000000

    EDMA3参数集 McBSP0_Tx
    CCNT:0x000014D7

    写入 FIFO 寄存器
    WFIFOCTL:0x00010101
    WFIFOSTS:0x00000040

    McBSP0寄存器
    SPCR:0x02032001
    --> SPCR Tx:0x03
    DXR:0x00010000
    XCR:0x000400A0

    [/报价]

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

    [引述 USER="Marshall Schiring]在进行分流之前、我按照这些步骤将 McBSP 置于低功耗模式。 你是对的、我遇到了问题。 一切都顺利进行、直到第5/6/7步。 我向 DXR 写入了一个虚拟值、从未看到 XRDY 清零为"0"。 写入第二个虚拟值、XRDY 保持为"1"。 这提醒我、即使在锁定状态下(未在2.15电源管理中执行步骤1-4)、我也可以写入 DXR、但从未看到 XRDY 清零。 [/报价]

    此时是否禁用了 FIFO?  您是否会考虑分享您实施这些步骤进行审查的精确代码?  一个轻微的编码错误可能是这种工作方式与不工作方式之间的差异。

    [引用 USER="Marshall Schiring"]在我看到这种锁定的每一个情况中,XRDY 位都已置位(XEMPTY 位也已清零)。

    您能不能详细介绍一下您没有锁定的情况吗?  所有这些是否都为 XRDY 位清零?  或者、您是否会得到它的组合、有时是设置的、有时是明确的?

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

    [引用 user="Brad Griffies">此时是否禁用了 FIFO?  您是否会考虑分享您实施这些步骤进行审查的精确代码?  一个轻微的编码错误可能是此工作正常或不工作之间的差异。

    是的、在步骤1中禁用了 FIFO。 下面是我的注释交错的代码。 在启动时几乎可以直接运行、因此我可以重新生成锁定、重新加载 DSP 并立即运行此"低功耗关断"。 在本示例中、我还会关闭 McbspRx、即使最终产品不需要这样做、只需更彻底地遵循指令即可。

    //步骤1
    peripherals.McBSP->ResetAll (McBSP::MCBSP0);
    peripherals.EDMA->停止(EDMA3::MCBSP0_transmit);
    Mcbsp0Rx.StopEdma (*外设.EDMA);
    此->外设.McBSP->PscDisable (McBSP::MCBSP0); 

    空 McBSP::ResetAll (McBSP:McBSP_device Device) { CSL_FINST (McBspRegister[设备]->SPCR、McBSP_SPCR_XRST、DISABLE); CSL_FINST (McBspRegister[设备]->SPCR、McBSP_SPCR_RRST、 禁用); CSL_FINST (McBspRegister[设备]->SPCR、McBSP_SPCR_Frst、复位); CSL_FINST (McBspRegister[设备]->SPCR、 McBSP_SPCR_GRST、RESET); CSL_FINST (FifoRegister[器件]->RFIFOCTL、BFIFO_RFIFOCTL_RENA、禁用); CSL_FINST (FifoRegister[设备]->WFIFOCTL、BFIFO_WFIFOCTL_Wena、已禁用); }
    void EDMA3::停止(枚举事件)
    {
    DisableEvent (Event);
    ClearEvent(事件);
    DisableInterrupt (Event);
    ClearInterrupt (Event);
    IRQ[Event].function = NULL;
    } 

    只需写入影子 EECR、ECR、IECR、ICR。 Edma3Tx 和 Edma3Rx 具有相同的过程。

    过程的关键:

    void McBSP::PscDisable (McBSP::McBSP_device Device)
    {
    uint32_t RRDY;
    uint32_t DRR;
    开关(器件)
    {
    MCBSP0案例:
    //Step 1之前已完成
    
    //Step 2将 McBSP 时钟和帧切换到内部时钟源
    /2a.
    CSL_FINST (McBspRegister[设备]->SRGR、McBSP_SRGR_CLKSM、 内部);
    CSL_FINST (McBspRegister[设备]->SRGR、McBSP_SRGR_FSGM、 FSG);
    //2b.
    CSL_FINST (McBspRegister[设备]->PCR、McBSP_PCR_CLKXM、 输出);
    CSL_FINST (McBspRegister[设备]->PCR、McBSP_PCR_CLKRM、 输出);
    CSL_FINST (McBspRegister[设备]->PCR、McBSP_PCR_FSXM、 内部);
    CSL_FINST (McBspRegister[设备]->PCR、McBSP_PCR_FSRM、 内部);
    //2c
    CSL_FINST (McBspRegister[设备]->PCR、McBSP_PCR_SCLKME、 否);
    
    //Step 3使 McBSP 退出复位状态
    CSL_FINST (McBspRegister[设备]->SPCR、McBSP_SPCR_XRST、ENABLE);
    CSL_FINST (McBspRegister[设备]->SPCR、McBSP_SPCR_RRST、ENABLE);
    CSL_FINST (McBspRegister[设备]->SPCR、McBSP_SPCR_GRST、CLKG);
    
    //Step 4等待两个 CLKSRG 周期(此处等待10微秒)
    WaitForTwoClockCles();
    
    //Step 5向 DXR 写入虚拟值
    McBspRegister[设备]->DXR = 0xA5A5A5A5;
    
    //Step 6等待一个 McBSP 位时钟(在这里等待10微秒)
    WaitForTwoClockCles();
    
    //Step 7将第二个虚拟值写入 DXR
    McBspRegister[设备]->DXR = 0x5A5A5A;
    
    //Step 8检查 RRDY、读取 DRR (如果已设置)
    RRDY = CSL_FEXT (McBspRegister[设备]->SPCR、McBSP_SPCR_RRDY);
    如果(RRDY = 1)
    {
    DRR = McBspRegister[设备]->DRR;
    }
    
    //Step 9关闭 McBSP
    PSC.DisableMcBsp0();
    中断;
    
    案例 MCBSP1:
    PSC.DisableMcBsp1();
    中断;
    
    默认值:
    中断;
    }
    } 

    DisableMcbsp0()完成了读取 pstat、设置 MDCTL 和 PTCMD 以及重新读取 pstat 的过程。 由于我添加了超时、错误消息和使用了强制位、该方法目前非常容易被占用。 它在这里将超时并无论如何需要强制位。 在两个虚拟写入之后、我从未看到 XRDY 被清除。

    [引述 user="Brad Griffies">您能不能告诉我更多您没有锁定的情况吗?  所有这些是否都为 XRDY 位清零?  或者、您是否会得到有时设置和有时清除的混合结果?

    在没有锁定的情况下、这意味着正常的稳定状态? XRDY 位在所有这些位看来都是清零的、但我认为在 WFIFO 填满 DXR 并再次清零 XRDY 之前、它的置位时间很短。 在正常操作中、XRDY 位置位似乎非常困难或不太可能。

    根据您的意见、我今天花了一些时间开发一个测试、当 XRDY 位置位时、该测试只会关闭 McBSP、以查看这是否会导致问题。 我提出的最成功和最令人信服的测试是先关闭 EDMA3并让 WFIFO 干运行、确保在清除 XRST 和 WFIFOCTL->Wena 之前设置了 XRDY。 我让这种关断顺序运行几个小时、并且没有看到锁定。 此外、我曾尝试首先禁用 WFIFO (以 starve DXR)、但我看到了一些奇怪的行为。 我无法将 XRDY 设置为"停留"。 我有一个 while 循环等待 XRDY 被置位、当我退出 while 循环和重新读取 SPCR 时、无论我在禁用 WFIFO 后等待多长时间、XRDY 都将再次被清零。 只是一个观察、不确定是否重要、但 WFIFO 和 McBSP 似乎密切相关、我可能不应该与这种关断顺序混乱。