RT600 I2S外设介绍及应用 (4)

以下代码给出了HiFi4 DMA和中断的具体配置:

DMA_Init(DMA1); /* XCHAL_EXTINT19_NUM, intlevel 2 */ INPUTMUX_AttachSignal(INPUTMUX, 18U, kINPUTMUX_Dmac1ToDspInterrupt); xos_register_interrupt_handler(XCHAL_EXTINT19_NUM, (XosIntFunc *) DMA_IRQHandle, DMA1); xos_interrupt_enable(XCHAL_EXTINT19_NUM); DMA_EnableChannel(DMA1, DEMO_I2S_TX_CHANNEL); DMA_SetChannelPriority(DMA1, DEMO_I2S_TX_CHANNEL, kDMA_ChannelPriority3); DMA_CreateHandle(&s_DmaTxHandle, DMA1, DEMO_I2S_TX_CHANNEL); DMA_EnableChannel(DMA1, DEMO_I2S_RX_CHANNEL); DMA_SetChannelPriority(DMA1, DEMO_I2S_RX_CHANNEL, kDMA_ChannelPriority2); DMA_CreateHandle(&s_DmaRxHandle, DMA1, DEMO_I2S_RX_CHANNEL); 2.5 音频数据流的处理

MCU在同时接收和发送PCM数据并进行播放的应用场景中,容易出现播放音乐卡顿的情况,为了避免出现这种卡顿,一个好的传输机制是必不可少的,下图就给出了一个处理PCM数据的思路。

如图示,总共3个缓冲区用于PCM数据发送(TX)和接收(RX),数据的发送和接收都是通过I2S通道触发DMA请求完成的,这3个缓冲区构成一个闭环。每当一个缓冲区中的PCM数据接收满时,下一个缓冲区将立即开始接收,发送也同理,而且数据的接收和发送是同步的。通俗易懂的讲,I2S的TX永远追不上I2S的RX,并且TX和RX之间永远有个缓冲区是准备好的。从初始框图中可以看到,一开始连续两次提交了I2S的TX和RX的DMA请求,这是为了能够使PCM发送和接收的DMA请求之间从一开始就是无缝衔接的,这能够保证PCM传输不出现时延。

当然,缓冲区的数量取决于用户的实际需求。 当缓冲区为2时,这就构成了一个典型的乒乓缓冲区(ping-pang buffer)。为什么我这里采用了3个缓冲区构成1个ring buffer而不采用简单的ping-pang buffer呢?肯定有人很疑惑,这是因为当PCM数据较为复杂时,例如我介绍的另一篇8通道DMIC采集的应用中,就需要ring buffer的机制。

在本应用中,1帧PCM数据的位宽为32bit(左右声道各16bit),每个缓冲区设置有8帧PCM数据,也就是说每个缓冲区的PCM数据长度为256bit。每个缓冲区的PCM数据长度也对应了I2S通道每次传输的数据长度,在RT600中I2S一次能够传输的音频数据长度最大支持2048bits,所以不能超过这个范围。

RT600 I2S外设介绍及应用

三、RT600 硬件演示平台搭建

为了演示I2S音频数字回环的demo,需要有一块如下图所示的RT600 EVK RevE板子,然后还需要注意以下几点:

JP7.1连接到JP7.2。

JP8.1连接到JP8.2。

J3口作为音频信号的输入,可以连接到PC端。

J4口作为音频信号的输出,连到扬声器。

将ISP开关(SW5)切换成0b010,即ON,OFF,ON

将USB插入板上J6口。

至此,本篇文章介绍完毕。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzszyz.html