i.MX RT685 之 Flexcomm I2S TDM 传输

一、I2S TDM 简介

通常 I2S 是传输一个数据 slot 的单声道或双声道数据,随着 MCU 性能的提升,很多朋友在音频开发时需要将多个数据 slot 打包为 TDM (Time Division Multiplexing) 流传输。接下来的内容将以 i.MX RT685 为例,介绍 Flexcomm I2S TDM 传输功能。

二、Flexcomm 复用为 I2S

这里我们需要先了解一下 Flexcomm 复用为普通 I2S。

普通的 I2S 大家比较熟悉,由“帧信号、时钟信号、数据输出信号、数据输入信号” 4 根信号线组成。

图 1. I2S 信号

让我们看一下 Flexcomm 复用为 I2S 的引脚,不知道有没有朋友像我一样感到疑惑,为什么每组 Flexcomm 只有 1 根 DATA 线? 其实,这里的 DATA 线可以复用为输入或输出,如果需要一组完整地 I2S 信号(同时包含输入线和输出线),就需要“借用”另一组 Flexcomm 的 DATA 线来实现,这点在 RT685 EVK 的 Codec 连接上有体现出来,如下图。


图 2. RT685 EVK 原理图 Codec I2S 连接

这里从 MCU 外设配置上来看,实际上是 Flexcomm1 将自己 I2S 的 WS (Frame) & SCK (BCLK) 信号作为共享源 share 给 Flexcomm2 的 I2S DATA,也就是他俩共用 WS (Frame)、SCK (BCLK),再加上各自的 DATA 做输入或输出,共同组成一组完整的 I2S 信号。

在代码中需要设置共享双方,如下图所示。


图 3. 设置共享信号

三、Flexcomm I2S TDM 传输

可以先导入 SDK 例程 evkmimxrt685_i2s_dma_transfer,接下来我们以 4slot 双声道(共 8 channel)、48K sample rate、32bit data width 为例,在该例程的基础上实现 Flexcomm I2S 的 TDM 传输功能。

3.1 I2S TDM 基础参数设置

这里我们可以借用 MCUXpresso Config Tools 的外设配置功能,快速设置相关参数,并参考其自动生成的配置代码。 我们使用 Flexcomm1 DATA 做输出,Flexcomm3 DATA 做输入,这里以前者为例介绍,二者参数配置类似。

图 4. 配置 I2S

上图简单标注了常用相关参数,有些需要注意的地方在这里说明一下。

required bit clock frequency,这个时钟是 TDM 传输时的 clock,即 BCLK 。其值 = sample rate * channel numbers * data width,每当更改了相关参数时,工具会自动计算新的需求时钟。该时钟由 bit clock source(Flexcomm 的外设 clock) 通过分频得到,该分频系数在工具生成的代码中也能对应找到,如下图。

图 5. required bit clock

所以,当我们定下 sample rate = 48K Hz、channel numbers = 8、data width = 32bit 时,required bit clock frequency = 48K * 8 * 32 = 12.288MHz 就已经固定了,可是分频系数 divider 为整数,所以分频前的时钟源必须为 required bit clock frequency 的整数倍,否则工具会警告提醒,如下图。


图 6. 时钟不符合期望

这种情况下,我们就需要将 Flexcomm 外设的时钟配置为工具给出的期望时钟,可以到时钟树界面进行配置,右边窗口是生成的代码,如下图。

图 7. 更改 Flexcomm clock


transfer format,也就是 I2S 的 4 种模式 MODE 0 ~ 3,如下图。这里我们选用第三种 TDM and DSP modes with 1 SCK pulsed WS,即 MODE = 2。

图 8. I2S 模式选择

这里根据通信双方对数据格式的要求来选择,比如有的 Codec 就只支持 MODE = 2 和 3 的模式。

data width,每个通道的数据宽度 bit,常用 16bit、32bit,如果是 24bit 的数据,传输时也要使用 32bit。

primary channel pair data position,第一个通道的位置,比如为 1 表示数据传输比 WS 信号晚 1 个 clock,即从 WS 信号开始后的第二个 clock 开始传输数据。

添加 slot,点击“+”添加,在下方列表中可看到添加的 slot,这里添加 1 个 slot 是指在原有默认 1 个 slot 的基础上添加了新的 slot,也就是共 2 slot。Flexcomm1 最多支持 4 个 slot。


图 9. 添加 slot

每个 slot 需要设置单双声道和 data positionstereo 为双声道,mono 为单声道;这个 data position 要看前面设置的 I2S MODEdata width,比如我们设置 data width 为 32bit,MODE = 0 时,data position 分别为 32、64、96;MODE = 1、2、or 3 时,data  position 分别为 64、128、192。如果有疑惑可以对着 4 种 MODE 的时序图看看,主要是看该 slot 起始位置相对于 WS 信号延迟了多少 bit clock。

另外还有个小地方需要注意一下,上图可以看到右边生成的代码,这里有个小 bug,就是如果前面设置了参数 ④ primary channel pair data position 不为 0,则这个值需要手动加到每个 slot 的 data position 参数上,工具设计可能忘了更新这里,手动添加后如下图所示。

图 10. data position

frame width,帧长度,其值 = channel numbers * data width。比如我们使用 8channel、32bit,则 frame width = 8 * 32 = 256bit。

到这里 Flexcomm1 I2S TDM 发送的常用参数就介绍完了,Flexcomm3 的接收参数与之类似。配置完之后,我们可以参考工具生成的代码,将其添加到之前导入的例程 evkmimxrt685_i2s_dma_transfer 的 main() 中,屏蔽例程的 Codec 部分,其他地方按自己需求修改。

3.2 测试现象

将其烧录到 RT685 EVK 中测试,捕捉 TDM 信号如下图,代码中让其循环发送数据 0x00 ~ 0xFF。

图 11. TDM 波形

四、参考资料

(1)RT6xx User Manual,可在 NXP 官网下载,网址如下:

https://www.nxp.com/webapp/sps/download/preDownload.jsp?render=true

(2)AN12764 8-channel DMIC Audio Acquisition on RT600 HiFi4,可在 NXP 官网下载,网址如下:

https://www.nxp.com.cn/docs/en/application-note/AN12764.pdf

技术文档

类型标题档案
软件evkmimxrt685_i2s_dma_transfer_tdm

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论