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.

[参考译文] RTOS/CC2650STK:如何更改 I2S PDM 数据采样率?

Guru**** 2589265 points
Other Parts Discussed in Thread: BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/654262/rtos-cc2650stk-how-to-change-the-i2s-pdm-data-sampling-rate

器件型号:CC2650STK
Thread 中讨论的其他器件:BLE-STACK

工具/软件:TI-RTOS

您好!  

在 PDMCC26xx.h 的参考文件中、有一个"此驱动程序被配置为处理 I2S 硬件模块一次提供的256字节 PDM 数据、 以 1.024Mbps 采样"和"应用程序必须允许 PDM 驱动程序任务运行得足够频繁、以处理从 I2S 驱动 程序接收到的数据、大约每2ms 一次"。

现在、我希望大约每 5ms 或更长时间接收一次 PDM 数据 、因为我希望程序在等待新的 PDM 缓冲区时执行更多操作。

我在 PDMCC26xx_util.c 中找到了以下代码、我认为它们与 I2S 采样率相关。

/*以下是适用于 PDM 的常量*/
object->i32SampleRate =-1; /*如果为负,则使用用户配置的时钟分频*/
object->audioClkCfg.wclkDiv = 16; /* I2S 字时钟分频器覆盖*/
object->audioClkCfg.samplpleOnPositiveEdge = PDMCC26XX_I2S_SampleEdge_positive;// I2S 样本边缘*/
object->audioClkCfg.wclkPhase = PDMCC26XX_I2S_WordClockPhase_Dual; /* I2S 字时钟相位*/
object->audioClkCfg.wclkInverted = PDMCC26XX_I2S_ClockSource_Normal; /* I2S 反转字时钟*/
object->audioClkCfg.wclkSource = PDMCC26XX_I2S_WordClockSource_Int; /* I2S 字时钟源*/
object->audioClkCfg.bclkDiv = 15; /* I2S 位时钟分频器覆盖*/
object->audioClkCfg.reserved = 0;
object->audioClkCfg.bclkSource = PDMCC26XX_I2S_BitClockSource_Int; /* I2S 位时钟源*/
object->audioClkCfg.mclkDiv = 6; /* I2S 主时钟分频器覆盖*/

过去、我已经更改了 audioClkCfg.bclkDiv 以提高 PCM 数据采样率、 如果我想降低 1.024Mbps  以更 长时间地接收 PDM 数据缓冲器、 应该更改哪个参数? (这样做是否有副作用?)

提前感谢您

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

    或者是否可以更改以下 参数、因为我无法及时使用采样的 PDM 数据

    #define PDM_buffer_size_in_blocks 3. 





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

    通常、可以通过更改 BCLK 频率来调整采样率、但由于抽取和滤波级针对16kHz 采样率进行了优化、因此不建议/支持。

    增加延迟并让应用程序有更多时间处理数据的更好方法是增加 PDM 驱动程序将排队的缓冲区数量。

    请参阅 BLE-Stack 用户指南中的此部分
    software-dl.ti.com/.../ble_voice.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的帮助、我认为 PDM_BUFFER_SIZE_IN_BLOC区块 是您要讨论的一个(我在 RTOS 2.21 PDM PDMCC26XX.h 中找不到 minimum_PDM_BUFFER_queue_depth、可能是因为版本差异)。

    如果我想修改 PDMCC26XX.h 中的 pdm_buffer_size_in_blocks (即 我修改 RTOS 驱动程序库)、我应该怎么做? 我是否应该更改 RTOS 驱动程序文件夹中的驱动程序文件、然后通过 gmake -f tirtos.mak 重建库? 您是否有有关此问题的教程?

    顺便说一下、是否可以 找到 pdm2pcm16k (抽取滤波器)函数定义并对其进行修改?

    提前感谢您

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

    您好 Jason、

    您是正确的、您查找的定义是 pdm_buffer_size_in_blocks。 自 BLE-Stack 2.2.1以来、这种情况已发生变化、我很抱歉造成任何混淆。

    您可以通过两种方法之一解决此问题

    1.在项目中包含驱动程序头文件和驱动程序.c 文件。 将链接器和编译器的包含搜索路径置于路径中任何其他路径的上方。

    2.重新构建整个驱动程序库。 在这种情况下、您将使用相关 XDC 工具安装中包含的 gmake、并修改 drivers.mak 以包含所需的所有正确工具链。

    除非你绝对需要一个新的库、否则我建议你不要使用#2、XDC 构建系统会有一些开销。

    编辑: pdm2pcm16k()文件是闭合源 asm 代码,很遗憾,我们目前无法以源代码形式提供它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、我想我已经尝试了解决方案#1、问题是 CCS 不仅可以链接我的项目树中的驱动程序头文件、似乎 CCS 也链接了 RTOS 驱动程序文件夹中的驱动程序头文件、这导致了错误。 那么、"将链接器和编译器的包含搜索路径放置在高于路径中任何其他路径的位置"、您提到了解决此问题的方法吗? 请您详细解释一下这句话、因为我以前从未做过这样的事情。

    再次感谢你的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将驱动程序头文件和 C 文件拖动到工作区时、我建议选择"copy to workspace"选项。 然后、您可以将工作区路径添加到包含列表的顶部。 然后将引用正确的标头。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您实际上是指"文件链接到工作区位置"吗? 因为我只能找到"指向工作区位置选项的链接"

    我配置了包含选项、如下所示:

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

    我实际上是说使用复制文件选项。 然后设置链接顺序、使工作区中的文件比工作区外的文件具有更高的优先级。
    这是由 HID 高级远程项目完成的、该项目将缓冲区数量覆盖为4、您可以参考该项目以了解更多信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、很抱歉、我不熟悉 CCS、但我发现 HID 远程 BLE 项目中的 PDMCC26XX 源文件和头文件都是链接文件

    因此 、根据您的建议、我链接了相对于工作区位置的驱动程序文件、将构建变量(workspace_LOC)设置 Include Options 中的最高顺序(我是否还应该输入 ARM 链接器搜索路径?)、现在整个项目看起来运行正常。

    顺便说一下、默认的#define PDM_buffer_size_in_blocks 3是否具有10ms 的延迟能力?(从驱动程序文件中我认为应该是6ms)

    再次感谢您对 CCS 初学者的耐心等待

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

    您可以链接或复制、只要您的搜索路径是正确的顺序、这两种方式都是可以接受的

    我之所以建议使用工作区、是因为它易于与 SDK 中的工作区进行划分。 (您可以修改工作区版本而不损坏 SDK)

    再说一次、只要你保持一致、你就会觉得很好。

    为了确保加载正确的代码、您可以刷写器件并进行调试以查看此定义的值。  

    每个缓冲区为应用程序提供额外的2ms 延迟(以增加 RAM 使用率为代价)。