USER GUIDE / AUDIO SYSTEM / AUDIO INTERFACE / OPERATION FLOW

操作流程

AIC 模块既可通过处理器使用编程 I/O 指令进行访问,也可由 DMA 控制器直接访问。处理器使用编程 I/O 指令访问 AIC,可以访问以下类型的数据。

  1. AIC 内存映射寄存器数据——所有寄存器均为 32 位宽,并按字边界对齐。
  2. AIC 控制器 FIFO 数据——通过访问 I2S 控制器的串行音频数据寄存器 (AICDR) 可将数据写入发送 FIFO。对 AICDR 执行写操作会更新发送 FIFO 条目,而对 AICDR 执行读操作则会取出接收 FIFO 条目。
  3. I2S CODEC 内部寄存器——可通过 L3 总线访问 CODEC 寄存器。通过软件控制三个 GPIO 引脚来模拟 L3 总线操作。

DMA 控制器只能访问 FIFO。访问是通过数据寄存器进行的,如上段所述。DMA 控制器响应 I2S 控制器发出的以下 DMA 请求:

  1. 发送 FIFO 请求基于发送触发阈值 (AICFR.TFTH) 设置。
  2. 接收 FIFO 请求基于接收触发阈值 (AICFR.RFTH) 设置。

初始化

开机或其他硬件复位(WDT 等)时,AIC 将被禁用。软件必须在开机或复位后启动 AIC 和内部 CODEC。如果在数据传输或其他地方发现错误,软件必须初始化 AIC 和可选的内部 CODEC。以下是初始化流程。

步骤一:选择内部 CODEC (AICFR.ICDC)。

步骤二:如果选择 I2S/MSB-Justified,则在 I2S 和 MSB-Justified 之间进行选择 (I2SCR.AMSL)。

步骤三:决定 BIT_CLK 方向 (AICFR.BCKD) 和 SYNC 方向 (AICFR.SYNCD)。

步骤四:如果将 BIT_CLK 配置为输出,则必须将 BIT_CLK 分频器 I2SDIV.DV 设置为与 I2SDIV 说明中所示值相对应的值。此外,还必须设置时钟选择以及 PLL 时钟输出和 AIC 之间的分频器(CPM 中的 CFCR.I2S 和 I2SCDR)。通过向 AICFR.ENB 写 1 来启用 AIC。

步骤五:如果需要复位 AIC 寄存器和刷新 FIFO,则向 AICFR.RST 写 1。如果只需要刷新 FIFO,则向 AICCR.FLUSH 写 1。此步骤及其后续操作中,BIT_CLK必须已存在。

步骤六:如果内部 CODEC 采用 I2S/MSB-Justified 格式,则通过与 CODEC 连接的控制总线(例如 I2C 或 L3,取决于 CODEC)配置 I2S/MSB-JustifiedCODEC。如果重置不涉及 I2S/MSB-justifiedCODEC 或 ADC/DAC 功能更改,则可跳过此步骤。

CODEC 内部寄存器访问操作

内部音频 CODEC 可通过其内部寄存器进行配置/控制。要访问这些寄存器,采用 I2S/MSB-justified 对齐格式的 CODEC 通常采用 L3 总线、SPI 总线、I2C 总线或其他控制总线。L3 总线操作可通过芯片的 3 个 GPIO 引脚由软件模拟。

音频播放

外发音频采样数据(从 AIC 到 CODEC)通过处理器的存储指令或通过 DMA 从内存写入 AIC 发送 FIFO。然后,AIC 从 FIFO 中获取数据,将其序列化,并通过串行线 DAC_SDATA 发送到外部 CODEC 或通过内部线发送到内部 CODEC。

通过设置 AICFR.ENB 启用 AIC 时,音频传输会自动启用。但此时所有播放数据均为零,除非以下两个条件同时满足:

  1. AICCR.ERPL 必须为 1。如果 AICCR.ERPL 为 0,即使发送 FIFO 中有采样数据,也会向 CODEC 发送 0 值。
  2. 发送 FIFO 中至少有一个音频采样数据。如果发送 FIFO 为空,即使 AICCR.ERPL 为 1,也会向 CODEC 发送零值或最后一个样本(取决于 AICFR.LSMP)。

以下是音频播放配置流程:

步骤一:根据需要配置 CODEC。

步骤二:通过 AICCR.OSS 配置采样大小。

步骤三:配置采样通道(AICCR.CHANNEL)。

步骤四:如果采样大小配置为 16 位,则选择打包或非打包模式 (AICCR.PACK16)。

步骤五:如果配置了双通道,选择是否右通道优先采样数据 (I2SCR.RFIRST)。

步骤六:如果配置了双通道,选择是否切换采样数据 (I2SCR.SWLH)。

步骤七:通过时钟分频器(适用于BIT_CLK由内部提供的I2S/MSB对齐格式)或 CODEC 寄存器(适用于BIT_CLK由内部CODEC提供的情况)配置采样率。

步骤八:其他一些配置:单声道到立体声、endian 切换、有符号/无符号数据传输、发送 FIFO 配置、发送 FIFO 下溢时播放 ZERO 或最后一个采样等。

步骤九:向 AICCR.ERPL 写 1。

步骤十:建议在发送 FIFO 中至少预填充一帧 PCM 数据,以防止 FIFO 下溢标志(AICSR.TUR)触发。

步骤十一:将采样数据填入发送 FIFO。重复此步骤,直到完成所有采样数据的填充。在此过程中,请对 FIFO 进行控制,确保不会发生 FIFO 下溢和其他错误。当发送 FIFO 下溢时,音频播放可能会出现噪音或停顿,此时 AICSR.TUR 为 1,如果 AICCR.ETUR 为 1,则 AIC 会产生中断。

步骤十二:等待 AICSR.TFL 变为 0。这样,发送 FIFO 中的所有采样数据都已播放,以便下一次可以干净地启动。

步骤十一:AICCR.ERPL 写 0。

音频录制

音频采样数据(从 CODEC 到 AIC)通过ADC_SDATA线(对于内部CODEC)串行接收,并将其转换为并行字,然后存储在 AIC 接收 FIFO 中。然后,可通过加载指令将数据从 FIFO 读取到处理器,或通过 DMA 将数据读取到存储器。

通过设置 AICFR.ENB 启用 AIC 时,音频录制功能会自动启用。但此时所有接收到的数据都会被丢弃,除非以下两个条件同时满足:

  1. AICCR.EREC 必须为 1。如果 AICCR.EREC 为 0,即使接收 FIFO 中还有空间,接收到的数据也会被丢弃。
  2. 接收 FIFO 中至少有一个剩余空间。如果接收 FIFO 已满,即使 AICCR.EREC 为 1,接收到的数据也会被丢弃。

以下是音频录制流程:

步骤一:根据需要配置 CODEC。

步骤二:通过 AICCR.ISS 配置采样位宽。

步骤三:通过时钟分频器(适用于BIT_CLK由内部提供的I2S/MSB-Justified格式)或 CODEC 寄存器(适用于BIT_CLK由内部CODEC提供的情况)配置采样率。

步骤四:其他一些配置:有符号/无符号数据传输、接收 FIFO 配置等。

步骤五:AICCR.EREC 中写入 1。在设置 AICCR.EREC 之前,确保接收 FIFO 中有可用空间。通常情况下,在设置 AICCR.EREC 之前,应从接收 FIFO 中获取数据,清空接收 FIFO。

步骤六:从接收 FIFO 中获取采样数据。重复上述步骤,直到音频录制完毕。在此过程中,请控制 FIFO 以确保不会发生 FIFO 上溢或其他错误。当接收 FIFO 上溢时,将丢失部分已录制的音频样本,此时 AICSR.ROR 为 1,如果 AICCR.EROR 为 1,AIC 将发出中断。有关 FIFO 的详细说明,请参阅 6.1.6.5 FIFOs 操作(第22页)。

步骤七:向 AICCR.EREC 写 0。

步骤八:从接收 FIFO 中提取采样数据,直到 AICSR.RFL 变为 0。这样接收 FIFO 中的所有采样数据都已被提取,以便下次能够干净地启动。当接收 FIFO 为空时,读取返回 0。

FIFOs 操作

AIC 有两个 FIFO,一个用于发送音频样本,另一个用于接收。所有 AIC 播放/录制的音频采样数据都从发送/接收FIFO中读取/写入。RXFIFO 的宽度为 24 位,深度为 64 位,无论采样大小,一个条目用于保存一个音频样本。发送 FIFO 的宽度为 32 位,深度为 64 位,无论采样大小,一个条目可保存一个音频样本,但在 16 位打包模式下,一个条目可保存两个音频样本。AICDR.DATA 为处理器/DMA 提供了向发送 FIFO 写入和从接收 FIFO 读取的访问点。对 AICDR.DATA 的一次访问可处理一个样本。采样数据应放在内存或处理器寄存器的 LSB(最低有效位)上。发送时,超出样本长度的位将被丢弃。在接收时,这些位被置 0。下图展示了FIFO的访问机制。

通过 APB 总线访问发送/接收 FIFO
图 1 通过 APB 总线访问发送/接收 FIFO

软件与总线主控方必须确保数据在总线上的正确存放方式。

在DMA总线主控模式下,一个 24、20、18 位音频采样必须占用内存中一个 32 位字空间,因此必须使用 32 位宽度的 DMA。一个 16 位采样占用内存中一个 16 位半字空间,因此必须使用 16 位宽度的 DMA。一个 8 位采样占用一个字节的内存,除 16 位打包模式外,必须使用 8 位宽度的 DMA。在 16 位打包模式下,两个 16 位采样占用内存中一个 32 位字空间,因此必须使用 32 位宽度的 DMA。

在处理器总线主控模式下,任何类型的音频采样点都必须以LSB(最低有效位)对齐方式存放在CPU通用寄存器中,并使用 32 位加载/存储指令从 AICDR.DATA 读/写。在处理 16 位或 8 位的较小位宽的采样数据时,除 16 位打包模式外,软件可能需要进行数据打包/解包操作。在 16 位打包模式下,采样数据被打包,两个 16 位音频采样共用一个 CPU 通用寄存器。

AICFR.TFTH 和 AICFR.RFTH 用于设置 FIFO 阈值,这些阈值将触发 DMA 请求和/或 FIFO 服务中断。AICFR.TFTH 和 AICFR.RFTH 的值应适当,过小或过大均会影响系统性能。若RFTH过小或TFTH过大,会导致DMA 突发传输长度或处理器单次可处理的采样点数过少,从而降低总线或处理器效率。若RFTH过大或TFTH过小,则会缩短总线或中断响应处理下溢/上溢的缓冲时间,可能导致播放/录音错误。

在发送下溢条件下,AICSR.TUR 将置为 1。如果 AICCR.ETUR 为 1,则会触发中断。在发送下溢条件下,系统将持续通过串行链路发送零值或最后有效采样点。在以下情况下会出现发送欠载:

  1. 内存中仍有有效的发送数据,但 DMA 控制器/处理器忙于处理其他优先级更高的任务而未能及时填充发送FIFO。
  2. DMA 控制器/处理器已将所有有效数据从内存传输到发送 FIFO。

在接收上溢条件下,AICSR.ROR 将置为 1。如果 AICCR.EROR 为 1,则会触发中断。在接收上溢条件下,CODEC 发送的数据会丢失,不会被记录。

播放/录制双通道数据时,左通道数据默认为 FIFO 和串行链路中的第一个数据。在 16 位打包模式下,可以配置左通道或右通道为首个数据。默认情况下,寄存器的低16位存放左声道,高16位存放右声道。但可通过I2SCR.SWLH寄存器位切换左右声道顺序。

数据流控制

有三种方法可用于控制/同步音频输入/输出数据流。

轮询和处理器访问

AICSR.RFL 和 AICSR.TFL 反映了接收和发送 FIFO 中的样本数量。通过读取这些寄存器字段,处理器可以检测音频录制中接收 FIFO 中何时有数据采样,然后从 RX-FIFO 中加载这些样本;以及音频播放中发送 FIFO 中何时有空闲空间,然后将采样存储到 TX-FIFO。

轮询方式的效率非常低,不推荐使用。

中断和处理器访问

为 FIFO 中断触发阈值 AICFR.TFTH 和 AICFR.RFTH 设置适当的值。将 AICCR.ETFS 和/或 AICCR.ERFS 设为 1,以启用发送和/或接收 FIFO 触发中断。当发现中断时,意味着在发送或接收 FIFO 中存在空闲空间或数据采样,处理器可便可向FIFO存储或从FIFO加载采样数据。

中断方式比轮询方式更有效。

DMA 访问

音频数据是实时数据流,但数据带宽较低,通常低于 1.2Mbps。DMA 方法是最有效的方法,也是推荐的方法。

要启用 DMA 操作,请将 AICCR.TDMS 和 AICCR.RDMS 分别设为 1,以用于发送和接收的DMA功能。还需要在 DMA 控制器中分配两个通道,分别用于数据发送和接收。详情请参考处理器的 DMA 控制器规范。

AICFR.TFTH 和 AICFR.RFTH 用于设置发送和接收 FIFO 阈值,以决定是否向 DMA 控制器发出 DMA 请求。为了响应请求,DMA控制器会控制存储器和 TX/RX FIFO 之间的数据移动。

音频采样格式

16 位打包模式

单通道(单声道)模式和双通道(立体声)模式:

单声道(左)和双声道(右)模式(16 位打包模式)
图 2 单声道(左)和双声道(右)模式(16 位打包模式)

四通道模式和六通道模式:

四通道(左)和六通道(右)模式(16 位打包模式)
图 3 四通道(左)和六通道(右)模式(16 位打包模式)

八通道模式:

八通道模式(16 位打包模式)
图 4 八通道模式(16 位打包模式)

正常模式

单声道(单声道)和双声道(立体声)模式:

单通道(左)和双通道(右)模式
图 5 单通道(左)和双通道(右)模式

四通道模式和六通道模式:

四通道(左)和六通道(右)模式
图 6 四通道(左)和六通道(右)模式

八声道模式;

八声道模式
图 7 八声道模式