是否有关于 I2S 驱动程序缓冲区处理和状态回调的描述?我正在将一个音频处理项目从 Kine
tis 移植到 LPC55S69,在 Kinetis 上我使用的是我自己的 I2S DMA 驱动程序,我需要弄清楚我的驱动程序的哪些部分可以用 MCUX SDK 驱动程序替换——或者我是否应该跳过它并使我自己的驱动程序适应新硬件。
从我从稀疏的 SDK 文档中可以看出,驱动程序似乎有一个队列需要 I2S_NUM_BUFFERS (4) 个条目。它没有提到任何大小限制,所以我假设队列只接受四个指针。
所有提供的示例项目仅使用一个固定缓冲区。他们会连续两次对同一个缓冲区进行排队,以避免播放中出现间隙,但他们没有说明如何管理多个缓冲区。环回示例让发送方和接收方使用相同的缓冲区,因此内容在变化,但没有任何类型的同步机制——它们只是依赖于两者同步同步并且永远不会暂停或经历去同步化这一事实。演示仅更改内容,而不更改发送的缓冲区,这对于大多数实际应用程序来说是不安全的。
有一个 i2s_transfer_callback_t 的回调,它提供了一个类型为 status_t 的参数“completionStatus”,但是 status_t 只是类型定义为 int32_t,没有它可以返回的值的文档。
有 一个[i]带有BufferComplete、Done 和 Busy 值的匿名枚举 - 但没有明确说明这些在回调中使用。我假设这些是 status_t 的值,BufferComplete 表示已发送单个缓冲区,而 Done 表示所有缓冲区都已完成。最好提前知道最终缓冲区是同时生成 BufferComplete [i]和Done,还是只是 Done。
这是在基本 I2S 驱动程序中提供的。在 I2S_DMA 驱动程序中有一个单独的 I2S_DMACallback。手册中似乎根本没有记录。从代码来看,这似乎完全是 ISR 使用的内部函数。那是对的吗?有什么方法可以在 SDK 文档中区分什么是导出函数,什么只在内部使用?或者,如果不相关,可能完全排除内部内容?
我假设完成回调发生在 DMA 传输完成时?还是I2S FIFO清空时有回调?我的应用程序通常不会连续发送音频,因此我需要知道何时在不切断最后一次传输的情况下关闭 I2S 发射器。(感谢硬件设计师让您选择空闲的 I2S 发送器是发送零还是重复最后一个值——这是真正让事情变得更容易的小改动之一。我的应用程序需要这两种方式。)