i.MX RT 的多通道 SAI 介绍

前言

       上一篇博文我已经给大家介绍了《数字音频基础及 i.MX RT 的音频子系统》,有了对数字音频和 i.MX RT 系列的基本认识,相信大家可以更好地了解熟悉 i.MX RT 系列多通道 SAI。这一篇将对 i.MX RT 系列的多通道 SAI 进行介绍,并告诉大家如何对 i.MX RT 的 SAI 进行配置,从而处理多个声道的音频。

i.MX RT 系列多通道 SAI 的介绍
SAI 的概述
       SAI(Synchronous Audio Interface)音频串行接口,可以通过 eDMA 和 ARM CPU 进行访问,输入 / 输出通过 IOMUX 连接到焊盘。如下图 1 所示,i.MX RT 系列的 SAI1 和 SAI2 / SAI3 的 TX 和 RX 数据线数量分别是 4 和 1。
图 1 - i.MX RT 的 SAI 接口

       SAI1 用于多声道音频接口,最多支持 4 线 / 8 声道音频输入和 / 或 4 线 / 8 声道,音频输出为 384 kHz / 32 位。

       SAI2 和 SAI3 可以用于高达 384 kHz / 32 位的立体声音频输入和输出。

       SAI3 能够直接驱动 MQS 作为低成本音频输出。

SAI 的功能

       I2S 模块提供了一个同步音频接口(SAI),它支持带有帧同步的全双工串行接口,如 I2S、AC97、TDM 和 Codec / DSP 接口。RT 系列芯片中具体的 SAI 功能仍需参考芯片的用户手册中 Audio 章节的芯片相关信息。其功能主要有以下 10 点:

  • 支持带有帧同步的全双工串行接口,如 I2S、 AC97 和 TDM 接口。
  • 发送器带有独立的位时钟和帧同步支持 4 条数据线。
  • 接收器带有独立的位时钟和帧同步支持 4 条数据线。
  • 同步模式,用于在发送器和接收器之间共享位时钟和帧同步线。
  • 每个数据行可以支持 1 到 32 字的最大帧大小。
  • 字大小可编程从 8 位到 32 位。
  • 每个发送和接收数据线的异步 32 × 32 位 FIFO。
  • 支持 FIFO 错误后自动重启,无需软件干预。
  • 支持将 8 位和 16 位数据打包成每个 32 位 FIFO 字(FIFO 打包模式)。
  • 支持将多个数据线 FIFOs 组合成单个数据线 FIFO(FIFO 组合模式)。

SAI 的框图

       下图 2 是 SAI 的框图,该方框图也显示了模块时钟。

图 2 – SAI 框图

SAI 时钟

       SAI 时钟包括音频主时钟、位时钟和总线时钟。

  • 当接收器或发送器配置为内部生成的位时钟时,音频主时钟用于生成位时钟。
  • 发送器和接收器使用位时钟进行移位,移位可以从音频主时钟内部生成,也可以从外部提供。
  • 总线时钟用于控制和配置寄存器,并生成同步中断和 DMA 请求。

异步 / 同步模式

       异步模式:位时钟、帧同步和发送器 / 接收器使能是独立的。其中发送器设置为异步,接收器设置为异步:使用自身位时钟和帧同步。

       同步模式:共享位时钟、帧同步和发送器 / 接收器使能。其中发送器设置为同步,接收器设置为异步:使用接收器的位时钟和帧同步。

数据调整

       每个发送和接收通道都包括一个 32 × 32 位的 FIFO。使用 SAI 传输 / 接收数据寄存器访问 FIFO 数据。

       FIFO 中的数据可以通过使用第一个位移位配置字段在 32 位宽的寄存器内的任何位置进行对齐,该配置字段选择第一个位移位的位索引(在 31 到 0 之间)。

       支持的数据对齐和所需的第一位移位配置的示例如图 3 所示,用于 LSB 第一次配置,如图 4 所示,用于 MSB 第一次配置。

图 3 – SAI 第一位移位,LSB First

图 4 – SAI 第一位移位,MSB First

FIFO 指针

       TX FIFO:

  • 当写入 TDR(Transmit Data Register)时,相应的 TFR[WFP] 在每次有效写入后递增。
  • SAI 支持对 TDR 的 8 位、16 位和 32 位的写操作,每次写操作后 FIFO 指针将会递增。
  • 如果 FIFO 已满,对 TDR 的写入将被忽略。
  • 如果 TX FIFO 为空,则在下一个未屏蔽字开始之前,必须至少向三位时钟写入 TDR,以避免 FIFO 欠载。
  • 如果读指针(TFR [RFP])和写指针(TFR [WFP])相同,则 FIFO 为空。如果除 MSB 之外,读和写指针相同,则 FIFO 已满。

       RX FIFO:

  • 当读取 RDR(Receive Data Register)时,RFR[RFP] 在每次有效读取后递增。
  • 如果读指针(RFR [RFP])和写指针(RFR [WFP])相同,则 FIFO 为空。如果除 MSB 之外,读和写指针相同,则 FIFO 已满。

FIFO 打包模式

       允许将 8 位数据或 16 位数据打包到每个 32 位 FIFO 字中。 如果字长大于 8 位或 16 位,则只有前 8 位或 16 位存储到 FIFO。 每个帧中的第一个字总是从一个新的 32 位 FIFO 字开始,并且必须在第一个压缩字内配置移位的第一位。启用 FIFO 打包后,仅当软件已读取完整的 32 位 FIFO 字时,FIFO 读取指针才会递增。

(1)TX FIFO 8 位打包                                 (2) TX FIFO 16 位打包
图 5 – TX FIFO 打包模式

(1)RX FIFO 8 位打包                                  (2)RX FIFO 16 位打包
图 6 – RX FIFO 打包模式

       在一个 32 位 FIFO 字中为发送器和/或接收器存储多个 8 位或 16 位数据字。每帧甚至不需要多个字,并且完全支持字屏蔽。

FIFO 组合模式

       为 FIFO 写启用 FIFO 组合模式时,对任何 FIFO 数据寄存器的软件写操作将在使能的数据通道 FIFO 之间交替进行写操作。例如,如果启用了两个数据通道,则将对第一个启用的数据通道 FIFO 执行第一次写入,而对第二个启用的数据通道 FIFO 进行第二次写入。复位 FIFO 或禁用 FIFO 写入的 FIFO 组合模式会将指针复位回到第一个启用的数据通道。为从发送移位寄存器的 FIFO 读取启用 FIFO 组合模式时,发送数据通道输出将在使能的数据通道 FIFO 之间交替。例如,如果启用了两个数据通道,则将从第一个启用的数据通道 FIFO 发送第一个未屏蔽的字,并从第二个启用的数据通道 FIFO 发送第二个未屏蔽的字。由于帧的第一个字始终是从第一个启用的数据通道 FIFO 发送的,因此建议将每个帧的未屏蔽字的数量均匀地除以启用的数据通道的数量。下图 7 图 8 是 TX 和 RX 组合模式的说明。

 

图 7 – TX FIFO 组合模式


图 8 – RX FIFO 组合模式

       其中可写入 TCR4[FCOMB] 或 RCR4[FCOMB] 的值来选择 FIFO 读写的启用:

  • 00b - 禁用 FIFO 组合模式
  • 01b - FIFO 读取启用 FIFO 组合模式
  • 10b - FIFO 写入启用 FIFO 组合模式
  • 11b - FIFO 读取写入启用 FIFO 组合模式

FIFO 中断和 DMA 请求

       FIFO 的中断和 DMA 请求有以下标志位,具体含义如下:

       FIFO 请求标志位(FIFO request flag)

  • 当任一使能 TX FIFO 中的条目数小于或等于 TX FIFO 水印配置时,TX FIFO request flag 置 1,当每个使能 TX FIFO 中的条目数大于 TX FIFO 水印配置时,TX FIFO request flag 清零。
  • 当任一已启用的 RX FIFO 中的条目数大于RX FIFO 水印配置时,RX FIFO request flag置 1,当每个已启用的 RX FIFO 中的条目数小于或等于 RX FIFO 水印配置时,RX FIFO request flag 清零。
  • FIFO request flag 可以产生中断或 DMA 请求。

       FIFO 警告标志位(FIFO warning flag)

  • 当任一使能 TX FIFO 中的条目数为空时,TX FIFO warning flag置 1,当每个使能 TX FIFO 中的条目数不为空时,TX FIFO warning flag 清零。
  • 当任一使能 RX FIFO 中的条目数已满时,RX FIFO warning flag 置 1,当每个使能 RX FIFO 中的条目数未满时,RX FIFO warning flag 清零。
  • FIFO warning flag 可以产生中断或 DMA 请求。

       FIFO 错误标志位(FIFO error flag)

  • 当任一使能的 TX FIFO 下溢时,TX FIFO error flag 置 1。该位置位后,在TCSR[FEF] 清零之前,所有启用的传输通道将传输零数据。当 TCR4[FCONT] 被置位时,在 FIFO 错误上,在 FIFO warning flag 被清除后,SAI 将从导致 FIFO 错误被置位的同一个字继续。
  • 当任一使能的 RX FIFO 溢出时,RCSR[FEF] 置 1。置位后,所有已启用的接收通道将丢弃接收数据,直到 RCSR[FEF] 被清除。当 RCR4[FCONT] 被设置时,在FIFO 错误上,在 FIFO warning flag 被清除后,SAI 将从导致 FIFO 错误被设置的同一字继续。

       帧错误标志位(Sync error flag)

  • Sync error flag TCSR[SEF] 或 RCSR[SEF] 是针对外部产生的帧同步进行配置时设置的,当发送器或接收器忙于前一帧时,外部帧同步置位。

       字开始标志位(Word start flag)

  • 在所选字的第二个位时钟开始时设置 Word start flag。
i.MX RT 中 SAI 的使用

通用立体声播放 / 录制方案

       下图是通用立体声播放 / 录制方案部分框图,i.MX RT 用于控制 codec,在同步模式下,i.MX RT 主要是发送三个控制信号给 codec,分别是 MCLK、BCLK和SYNC。其中 TXD 用于发送数据,RXD 用于接收数据,I2C 用于配置 codec。


图 9 – 通用立体声播放 / 录制方案

SAI 处理多通道音频

       利用 SAI 可以处理两个频道以上的音频,例如播放 7.1 环绕声,其中 7.1 环绕声是家中常用的八声道环绕声音响系统的通用名称,具体关于声道的介绍,欢迎大家看我的上一篇博文《数字音频基础及 i.MX RT 的音频子系统》,里面有关于声道的介绍。


图 10 – 7.1 环绕声配置

SAI 发送方式的配置

       i.MX RT 系列可以使用 5 种 SAI 发送方式,分别是:

  • TCR4[FCOMB] =00;DMA/CPU writes 1 TDR;-> 1 FIFO is used;1 shift register/TxD line are used。
  • TCR4[FCOMB] =00;DMA/CPU writes 4 TDRs;-> 4 FIFO is used;4 shift register/TxD line are used。
  • TCR4[FCOMB] =01;DMA/CPU writes 4 TDRs;-> 4 FIFO is used;1 shift register/TxD line are used。
  • TCR4[FCOMB] =10;DMA/CPU writes 1 TDRs;-> 4 FIFO is used;4 shift register/TxD line are used。
  • TCR4[FCOMB] =11;DMA/CPU writes 1 TDRs;-> 4 FIFO is used;1 shift register/TxD line are used。

       这 5 种方式中,使用 1 个 TDR 相较于多个 TDR 对于 DMA / CPU 来说更简单。使用多个 FIFO 则能将更多的字节从内存传输到 FIFO DMA 或中断请求,同时降低了 DMA 或中断请求频率,从而获得更高的整体效率。对于 TxD line 来说,1 个 TXD line 所占 IO 少,所需比特率更高,比使用 4 TxD line 播放 7.1 环绕音乐高 4 倍,同时需 codec 也支持单个 TxD line 模式,即 TDM(Time Division Multiplexing)格式。

i.MX RT1060 SAI 的 Hands On Demo

       硬件:i.MX RT1060 EVK、微型 USB 线、耳机、电脑。

       软件:基于 SDK_2.4.0_EVKMIMXRT1060 SAI 演示。

       将耳机插入 i.MX RT1060 EVK(J12)上的耳机插孔,使用以下设置打开串行终端:115200 波特率、8 个数据位、无奇偶校验、一个停止位、无流量控制,将程序下载到目标板,在 IDE 中启动调试器,在终端输入一个数字(1,2,5)来选择其中一个选项,当演示成功运行时,会在终端上看到日志,如下图 11 所示。


图 11 – 演示终端日志

       其中选项 1 表示同时录音和回放(默认为 10 秒)

  • 双工音频传输,同时录音和回放。
  • 同一组缓冲器用于 SAI RX 写入和 TX 读取数据。建议使用 Ping Pong 缓冲区(2 buffers)。

       其中选项 2 表示回放正弦波(250 Hz,默认为 5 秒)

  • 数据由 CMSISDSP library arm_sin_q15() 生成。
  • 使用 CMSISDSP library arm_cfft_radix2_f32() 的快速傅里叶变换计算基频。

       此 DEMO 可将音频录制到 SD 卡,然后回放(默认为 5 秒)

  • 使用微型 SD 卡。
  • 在 h 中定义一个宏 DEMO_SDCARD 来启用演示功能。
  • 记录的数据存储在带 FAT 文件系统的 SD 卡的 wav 文件中。

       其中选项 5 表示播放一段音乐

  • 播放 4 秒长的音乐。
  • 播放 中的音频。

       下图 12 是 i.MX RT1060 SAI 的 Hands On Demo 的系统框图。


图 12 – 演示系统框图

参考资料
  • MX RT1015 Processor Reference Manual,NXP Semiconductor;
预告

       通过 《i.MX RT 的多通道 SAI 介绍》 这篇博文,相信大家已经了解了 i.MX RT 的 SAI 的使用,后续我会持续更新 i.MX RT 系列芯片在 Audio 应用的博文,欢迎大家一起分享,并给出建议。

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

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

评论

许先生

许先生

2022年3月9日
板凳来一个