USER GUIDE / AUDIO SYSTEM / AUDIO INTERFACE / OPERATION FLOW
操作流程
AIC 模块既可通过处理器使用编程 I/O 指令进行访问,也可由 DMA 控制器直接访问。处理器使用编程 I/O 指令访问 AIC,可以访问以下类型的数据。
- AIC 内存映射寄存器数据——所有寄存器均为 32 位宽,并按字边界对齐。
- AIC 控制器 FIFO 数据——通过访问 I2S 控制器的串行音频数据寄存器 (AICDR) 可将数据写入发送 FIFO。对 AICDR 执行写操作会更新发送 FIFO 条目,而对 AICDR 执行读操作则会取出接收 FIFO 条目。
- I2S CODEC 内部寄存器——可通过 L3 总线访问 CODEC 寄存器。通过软件控制三个 GPIO 引脚来模拟 L3 总线操作。
DMA 控制器只能访问 FIFO。访问是通过数据寄存器进行的,如上段所述。DMA 控制器响应 I2S 控制器发出的以下 DMA 请求:
- 发送 FIFO 请求基于发送触发阈值 (AICFR.TFTH) 设置。
- 接收 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 时,音频传输会自动启用。但此时所有播放数据均为零,除非以下两个条件同时满足:
- AICCR.ERPL 必须为 1。如果 AICCR.ERPL 为 0,即使发送 FIFO 中有采样数据,也会向 CODEC 发送 0 值。
- 发送 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 时,音频录制功能会自动启用。但此时所有接收到的数据都会被丢弃,除非以下两个条件同时满足:
- AICCR.EREC 必须为 1。如果 AICCR.EREC 为 0,即使接收 FIFO 中还有空间,接收到的数据也会被丢弃。
- 接收 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的访问机制。

软件与总线主控方必须确保数据在总线上的正确存放方式。
在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,则会触发中断。在发送下溢条件下,系统将持续通过串行链路发送零值或最后有效采样点。在以下情况下会出现发送欠载:
- 内存中仍有有效的发送数据,但 DMA 控制器/处理器忙于处理其他优先级更高的任务而未能及时填充发送FIFO。
- 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 位打包模式
单通道(单声道)模式和双通道(立体声)模式:

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

八通道模式:

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

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

八声道模式;
