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.

[参考译文] CC1312R:将短音频从 SPI 流式传输到 I2S

Guru**** 2543210 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1072950/cc1312r-stream-short-audio-from-spi-to-i2s

部件号:CC1312R

大家好。

在我的 CC1312项目中,我需要将音频数据(短 jingle - CCA 3 s 持续时间)从外部 SPI 内存流式传输到外部 I2S DA 转换器,而不会中断。 我开始修改 i2secho 示例,但没有成功。 我不知道如何在队列中使用 SPI 并将其绑定到 I2S 队列。

请有人告诉我正确的方法吗?

非常感谢

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

    您好,弗兰蒂塞克,

    我们有一些音频示例。 您是否查看了音频插件?  

    https://dev.ti.com/tirex/explore/node?node=AFFVIsO6lK9zZEzi2G-Sig__RW99gST__LATEST

    谢谢,

    玛丽·H

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

    Marie,您好!

    感谢您的反馈。 您的链接非常有趣,我还不知道音频插件。 我看了看,但不幸的是我没有找到解决方案。 所有示例都不适用于 SPI 外围设备,我不确定如何将 SPI 读数链路到连续工作。 AudioHAL 看起来很有希望,但我担心从外部 SPI 内存读取的实施会非常复杂。 我正在寻找一个像 i2secho 示例一样简单的解决方案。 是否有办法为 SPI 修改它?

    巴西

    弗兰蒂塞克·莱西

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

    您好,弗兰蒂塞克,

    I2S 和 SPI 是一些不同的协议。 也许您可以尝试从 SPI 主/SPI 从示例应用程序启动?

    谢谢,

    玛丽·H

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

    您好,

    我经历了一些个人项目,在播放前,我将音频数据存储在外部闪存中。 由于 TI 提供了一个出色的 NVS 驱动程序(构建于用于外部闪存的 SPI 之上),我直接使用了该驱动程序。
    我目前可能不记得所有细节,但以下是您可能感兴趣的一些要素。

    • 我使用专用线程访问(读取,写入,擦除)闪存。 所有闪存操作都是由该唯一线程触发的。
    • 内存分配由音频线程进行,缓冲区引用通过邮箱传递到闪存线程。
    • 我用来按时获取音频数据的解决方案基本上是有4个缓冲区。 一个由音频输出消耗,一个由 SPI 填充,另两个由 SPI 填充。 (这一点可能略有不同,因为我的案例中有一个解码步骤-我建议验证操作的时间,以选择正确数量的缓冲区)。

    最后,我认为 i2secho 的例子是正确的起点。 这里提供的结构将有助于我在第3点所解释的内容。 剩余的工作是用从 I2S 接收的数据替换填充 I2S 缓冲区的代码。

    我希望这将有所帮助,

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

    感谢大家的回应。
    我仍然是基于 i2secho 的例子。 我能够从外部 SPI 闪存读取数据,并且能够将一些数据写入 I2S DA 转换 器 CS4349。 但问题可能是我对 list 函数不熟悉。 在 i2secho 示例中是一个循环列表,因为输入和输出都是 I2S。 我的项目具有 SPI 输入和 I2S 输出,因此我创建了两个循环列表(首先是 SPI 输入,第二是 I2S 输出)。 我很难在它们之间同步。 从外部 SPI 闪存读取的速度快于 I2S 向输出写入的速度,必须确保新数据不会覆盖旧数据。 这是我不熟悉的名单上的工作。

    巴西

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

    您好,

    对我来说,你应该只有一份清单。 这样,您就不必将数据从一个列表传递到另一个列表,而不会遇到您提到的时间问题。

    有关 List 驱动程序的更多详细信息,您可能需要查看 https://dev.ti.com/tirex/content/simplelink_cc13x2_26x2_sdk_5_20_00_52/docs/drivers/doxygen/html/_list_8h.html

    此致,

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

    大家好,

    经过多次尝试,成功终于实现。 根据 i2secho 示例,我使用了一个包含六个元素的列表作为循环缓冲区。 它被用作传输缓冲区。 通过 I2S 从列表的每个元素发送数据后,将生成中断,并在其中开始从外部闪存加载 SPI 数据。 从外部 SPI 闪存读取数据的速度要比 I2S 写入快得多,因此 I2S 的数据不会出现不可用的风险。 I2S 任务具有最高优先级非常重要,否则 I2S 写入会中断且不会持续。

    非常感谢你的帮助

    此致

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

    您好,

    干得不错! 感谢您分享您的成果!

    此致,