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.

[参考译文] LAUNCHXL-CC2650:I2S 写入线程因未知原因停止

Guru**** 2589265 points
Other Parts Discussed in Thread: LAUNCHXL-CC2650, CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/948925/launchxl-cc2650-i2s-write-thread-stops-for-unknown-reason

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件: CC2650

我将 LAUNCHXL-CC2650 Launchpad 与 CC320AUBOOST 配合使用。 我使用 i2secho 演示程序(用于 I2S 传输)和 project_zero (用于蓝牙)的组合。  

我创建了一个无限事务列表。 每个事务都指向两个64字节的音频缓冲器(A、B)中的一个。 每个事务的后续操作都指向另一个事务。

当我启动程序时、I2S 有时会正确启动并保持正常运行。 但在许多情况下、I2S 正确启动、但在短随机时间后停止。

我尝试确保问题不是由 BLE 任务与 i2secho 任务的任何干扰引起的:我将 I2S 内部优先级设置为1、以确保蓝牙堆栈不会窃取 I2S 中断所需的时间。 我还尝试注释 ProjectZero_init()函数中的 BLE 服务初始化以禁用 BLE。 这两种措施都不会改变情况。

为了查看出了什么问题、我将引脚切换器置于以下函数中:I2SCC26XX.c:I2S_hwiIntFxn ():d0、d1、d2;i2secho.c:*回声线程():d3

在下面显示的图表中、在这些情况下、I 输出引脚切换器:

D0:发生了 I2S_INT_DMA_OUT

D1:发生 I2S_INT_PTR_ERR

D2:进入 I2S int 例程时为 h (int 函数的第一行上设置了引脚)、退出 int 例程时为 L (int 函数的最后一行上的引脚复位)

D3:调用 I2S_startWrite (i2sHandle)之前的 h、调用之后的 L

D4:位时钟

D5:字时钟

D7:从 MCU 发送到编解码器的测试数据(0xFF、0x00、0xFF、0x00、...)

图1:

在图1中、您可以看到 I2S 启动良好(D3)、流按预期启动(发送数据 D7)。 经过一段随机时间(不确定!)后、流将停止。 很长一段时间内没有中断发生。 发生时(太晚) 、会给出 I2S_INT_PTR_ERR (正确)。

图2:

图2显示了 I2S 流末尾的时序。 时钟和数据正常、但下一个中断由于某种未知原因而丢失。

是否存在任何已知的硬件问题、无论是评估板问题(例如、时钟/I2S 启动/稳定期间/之后的电源压降)、还是可以解释此行为的 CC2650问题? I2secho 演示程序中是否存在任何已知缺陷、可能导致此类行为(例如、在启动 I2S 流之前缺少某些寄存器的复位/初始化)?

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

    呃…… !!!

    我认为我发现了问题的原因:一些在系统启动后不久运行的中断例程(可能是 BLE 堆栈的一部分)似乎禁用了 I2S 中断并运行了超过85ms。 因此、如果 I2S 在该例程终止前启动、I2S 流将会耗尽、因为 I2S 中断延迟超过85ms。

    我没有调查哪个例程导致了这个问题。 您能告诉我们吗? 是否可以使此例程中断?

    P.S.:根据我使用的编程指南、我永远不会允许中断例程在禁用中断的实时系统上长时间运行。 请检查这是错误还是"功能"。

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

    尊敬的 Marc:

    BLE 堆栈确实具有相当长的关键段。这些段不易拆卸(如果不能访问 BLE 堆栈源、则无法将其删除)。

    当同时使用 I2S 时会出现这种问题(因为 I2S 会产生相当多的中断)。 我建议尽量增加 I2S DMA 传输的长度(使用尽可能长的连续缓冲器)

    此致、