SAI

介绍

SAI 接口(串行音频接口)由于其灵活性和广泛的配置范围,提供了多种音频协议。可以面向许多立体声或单声道音频应用。例如,可以支持 I2S 标准、LSB 或 MSB 对齐、PCM 协议。当音频块配置为发射器时,还提供 SPDIF 输出。

为了实现这种级别的灵活性和可重新配置性,SAI 包含两个独立的音频子块。每个块都有自己的时钟发生器和 I/O 线控制器。

SAI 可以在主模式或从模式下工作。音频子块可以是接收器或发射器,并且可以同步或异步工作(相对于另一个)。SAI 可以与其他 SAI 连接以同步工作。

主要特性

SAI 的主要特性如下:

  • 两个独立的 SAI (SAI1, SAI2)

  • 独立的音频子块,可以是发射器或接收器,在 SAI 中各有其 FIFO

  • 每个音频子块集成 16 字的 FIFO

  • 音频子块之间的同步或异步模式

  • 多个 SAI 之间可能的同步

  • 两个音频子块独立的主或从配置

  • 每个音频块的时钟发生器,用于在两个音频子块都配置为主模式时针对独立的音频采样频率

  • 可配置的数据大小:8、10、16、20、24、32 位

  • 音频协议:I2S(I2S_Philips_标准、I2S_LSB 或 I2S_MSB 对齐、长 PCM 或短 PCM)、TDM、AC’97、SPDIF、PDM

  • PDM 接口,支持最多 4 个麦克风对,以及主接收模式

  • 自由协议(I2S、LSB 或 MSB 对齐、短 PCM、长 PCM)接口,支持最多 4 线

  • 如果需要,可提供 SPDIF 输出

  • 最多 16 个可用时隙,大小可配置

  • 每帧的位数可配置

  • 帧同步有效电平可配置(偏移、位长度、电平)

  • 时隙中第一个有效比特的位置可配置

  • 数据传输的 LSB 优先或 MSB 优先

  • 静音模式

  • 立体声/单声道音频帧能力

  • 通信时钟选通边沿可配置 (SCK)

  • 错误标志,如果分别启用则产生相关中断:

    • 溢出和下溢检测

    • 从模式下提前的帧同步信号检测

    • 从模式下延迟的帧同步信号检测

    • 接收时 AC’97 模式的编解码器未就绪

  • 启用时的中断源:

    • 错误

    • FIFO 请求

  • SAI 中的 2 通道 DMA 接口

功能描述

SAI 框图

下图显示了 SAI 的功能框图,而内部输入或输出信号和外部输入或输出信号列出了 SAI 的内部和外部信号。

SAI 主要由两个带有自己时钟发生器的音频子块组成。每个音频块集成了一个由其自身功能状态机控制的 32 位移位寄存器。数据从专用 FIFO 存储或读取。FIFO 可以由 CPU 访问,或者由 DMA 访问,以便在通信期间释放 CPU。每个音频块是独立的。它们可以彼此同步。

一个 I/O 线控制器管理一组 4 个专用引脚(SD, SCK, FS, MCLK),用于 SAI 中的给定音频块。如果两个子块声明为同步,则可以共享其中一些引脚,以释放一些引脚用作通用 I/O。根据应用、解码器要求以及音频块是否配置为主设备,MCLK 引脚可以是输出,也可以不是。

如果一个 SAI 配置为与另一个 SAI 同步运行,则可以释放更多的 I/O(SD_x 引脚除外)。功能状态机可以配置为处理各种音频协议。存在一些寄存器来设置所需的协议(音频帧波形发生器)。

音频子块可以是发射器或接收器,工作在主模式或从模式。主模式意味着 SCK_x 位时钟和帧同步信号由 SAI 生成,而在从模式下,它们来自另一个外部或内部主设备。有一种特殊情况,FS 信号方向与主或从模式定义没有直接关系。在 AC’97 协议中,即使 SAI(链路控制器)设置为使用 SCK 时钟(因此处于从模式),它也将是 SAI 输出。

Note

为了便于阅读本节,符号 SAI_x 指代 SAI_A 或 SAI_B,其中 ‘x’ 代表 SAI A 或 B 子块。

SAI 引脚和内部信号

表 6.1: 内部输入或输出信号

内部信号名称

信号类型

描述

int_a_o

output

音频块 A 全局中断

int_b_o

output

音频块 B 全局中断

sai_a_dma

input/output

音频块 A DMA 应答和请求

sai_b_dma

input/output

音频块 B DMA 应答和请求

sai_sync_out_sck

output

与其他 SAI 块交换的内部时钟输出信号

sai_sync_out_fs

output

与其他 SAI 块交换的内部帧同步输出信号

sai_sync_in_sck

input

与其他 SAI 块交换的内部时钟输入信号

sai_sync_in_fs

input

与其他 SAI 块交换的内部帧同步输入信号

sai_a_clk

input

音频块 A 内核时钟

sai_b_clk

input

音频块 B 内核时钟

sai_pclk

input

APB 时钟

表 6.2: 外部输入或输出信号

外部信号名称

信号类型

描述

int_a_o

output

音频块 A 全局中断

int_b_o

output

音频块 B 全局中断

sai_a_dma

input/output

音频块 A DMA 应答和请求

sai_b_dma

input/output

音频块 B DMA 应答和请求

sai_sync_out_sck

output

与其他 SAI 块交换的内部时钟输出信号

sai_sync_out_fs

output

与其他 SAI 块交换的内部帧同步输出信号

sai_sync_in_sck

input

与其他 SAI 块交换的内部时钟输入信号

sai_sync_in_fs

input

与其他 SAI 块交换的内部帧同步输入信号

sai_a_clk

input

音频块 A 内核时钟

sai_b_clk

input

音频块 B 内核时钟

sai_pclk

input

APB 时钟

主要 SAI 模式

SAI 的每个音频子块可以通过所选音频块的 SAI_xCR1 寄存器中的 MODE 位配置为主模式或从模式。

主模式

在主模式下,SAI 向外部连接的设备提供时序信号:

  • 位时钟和帧同步分别在 SCK_x 和 FS_x 引脚上输出

  • 如果需要,SAI 还可以在 MCLK_x 引脚上生成主时钟。SCK_x、FS_x 和 MCLK_x 都配置为输出

从模式

SAI 期望从外部设备接收时序信号。

  • 如果 SAI 子块配置在异步模式,则 SCK_x 和 FS_x 引脚配置为输入

  • 如果 SAI 子块配置为与另一个 SAI 接口或第二个音频子块同步运行,则相应的 SCK_x 和 FS_x 引脚被释放,可用作通用 I/O

在从模式下,MCLK_x 引脚不被使用,可以分配给其他功能。

建议在启用主设备之前启用从设备。

Note

如果从设备 sai_en = 1,我们应确保 sck 和 fs 焊盘输入不是 x 状态。

Note

如果接收 sai_en = 1,我们应确保 sd 焊盘输入不是 x 状态。

配置和启用 SAI 模式

每个音频子块可以通过相应音频块的 SAI_xCR1 寄存器中的 MODE 位独立定义为发射器或接收器。因此,SAI_SD_x 引脚将分别配置为输出或输入。

同一 SAI 中的两个主音频块可以配置为两个不同的 MCLK 和 SCK 时钟频率。在这种情况下,它们必须配置为异步模式。

SAI 中的每个音频块由 SAI_xCR1 寄存器中的 SAIEN 位启用。一旦该位有效,在从模式下,发射器或接收器就对时钟线、数据线和同步线上的活动敏感。

在主发射模式下,启用音频块会立即为外部从设备生成位时钟,即使 FIFO 中没有数据。然而,FS 信号的生成取决于 FIFO 中是否存在数据。在 FIFO 接收到要发送的第一个数据后,该数据将输出到外部从设备。如果 FIFO 中没有要发送的数据,则会在音频帧中发送 0 值,并产生下溢标志。

在从模式下,当音频块启用并且检测到帧开始时,音频帧开始。

在从发射模式下,音频块启用后的第一帧不可能发生下溢事件,因为这种情况下的强制操作顺序是:

  1. 在从发射模式下启用音频块

  2. 启用从设备

  3. (通过软件或 DMA)写入 SAI_xDR

  4. 等待直到 FIFO 阈值 (FLH) 标志不同于 0b000(FIFO 空)

  5. 启用主设备

SAI 同步模式

存在两个级别的同步,可以在音频子块级别或 SAI 级别。

内部同步

一个音频子块可以配置为与同一 SAI 中的第二个音频子块同步运行。在这种情况下,位时钟和帧同步信号是共享的,以减少通信使用的外部引脚数量。配置为同步模式的音频块会释放其自身的 SCK_x、FS_x 和 MCLK_x 引脚作为 GPIO,而配置为异步模式的音频块是其 FS_x 和 SCK_x 及 MCLK_x I/O 引脚相关的音频块(如果该音频块被视为主设备)。

通常,同步模式下的音频块可用于将 SAI 配置为全双工模式。两个音频块中的一个可以配置为主设备,另一个为从设备,或者两者都配置为从设备,其中一个异步块(相应的 SYNCEN[1:0] 位在 SAI_xCR1 中设置为 00),一个同步块(相应的 SYNCEN[1:0] 位在 SAI_xCR1 中设置为 01)。

外部同步

音频子块也可以配置为与另一个 SAI 同步运行。这可以按以下方式完成:

  1. 配置为其他 SAI 同步源的 SAI 必须定义其哪个音频子块应向其他 SAI 提供 FS 和 SCK 信号。这是通过编程 SYNCOUT[1:0] 位来完成的

  2. 应接收同步信号的 SAI 必须通过设置 SYNCIN[1:0] 位上的适当值来选择哪个 SAI 将提供同步。然后,对于两个 SAI 音频子块中的每一个,用户必须通过 SYNCEN 位指定它是否与另一个 SAI 同步运行

如果给定 SAI 中的两个音频子块都需要与另一个 SAI 同步,则可以选择以下配置之一:

  • 通过 SYNCEN[1:0] 位将每个音频块配置为与另一个 SAI 块同步

  • 通过 SYNCEN[1:0] 位将一个音频块配置为与另一个 SAI 同步。然后,另一个音频块通过 SYNCEN[1:0] 位配置为与第二个 SAI 音频块同步

音频数据大小

通过配置 SAI_xCR1 寄存器中的 DS[2:0] 位,音频帧可以针对不同的数据大小。数据大小可以是 8、10、16、20、24 或 32 位。在传输期间,根据 SAI_xCR1 寄存器中 LSBFIRST 位的配置,先发送数据的 MSB 或 LSB。

帧同步

FS 信号在音频帧中充当帧同步信号(帧开始)。该信号的形状是完全可配置的,以便针对不同的音频协议及其关于帧同步行为的特殊性。这种可配置性通过寄存器 SAI_x_gen_cfg0 完成。

在 AC’97 模式或 SPDIF 模式(SAI_x_audio_ctrl 寄存器中的 PRTCFG[1:0] = 11 或 PRTCFG[1:0] = 10)下,帧同步形状被强制匹配 AC’97 协议。SAI_xFRCR 寄存器值被忽略。

每个音频块是独立的,因此每个块都需要特定的配置。

帧长度

主模式

音频帧长度可以通过设置 SAI_x_gen_cfg0 寄存器中的 FRL[7:0] 字段配置为最多 256 个位时钟周期。如果帧长度大于为帧声明的时隙数,则要传输的剩余位将扩展为 0,或者 SD 线将释放为高阻态,具体取决于 SAI_x_gen_cfg0 寄存器中 TRIS 位的状态(FS 信号角色)。在接收模式下,剩余位被忽略。

如果位 NOMCK 被清零,则 (FRL+1) 必须等于 2 的幂,从 8 到 256,以确保一个音频帧每位时钟周期包含整数个 MCLK 脉冲。

如果位 NOMCK 被置位,则 (FRL+1) 字段可以取 8 到 256 之间的任何值。

从模式

音频帧长度主要用于向从设备指定外部主设备发送的每个音频帧的位时钟周期数。它主要用于检测主设备在正在进行的音频帧期间任何提前或延迟出现的帧同步信号。在这种情况下,将产生错误。

在从模式下,SAI_xFRCR 寄存器中的 FRL[7:0] 配置没有约束。

帧中的位数等于 FRL[7:0] + 1。

音频帧中要传输的最小位数是 8。

帧同步极性

SAI_x_gen_cfg0 寄存器中的 FSPOL 位设置 FS 引脚的有效极性,帧由此开始。帧开始是边沿敏感的。

在从模式下,音频块等待有效的帧开始传输或接收。帧开始与此信号同步。仅当在正在进行的通信期间未检测到帧开始并将其同化为提前的帧开始时,它才有效。

在主模式下,帧同步在每次音频帧完成时连续发送,直到 SAI_x_audio_ctrl 寄存器中的 SAIEN 位被清除。如果先前的音频帧结束时 FIFO 中没有数据,则将处理下溢条件,但音频通信流不会中断。

帧同步有效电平长度

SAI_x_gen_cfg0 寄存器中的 FSALL[6:0] 位允许配置帧同步信号的有效电平长度。长度可以设置为 1 到 128 个位时钟周期。

例如,在 I2S、LSB 或 MSB 对齐模式下,有效长度可以是帧长度的一半,或者对于 PCM/DSP 或 TDM,可以是一位宽。

帧同步偏移

根据应用程序中目标的音频协议,帧同步信号可以在传输音频帧的最后一位或第一位时断言(例如,在 I2S 标准协议和 MSB 对齐协议中分别如此)。SAI_x_gen_cfg0 寄存器中的 FSOFF 位允许选择两种配置之一。

FS 信号角色

FS 信号根据 FS 功能可以有不同的含义。SAI_x_gen_cfg0 寄存器中的 FSDEF 位选择它将具有哪种含义:

  • 0:帧开始,例如 PCM、AC’97 音频协议

  • 1:帧开始以及帧内的通道侧标识,例如 I2S、MSB 或 LSB 对齐协议

当 FS 信号被视为帧开始和帧内的通道侧标识时,声明的时隙数必须被视为左通道的一半和右通道的一半。如果半音频帧上的位时钟周期数大于专用于通道侧的时隙数,并且 TRIS = 0,则在传输时,在剩余的位时钟周期发送 0。否则,如果 TRIS = 1,则 SD 线释放为高阻态。在接收模式下,直到通道侧改变之前,不考虑剩余的位时钟周期。

如果 SAI_x_gen_cfg0 中的 FSDEF 位保持清零,因此 FS 信号等同于帧开始,并且如果 SAI_xSLOTR 中 NBSLOT[3:0] 定义的时隙数乘以 SAI_xSLOTR 中 SLOTSZ[1:0] 配置的每个时隙的位数小于帧大小(SAI_xFRCR 寄存器中的 FRL[7:0] 位),则:

  • 如果 SAI_x_gen_cfg0 寄存器中的 TRIS = 0,在发射器的情况下,最后一个时隙之后的剩余位将被强制为 0 直到帧结束

  • 如果 TRIS = 1,在传输这些剩余位期间,线路将释放为高阻态

在接收模式下,这些位被丢弃。

当发射器模式下的音频块配置为在 SD 线上获取 SPDIF 输出时,不使用 FS 信号。相应的 FS I/O 将被释放并留作其他用途。

时隙配置

插槽是音频帧中的基本元素。音频帧中的插槽数等于NBSLOT[3:0]+1。

每个音频帧的最大插槽数固定为16。

对于AC’97协议或SPDIF(当比特PRTCFG[1:0]=11或PRTCFG[1:0]=10时),插槽数量自动设置为针对协议规范,并且NBSLOT[3:0]的值被忽略。

通过设置SAI_xSLOTR寄存器的SLOTEN[15:0]位,可以将每个插槽定义为有效插槽,也可以将其定义为无效插槽。

当传输无效插槽时,在变送器模式下,根据TRIS位配置(参考非活动插槽上的输出数据线管理(第26页)),SD数据线被强制为0或释放为HI-z。在接收器模式下忽略从该插槽末尾接收的值。因此,将没有FIFO访问,因此没有读取请求或写入链接到此非活动插槽状态的FIFO。

插槽大小也可以配置,如FBOFF=0的插槽大小配置所示(第15页)。插槽的大小为通过在SAI_xSLOTR寄存器中设置SLOTSZ[1:0]位来选择。大小对音频中的每个插槽应用相同框架

可以选择时隙内要传输的第一个数据位的位置。此偏移由 SAI_x_gen_cfg1 寄存器中的 FBOFF[4:0] 位配置。在发射器模式下,从时隙开始直到达到此偏移位置,将注入 0 值。在接收时,偏移相位中的位被忽略。此功能针对 LSB 对齐协议(如果偏移等于时隙大小减去数据大小)。

为避免不良的 SAI 行为,必须遵守以下条件:FBOFF <= (SLOTSZ - DS), DS <= SLOTSZ, NBSLOT x SLOTSZ <= FRL (帧长度)

当 SAI_xFRCR 寄存器中的 FSDEF 位置位时,时隙数必须为偶数。在 AC’97 和 SPDIF 协议(PRTCFG[1:0] = 11 或 PRTCFG[1:0] = 10)中,时隙大小自动设置为 AC’97 链路控制器中的定义。

SAI 时钟发生器

每个音频子块都有自己的时钟发生器,这使得这两个块完全独立。这两个时钟发生器在功能上没有区别。

当音频块配置为主设备时,时钟发生器为外部解码器提供位时钟 (SCK_x) 和主时钟 (MCLK_x)。帧同步 (FS_x) 也源自时钟发生器提供的信号。SAI 时钟发生器 (sai_x_ker_ck) 的时钟源由产品时钟控制器 (RCC) 提供。

当音频块定义为从设备时,时钟发生器关闭。NOMCK、MCKDIV 和 OSR 位的值被忽略。此外,MCLK_x I/O 引脚被释放,可用作通用 I/O。

(SCK_x) 的位时钟选通边沿可以通过 SAI_x_gen_cfg0 寄存器中的 CKSTR 位配置。该位在主模式和从模式下均有效。

SAI_x_ck_cfg 寄存器的 NOMCK 位用于定义是否生成主时钟。

当 SAI 在主模式下使用时,时钟发生器配置根据是否需要提供主时钟 (MCLK_x) 而有所不同。

如果 NOMCK 设置为 1,则不生成主时钟,用户在选择帧长度和帧同步频率方面具有更大的灵活性。此外,如果此引脚在 GPIO 外设中配置为 SAI 引脚,则 MCLK_x 信号被驱动为低电平。MCKDIV 仍可用于将 SCK_x 时钟调整到所需频率。

如果 NOMCK 设置为 0,则生成主时钟,并可用作外部解码器的参考时钟。在这种情况下,帧同步和主时钟之间的频率比固定为 512 或 256,并且帧长度必须是 2 的幂。

使用 MCLK 编程时钟发生器 (NOMCK=0)

在这种情况下,MCLK_x 频率将为:

  • Fmclk = 256 * Ffs (OSR=0)

  • Fmclk = 512 * Ffs (OSR=1)

当 MCKDIV 不同于 0 或 1 时,MCLK_x 频率由以下公式给出:

  • Fmclk = Fsai_clk / MCKDIV

帧同步频率由以下公式给出:

  • Ffs = Fsai_clk / (MCKDIV * (OSR+1) * 256)

位时钟 (SCK_x) 的频率由以下表达式给出:

  • Fsck = (Fmclk * (FRL+1)) / ((OSR+1) * 256)

Note

如果 NOMCK = 0,则 (FRL+1) 必须是 2 的幂。此外 (FRL+1) 必须在 8 和 256 之间(参见章节:FS 信号角色)。

当 MCKDIV 分频比为奇数时,MCLK 的占空比将不是 50%。如果 MCKDIV 为奇数,并且 OSR 等于 0,并且 (FRL+1) = 2^8,则位时钟信号 (SCK_x) 的占空比也可能不同于 50%。

建议将 MCKDIV 配置为偶数或较大的值(大于 10)。

Note

MCKDIV = 0 给出与 MCKDIV = 1 相同的结果,MCKDIV = 1 给出与 MCKDIV = 2 相同的结果。 注意:MCKDIV < 4 时,Fsck = (Fsai_clk * (FRL+1)) / ((OSR+1) * 256)

不使用 MCLK 编程时钟发生器 (NOMCK = 1)

当 MCKDIV 不同于 0 或 1 时,SCK_x 频率在以下公式中给出:

  • Fsck = Fsai_clk / MCKDIV

帧同步 (FS_x) 的频率由以下公式给出:

  • Ffs = Fsai_clk / ((FRL+1) * MCKDIV)

Note

当 NOMCK = 1 时,(FRL+1) 可以取 8 到 256 之间的任何值。 注意 MCKDIV = 0 给出与 MCKDIV = 1 相同的结果。 注意:MCKDIV = 0 给出与 MCKDIV = 2 相同的结果。

时钟发生器编程示例

表 6.3: 时钟发生器编程示例

输入 sai_clk 时钟频率

MCLK

Fmclk/Ffs

FRL

OSR

NOMCK

MCKDIV[5:0]

音频采样频率 (Ffs)

98.304 MHz

Y

512

2^N-1

1

0

0 或 1

192 KHz

98.304 MHz

Y

512

2^N-1

1

0

2

192 KHz

98.304 MHz

Y

512

2^N-1

1

0

4

48 KHz

98.304 MHz

Y

256

2^N-1

0

0

2

384 KHz

98.304 MHz

Y

256

2^N-1

0

0

4

96 KHz

98.304 MHz

Y

256

2^N-1

0

0

8

48 KHz

98.304 MHz

N

–

63

–

1

8

192 KHz

98.304 MHz

N

–

63

–

1

16

96 KHz

98.304 MHz

N

–

63

–

1

32

48 KHz

Note

N 是 3 到 8 之间的整数值。

内部 FIFO

SAI 中的每个音频子块都有自己的 FIFO。根据块被定义为发射器还是接收器,FIFO 可以分别被写入或读取。因此,只有一个与 SAI_x_int_status 寄存器中的 FREQ 位相关的 FIFO 请求。

如果 SAI_x_intr_enb 寄存器中的 FREQIE 位被启用,则生成中断。这取决于:

  • FIFO 阈值设置 (SAI_x_fifoctrl 中的 FLVL 位)

  • 通信方向(发射器或接收器)

发射器模式下的中断生成

中断生成取决于发射器模式下的 FIFO 配置:

  • 当 SAI_x_fifoctrl 寄存器中的 FIFO 阈值位配置为 FIFO 空(FTH[2:0] 设置为 0b000)时,如果 SAI_xDR 寄存器中没有可用数据(SAI_xSR 中的 FLVL[2:0] 位小于 001b),则生成中断(FREQ 位由硬件设置为 1)。当 FIFO 不再为空(SAI_xSR 中的 FLVL[2:0] 位不同于 0b000)时,此中断(SAI_x_int_status 寄存器中的 FREQ 位)由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 四分之一满(FTH[2:0] 设置为 001b)时,如果小于或等于四分之一的 FIFO 包含数据(FLVL[2:0] 位小于 0b010),则生成中断(FREQ 位由硬件设置为 1)。当至少四分之一的 FIFO 包含数据(FLVL[2:0] 位大于或等于 0b010)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 半满(FTH[2:0] 设置为 0b010)时,如果小于或等于一半的 FIFO 包含数据(FLVL[2:0] 位小于 011b),则生成中断(FREQ 位由硬件设置为 1)。当至少一半的 FIFO 包含数据(FLVL[2:0] 位大于或等于 011b)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 四分之三(FTH[2:0] 设置为 011b)时,如果小于或等于四分之三的 FIFO 包含数据(FLVL[2:0] 位小于 0b100),则生成中断(FREQ 位由硬件设置为 1)。当至少四分之三的 FIFO 包含数据(SAI_x_int_status 中的 FLVL[2:0] 位大于或等于 0b100)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 满(FTH[2:0] 设置为 0b100)时,如果 FIFO 未满(FLVL[2:0] 位小于 101b),则生成中断(FREQ 位由硬件设置为 1)。当 FIFO 满(FLVL[2:0] 位等于 101b 值)时,此中断由硬件清除

接收模式下的中断生成

中断生成取决于接收模式下的 FIFO 配置:

  • 当 FIFO 阈值位配置为 FIFO 空(FTH[2:0] 设置为 0b000)时,如果 SAI_xDR 寄存器中至少有一个数据可用(SAI_x_int_status 中的 FLVL[2:0] 位大于或等于 001b),则生成中断(FREQ 位由硬件设置为 1)。当 FIFO 变为空(FLVL[2:0] 位等于 0b000)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 四分之一满(FTH[2:0] 设置为 001b)时,如果至少四分之一的 FIFO 数据位置可用(FLVL[2:0] 位大于或等于 0b010),则生成中断(FREQ 位由硬件设置为 1)。当小于或等于四分之一的 FIFO 数据位置变为可用(FLVL[2:0] 位小于 0b010)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 半满(FTH[2:0] 设置为 0b010 值)时,如果至少一半的 FIFO 数据位置可用(FLVL[2:0] 位大于或等于 011b),则生成中断(FREQ 位由硬件设置为 1)。当小于或等于一半的 FIFO 数据位置变为可用(FLVL[2:0] 位小于 011b)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 四分之三满(FTH[2:0] 设置为 011b 值)时,如果至少四分之三的 FIFO 数据位置可用(FLVL[2:0] 位大于或等于 0b100),则生成中断(FREQ 位由硬件设置为 1)。当 FIFO 具有小于或等于四分之三的 FIFO 数据位置可用(FLVL[2:0] 位小于 0b100)时,此中断由硬件清除

  • 当 FIFO 阈值位配置为 FIFO 满(FTH[2:0] 设置为 0b100)时,如果 FIFO 满(FLVL[2:0] 位等于 101b),则生成中断(FREQ 位由硬件设置为 1)。当 FIFO 未满(FLVL[2:0] 位小于 101b)时,此中断由硬件清除

与中断生成类似,如果 SAI_x_fifoctrl 寄存器中的 DMAEN 位置位,SAI 可以使用 DMA。FREQ 位断言机制与上述 FREQIE 的中断生成机制相同。

每个 FIFO 是一个 16 字的 FIFO。每次从 FIFO 读取或写入操作都针对一个 FIFO 字,无论访问大小如何。每个 FIFO 字包含一个音频时隙。每次访问 SAI_xDR 寄存器后,FIFO 指针增加一个字。

数据写入 SAI_xDR 时应右对齐。

接收到的数据将在 SAI_xDR 中右对齐。

当 SAI 被禁用时,可以通过设置 SAI_x_fifoctrl 寄存器中的 FFLUSH 位来重新初始化 FIFO 指针。如果在 SAI 启用时设置 FFLUSH,则 FIFO 中存在的数据将自动丢失。

PDM 接口

提供 PDM(脉冲密度调制)接口是为了支持数字麦克风。最多可以并行连接 4 个数字麦克风对。PDM 典型连接和时序显示了通过 PDM 接口连接数字麦克风对的典型方式。两个麦克风共享相同的比特流时钟和数据线。通过配置引脚(LR),一个麦克风可以在 SAI_CK[m] 上升沿提供有效数据,而另一个在 SAI_CK[m] 下降沿提供有效数据(m 是时钟线数量)。

Note

PDM 接口不包含从比特流构建 PCM 音频样本所需的抽取滤波器。由应用软件执行此操作。

为了减少内存占用,用户可以选择应用程序所需的麦克风数量。这可以通过 portu[3:0] 位完成。可以选择 2、4、6 或 8 个麦克风。例如,如果应用程序使用 3 个麦克风,用户必须选择 4。

SAI_ADR 数据格式

来自麦克风的数据在 SAI_ADR 寄存器中的排列取决于以下参数:

  • 麦克风数量

  • 选择的时隙宽度

  • LSBFIRST 位

时隙宽度定义了 SAI_ADR 中每个字中有效位的数量。

当选择 32 位时隙宽度时,SAI_ADR 中的每个数据将包含 32 个有用位。这减少了存储在内存中的字数。然而,缺点是软件必须执行一些操作来解交织每个麦克风的数据。

当选择 16 位时隙宽度时,SAI_ADR 中的每个数据将包含 16 个有用位。这减少了存储在内存中的字数。然而,缺点是软件必须执行一些操作来解交织每个麦克风的数据。

不支持时隙宽度设置为 8 位。

SAI_ADR 数据格式示例

32 位时隙宽度 (DS = 0b111 且 SLOTSZ = 0)

对于 8 麦克风配置,从 SAI_ADR 寄存器读取的两个连续字包含来自每个麦克风的一个数据字节。对于 4 麦克风配置,从 SAI_ADR 寄存器读取的每个字包含来自每个麦克风的一个数据字节。

16 位时隙宽度 (DS = 0b100 且 SLOTSZ = 0)

对于 8 麦克风配置,从 SAI_ADR 寄存器读取的四个连续字包含来自每个麦克风的一个数据字节。注意 SAI_ADR 的 16 位数据是右对齐的。

对于 4 或 2 麦克风配置,SAI 行为类似于 8 麦克风配置。最多需要 2 个 16 位字来从 4 个麦克风获取一个字节,对于 2 个麦克风只需要一个字。

调整延迟线

当启用 PDM 接口时,应用程序可以通过 SAI_PDMDLY 寄存器动态调整每个麦克风输入的延迟单元。

新的延迟值将在两个 TDM 帧后生效。

AC’97 链路控制器

SAI 能够作为 AC’97 链路控制器工作。在此协议中:

  • 时隙数和时隙大小是固定的

  • 帧同步信号是精确定义的,具有固定形状

要选择此协议,将 SAI_x_audioctrl 寄存器中的 PRTCFG[1:0] 位设置为 11。当选择 AC’97 模式时,只能使用 20 位的数据大小,否则 SAI 行为不能保证。

  • 时隙数固定为 13 个。第一个是 16 位宽,所有其他都是 20 位宽(数据时隙)

  • SAI_xSLOTR 寄存器中的 FBOFF[4:0] 位被忽略

  • 不使用 MCLK

定义为异步的块的 FS 信号自动配置为输出,因为 AC’97 控制器链路驱动 FS 信号,无论主或从配置如何。

Note

在 AC’97 协议中,标签的第 2 位是保留的(始终为 0),因此无论写入 SAI FIFO 的值如何,标签的第 2 位都被强制为 0 电平。

有关标签表示的更多详细信息,请参阅 AC’97 协议标准。一个 SAI 可用于目标 AC’97 点对点通信。

使用两个 SAI(对于具有两个嵌入式 SAI 的设备)允许控制三个外部 AC’97 解码器,如具有至少 2 个嵌入式 SAI 的设备上的典型 AC’97 配置示例所示。在 SAI1 中,音频块 A 必须声明为异步主发射器,而音频块 B 定义为从接收器并在内部与音频块 A 同步。

SAI2 配置为音频块 A 和 B 都与外部 SAI1 同步,处于从接收器模式。

在接收器模式下,作为 AC’97 链路控制器工作的 SAI 需要 FIFO 请求,因此当插槽 0 中的编解码器就绪位被解码为低电平时,数据存储在 FIFO 中。如果 SAI_xIM 寄存器中的 CNRDYIE 位被启用,标志 CNRDY 将在 SAI_xSR 寄存器中设置,并生成中断。此标志专用于 AC’97 协议。

AC’97 模式下的时钟发生器编程

在 AC’97 模式下,帧长度固定为 256 位,其频率应设置为 48 kHz。应使用 SAI 时钟发生器 中给出的公式,其中 FRL = 255,以生成适当的帧速率 (FFS_x)。

SPDIF 输出

SPDIF 接口仅在发射器模式下可用。它支持音频 IEC60958。要选择 SPDIF 模式,将 SAI_x_audioctrl 寄存器中的 PRTCFG[1:0] 位设置为 10。

对于 SPDIF 协议:

  • 仅启用 SD 数据线

  • FS、SCK、MCLK I/O 引脚被释放

  • MODE[1] 位被强制为 0 以选择主模式,以便启用 SAI 的时钟发生器并管理 SD 线上的数据速率

  • 数据大小强制为 24 位。SAI_xCR1 寄存器中 DS[2:0] 位设置的值被忽略

  • 必须配置时钟发生器以定义符号率,知道位时钟应该是符号率的两倍。数据以曼彻斯特协议编码

  • SAI_xFRCR 和 SAI_xSLOTR 寄存器被忽略。SAI 在内部配置以满足 SPDIF 协议要求,如 SPDIF 格式所示

SPDIF 块包含 192 帧。每帧由两个 32 位子帧组成,通常一个用于左通道,一个用于右通道。每个子帧由一个 SOPD 模式(4 位)组成,以指定子帧是块的开始(因此标识通道 A),还是标识块中某处的通道 A,或者是指通道 B(参见 SOPD 模式)。接下来的 28 位通道信息由 24 位数据 + 4 个状态位组成。

存储在 SAI_xDR 中的数据必须按如下方式填充:

  • SAI_xDR[26:24] 包含通道状态、用户和有效性位

  • SAI_xDR[23:0] 包含所考虑通道的 24 位数据

如果数据大小为 20 位,则数据应映射到 SAI_xDR[23:4]。

如果数据大小为 16 位,则数据应映射到 SAI_xDR[23:8]。

SAI_xDR[23] 始终代表 MSB

Note

传输始终以 LSB 优先进行。

SAI 首先为块中的每个子帧发送适当的前导码。然后 SAI_xDR 在 SD 线上发送(曼彻斯特编码)。SAI 通过传输奇偶校验位结束子帧,如奇偶校验位计算中所述。

表 6.4: SOPD 模式

SOPD

前导码编码 (最后一位是 0)

前导码编码 (最后一位是 1)

描述

SOPD 代码

B

11101000

00010111

块开始时的通道 A 数据

2’b00

W

11100100

00011011

块中某处的通道 B 数据

2’b01

M

11100010

00011101

通道 A 数据

2’b10

表 6.5: 奇偶校验位计算

SAI_xDR[26:0] 中 1 的数量

传输的奇偶校验位 P 值

奇数

0

偶数

1

下溢是 SAI_x_int_status 寄存器中 SPDIF 模式可用的唯一错误标志,因为 SAI 只能在发射器模式下工作。因此,应执行以下序列以从通过下溢中断或下溢状态位检测到的下溢错误中恢复:

  1. 禁用 DMA 流(通过 DMA 外设),如果使用 DMA

  2. 禁用 SAI 并通过轮询 SAI_xCR1 寄存器中的 SAIEN 位检查外设是否物理禁用

  3. 清除 SAI_x_int_clr 寄存器中的 COVRUDR 标志

  4. 通过设置 SAI_x_fifo_ctrl 中的 FFLUSH 位刷新 FIFO。软件需要指向对应于新块开始(前导码 B 的数据)的未来数据的地址。如果使用 DMA,应相应更新 DMA 源基地址指针

  5. 再次启用 DMA 流(DMA 外设),如果使用 DMA 来管理根据新源基地址的数据传输

  6. 通过设置 SAI_x_audioctrl 寄存器中的 SAIEN 位再次启用 SAI

SPDIF 发生器模式下的时钟发生器编程

对于 SPDIF 发生器,SAI 应提供比符号率快一倍的位时钟。下表显示了关于音频采样率的符号率的通常示例。

更一般地,音频采样频率 (F_sample) 和位时钟速率 (F_sck) 之间的关系由以下公式给出:F_sample = F_sck / 128

位时钟速率获得如下:F_sck = F_sai_clk / MCKDIV

Note

仅当 SAI_ACR1 寄存器中的 NOMCK 设置为 1 时,上述公式才有效。

特定功能

SAI 接口嵌入了特定功能,这些功能可能有用,具体取决于所选的音频协议。这些功能可通过 SAI_x_audioctrl 寄存器的特定位访问。

静音模式

当音频子块是发射器或接收器时,可以使用静音模式

发射器模式下的音频子块

在发射器模式下,可以随时选择静音模式。静音模式对整个音频帧有效。当在正在进行的帧期间设置 SAI_x_audioctrl 寄存器中的 MUTE 位时,启用静音模式。

静音模式位仅在帧结束时选通。如果此时设置,则静音模式在新音频帧开始时激活,并持续整个帧,直到下一个帧结束。然后选通该位以确定下一帧是否仍然是静音帧。

如果通过 SAI_xSLOTR 寄存器中的 NBSLOT[3:0] 位设置的时隙数小于或等于 2,则可以指定在静音模式下发送的值是 0 还是每个时隙的最后一个值。选择通过 SAI_xCR2 寄存器中的 MUTEVAL 位完成。

如果 SAI_xSLOTR 寄存器中 NBSLOT[3:0] 位设置的时隙数大于 2,则 SAI_xCR2 中的 MUTEVAL 位无意义,因为每个时隙的每个位上都发送 0 值。

在静音模式下,FIFO 指针仍然递增。这意味着 FIFO 中存在且请求静音模式的数据被丢弃。

接收器模式下的音频子块

在接收器模式下,当音频帧的所有声明和有效时隙在给定连续音频帧数(SAI_x_gen_cfg0 寄存器中的 MUTECNT[5:0] 位)内接收到 0 时,可以检测到从外部发射器发送的静音模式。当检测到 MUTE 帧数时,设置 SAI_xSR 寄存器中的 MUTEDET 标志,并且如果 SAI_x_int_enb 中设置了 MUTEDETIE 位,则可以生成中断。

当音频子块被禁用或当有效时隙在音频帧中接收到至少一个数据时,静音帧计数器被清除。当计数器达到 MUTECNT[5:0] 位中指定的值时,中断仅生成一次。当计数器清除时,中断事件然后重新初始化。

Note

静音模式不适用于 SPDIF 音频块。

单声道/立体声模式

在发射器模式下,可以寻址单声道模式,无需在内存中进行任何数据预处理,假设时隙数等于 2(SAI_xSLOTR 中的 NBSLOT[3:0] = 0001)。在这种情况下,立体声音频流将转换为单声道音频,因为时隙 0 的数据覆盖时隙 1 的数据。要启用单声道模式,

  1. 将 SAI_x_audioctrl 寄存器中的 MONO 位设置为 1

  2. 在 SAI_x_gen_cfg1 中设置 NBSLOT 为 1 且 SLOTEN 为 3

在发射器模式下,可以寻址复制单声道模式,无需在内存中进行任何数据预处理,假设时隙数等于 2(SAI_xSLOTR 中的 NBSLOT[3:0] = 0001)。在这种情况下,对 FIFO 的访问时间将减少 2 倍,因为时隙 0 的数据被复制到时隙 1 的数据中。

要启用复制单声道模式,

  1. 将 SAI_x_audioctrl 寄存器中的 COPY_MONO 位设置为 1

  2. 在 SAI_x_gen_cfg1 中设置 NBSLOT 为 1 且 SLOTEN 为 3

在接收器模式下,可以设置 MONO 位,并且仅当时隙数等于 2 时(如发射器模式)才有意义。当设置时,只有时隙 0 数据将存储在 FIFO 中。属于时隙 1 的数据将被丢弃,因为在这种情况下,它应该与前一个时隙相同。如果接收器模式下的数据流是具有明显不同左右数据的真实立体声音频流,则 MONO 位无意义。从输出立体声文件到等效单声道文件的转换由软件完成。

非活动时隙上的输出数据线管理

在发射器模式下,当在数据线上发送非活动时隙时,可以选择 SD 线输出的行为(通过 TRIS 位)。

  • 要么 SAI 在发送非活动时隙时强制 SD 输出线为 0,要么

  • 在线路在传输的最后一位数据结束时释放为高阻态,以释放线路用于连接到此节点的其他发射器

重要的是要注意,两个发射器不能同时尝试驱动相同的 SD 输出引脚,这可能导致短路。为了确保传输之间的间隙,如果数据低于 32 位,可以通过设置 SAI_xSLOTR 寄存器中的位 SLOTSZ[1:0] = 10 将数据扩展到 32 位。然后,如果以下时隙声明为非活动,SD 输出引脚将在活动时隙的 LSB 结束时(在填充 0 阶段以将数据扩展到 32 位期间)变为三态。

此外,如果时隙数乘以时隙大小小于帧长度,则在完成音频帧的填充 0 完成时,SD 输出线将变为三态。

当所选的音频协议使用 FS 信号作为帧开始和通道侧标识(SAI_x_gen_cfg0 寄存器中的位 FSDEF = 1)时,三态模式根据图 662 管理(其中 SAI_xCR1 寄存器中的位 TRIS = 1,且 FSDEF=1,且半帧长度高于时隙数/2,且 NBSLOT=6)。

错误标志

SAI 实现以下错误标志:

  • FIFO 溢出/下溢

  • 提前的帧同步检测

  • 延迟的帧同步检测

  • 编解码器未就绪(仅 AC’97)

  • 主模式下的错误时钟配置

FIFO 溢出/下溢 (OVRUDR)

FIFO 溢出/下溢位在 SAI_x_int_status 寄存器中称为 OVRUDR。

溢出或下溢错误共享相同的位,因为音频块可以是接收器或发射器,并且给定 SAI 中的每个音频块都有自己的 SAI_x_int_status 寄存器。

溢出

当音频块配置为接收器时,如果当 FIFO 已满且无法存储接收到的数据时在音频帧中接收到数据,则可能出现溢出条件。在这种情况下,接收到的数据丢失,设置 SAI_xSR 寄存器中的 OVRUDR 标志,并且如果 SAI_xIM 寄存器中设置了 OVRUDRIE 位,则生成中断。发生溢出的时隙号内部存储。直到 FIFO 有空闲存储新数据之前,不会将更多数据存储到 FIFO 中。当 FIFO 至少有一个数据空闲时,SAI 音频块接收器将存储新数据(来自新音频帧),从检测到溢出条件时内部存储的时隙号开始。这避免了目标内存中的数据时隙错位。

通过设置 SAI_x_int_clr 寄存器中的 COVRUDR 位清除 OVRUDR 标志。

下溢

当 SAI 中的音频块是发射器且当需要传输数据时 FIFO 为空时,可能发生下溢。如果检测到下溢,则存储事件发生的时隙号,并发送 MUTE 值(00),直到 FIFO 准备好传输与检测到下溢的时隙对应的数据。这避免了内存指针和音频帧中的时隙之间的失步。

下溢事件设置 SAI_xSR 寄存器中的 OVRUDR 标志,并且如果 SAI_x_int_enb 寄存器中设置了 OVRUDRIE 位,则生成中断。要清除此标志,设置 SAI_x_int_clr 寄存器中的 COVRUDR 位。

下溢事件可以在音频子块配置为主或从时发生。

提前的帧同步检测 (AFSDET)

AFSDET 标志仅在从模式下使用。它在主模式下从不断言。它指示帧同步 (FS) 被检测到早于预期,因为帧长度、帧极性、帧偏移是定义和已知的。

提前的帧检测设置 SAI_x_int_status 寄存器中的 AFSDET 标志。

此检测对当前音频帧没有影响,当前音频帧对提前的 FS 不敏感。这意味着信号 FS 上的”寄生”事件被标记,而不会对当前音频帧造成任何干扰。

如果 SAI_xIM 寄存器中设置了 AFSDETIE 位,则生成中断。要清除 AFSDET 标志,必须在 SAI_xCLRFR 寄存器中设置 CAFSDET 位。

要在提前的帧检测错误后与主设备重新同步,需要四个步骤:

  1. 通过重置 SAI_xCR1 寄存器中的 SAIEN 位禁用 SAI 块。为确保 SAI 被禁用,回读 SAIEN 位并检查它是否设置为 0

  2. 通过 SAI_xCR2 寄存器中的 FFLUS 位刷新 FIFO

  3. 再次启用 SAI 外设(SAIEN 位设置为 1)

  4. SAI 块将等待 FS 上的断言以重新启动与主设备的同步

Note

在 AC’97 模式下不断言 AFSDET 标志,因为 SAI 音频块充当链路控制器并生成 FS 信号,即使声明为从设备。它在 SPDIF 模式下无意义,因为 FS 信号不被使用。

延迟的帧同步检测 (LFSDET)

SAI_x_int_status 寄存器中的 LFSDET 标志仅在 SAI 音频块作为从设备操作时设置。帧长度、帧极性和帧偏移配置在寄存器 SAI_x_gen_cfg0 中已知。

如果外部主设备不在预期时间发送 FS 信号,因此生成信号太晚,则设置 LFSDET 标志,并且如果 SAI_x_int_enb 寄存器中设置了 LFSDETIE 位,则生成中断。

当在 SAI_x_int_clr 寄存器中设置 CLFSDET 位时,清除 LFSDET 标志。

当检测到相应的错误时,设置延迟的帧同步检测标志。SAI 需要与主设备重新同步(参见提前的帧同步检测 (AFSDET) 中描述的序列)。

在嘈杂的环境中,SCK 时钟上的毛刺可能被音频块状态机错误地检测到,并将 SAI 数据移动到错误的帧位置。此事件可以由 SAI 检测并报告为延迟的帧同步检测错误。

如果外部主设备不以连续模式管理音频数据帧传输,则没有损坏,这在大多数应用中不应该是这种情况。在这种情况下,将设置 LFSDET 标志。

Note

在 AC’97 模式下不断言 LFSDET 标志,因为 SAI 音频块充当链路控制器并生成 FS 信号,即使声明为从设备。它在 SPDIF 模式下无意义,因为协议不使用 FS 信号。

编解码器未就绪 (CNRDY AC’97)

SAI_xSR 寄存器中的 CNRDY 标志仅当 SAI 音频块配置为在 AC’97 模式下操作时相关。如果 SAI_x_int_enb 寄存器中设置了 CNRDYIE 位,则当 CNRDY 标志设置时生成中断。

当编解码器在 AC’97 音频帧的 TAG 0(时隙0)接收期间未准备好通信时,断言 CNRDY。在这种情况下,尽管编解码器未准备好,数据将自动存储到 FIFO 中。

要清除 CNRDY 标志,必须在 SAI_xCLRFR 寄存器中设置 CCNRDY 位。

主模式下的错误时钟配置 (NOMCK=0)

当音频块作为主设备操作(MODE[1] = 0)且 NOMCK 位等于 0 时,如果满足以下条件,则在启用 SAI 时立即设置 WCKCFG 标志:

  • (FRL+1) 不是 2 的幂,且

  • (FRL+1) 不在 8 和 256 之间

MODE 和 SAIEN 位属于 SAI_x_audioctrl 寄存器,NOMCK 属于 SAI_x_ckcfg,FRL 属于 SAI_x_gen_cfg0 寄存器。如果设置了 WCKCFGIE 位,则当 SAI_x_int_status 寄存器中设置 WCKCFG 标志时生成中断。要清除此标志,设置 SAI_xCLRFR 寄存器中的 CWCKCFG 位。

当设置 WCKCFG 位时,音频块自动禁用,从而执行 SAIEN 位的硬件清除。

禁用 SAI

可以通过清除 SAI_x_audio_ctrl 寄存器中的 SAIEN 位随时禁用 SAI 音频块。所有已开始的帧自动完成,然后 SAI 停止工作。SAIEN 位保持高电平,直到在当前音频帧传输结束时 SAI 完全关闭。

如果 SAI 中的一个音频块与另一个同步运行,则必须首先禁用作为主设备的那个。

SAI DMA 接口

为了释放 CPU 并优化总线带宽,每个 SAI 音频块有一个独立的 DMA 接口来从/向 SAI_xDR 寄存器读取/写入(以访问内部 FIFO)。每个音频子块有一个 DMA 通道,支持基本的 DMA 请求/应答协议。

要配置音频子块进行 DMA 传输,设置 SAI_xCR1 寄存器中的 DMAEN 位。DMA 请求由 FIFO 控制器直接管理,取决于 FIFO 阈值水平。DMA 传输方向与 SAI 音频子块配置相关联:

  • 如果音频块作为发射器操作,则音频块 FIFO 控制器输出 DMA 请求以将数据写入 SAI_xDR 寄存器加载 FIFO

  • 如果音频块作为接收器操作,则 DMA 请求与从 SAI_xDR 寄存器读取操作相关

按照以下序列配置 DMA 模式下的 SAI 接口:

  1. 配置 SAI 和 FIFO 阈值水平以指定何时启动 DMA 请求

  2. 配置 SAI DMA 通道

  3. 启用 DMA

  4. 启用 SAI 接口

Note

在配置 SAI 块之前,必须禁用 SAI DMA 通道。

中断

SAI 支持 7 个中断源,如 SAI 中断源所示。

表 7.1: SAI 中断源

中断源

中断组

音频块模式

中断使能

中断清除

FREQ

FREQ

主或从接收器或发射器

SAI_x_int_enb 寄存器中的 FREQIE

取决于: - FIFO 阈值设置 (SAI_xCR2 中的 FLVL 位) - 通信方向 (发射器或接收器) - 详见“内部 FIFO”

OVRUDRERROR

OVRUDRERROR

主或从接收器或发射器

SAI_x_int_enb 寄存器中的 OVRUDRIE

SAI_x_int_clr 寄存器中的 COVRUDR = 1

AFSDET

ERROR

从(不在 AC’97 模式和 SPDIF 模式下使用)

SAI_x_int_enb 寄存器中的 AFSDETIE

SAI_x_int_clr 寄存器中的 CAFSDET = 1

LFSDET

ERROR

从(不在 AC’97 模式和 SPDIF 模式下使用)

SAI_x_int_enb 寄存器中的 LFSDETIE

SAI_x_int_clr 寄存器中的 CLFSDET = 1

CNRDY

ERROR

从(仅在 AC’97 模式下)

SAI_x_int_enb 寄存器中的 CNRDYIE

SAI_x_int_clr 寄存器中的 CCNRDY = 1

MUTEDET

ERROR

主或从仅接收器模式

SAI_x_int_enb 寄存器中的 MUTEDETIE

SAI_x_int_clr 寄存器中的 CMUTEDET = 1

WCKCFG

ERROR

主模式且 NOMCK=0

SAI_x_int_enb 寄存器中的 WCKCFGIE

SAI_x_int_clr 寄存器中的 CWCKCFG = 1

按照以下序列启用中断:

  1. 禁用 SAI 中断

  2. 配置 SAI

  3. 配置 SAI 中断源

  4. 启用 SAI

寄存器

SAI_RF 寄存器

SAI_RF 中的寄存器及其相应偏移如 SAI_RF 中寄存器的偏移地址所示。

表 8.1: SAI_RF 中寄存器的偏移地址

偏移

寄存器名称

功能描述

0x0

gen_cfg0

生成配置 0

0x4

gen_cfg1

生成配置 1

0x8

pdmcfg

PDM 协议配置

0xC

audioctrl

音频控制

0x10

fifoctrl

FIFO 控制

0x14

fifo_rdat

FIFO 寄存器数据

0x18

int_status

中断状态

0x1C

intr_enb

中断使能

0x20

int_clr

中断清除

0x24

ckcfg

时钟配置

0x28

msk

掩码寄存器

0x2C

ip_ver

IP 版本

0x30

git_ver

GIT 版本

0x34

vpp_cfg

VPP 配置

GEN_CFG0

地址偏移:0x0

表 8.2: gen_cfg0 的格式

字段

位

访问

复位值

描述

LSBFIRST

0

R/W

0

传输时 MSB 或 LSB 优先

  • 1’b0: 数据以 MSB 优先传输

  • 1’b1: 数据以 LSB 优先传输

CKSTR

1

R/W

0

时钟选通边沿

  • 1’b0: SAI 生成的信号在 SCK 上升沿变化,而 SAI 接收的信号在 SCK 下降沿采样

  • 1’b1: SAI 生成的信号在 SCK 下降沿变化,而 SAI 接收的信号在 SCK 上升沿采样

MUTECNT

7:2

R/W

0

静音帧数

设置在这些位中的值与接收中检测到的连续静音帧数进行比较。 当静音帧数等于此值时,将设置标志 MUTEDET,并且如果设置了位 MUTEDETIE 将生成中断

MUTEVAL

8

R/W

0

静音值

  • 1’b0: 在静音模式下发送位值 0

  • 1’b1: 在静音模式下发送最后一个值

MUTE

9

R/W

0

静音模式使能

  • 1’b0: 无静音模式

  • 1’b1: 静音模式使能

TRIS

10

R/W

0

数据线上的三态管理

  • 1’b0: 当时隙非活动时,SD 输出线仍由 SAI 驱动

  • 1’b1: 在最后一个活动时隙的最后一位数据结束时,SD 输出线被释放(高阻态)

FSOFF

11

R/W

0

帧同步偏移

  • 1’b0: FS 在时隙 0 的第一位时断言

  • 1’b1: FS 在时隙 0 的第一位之前一位时断言

FSPOL

12

R/W

0

帧同步极性

  • 1’b0: FS 低电平有效(下降沿)

  • 1’b1: FS 高电平有效(上升沿)

FSDEF

13

R/W

0

帧同步定义

  • 1’b0: FS 信号是起始帧信号

  • 1’b1: FS 信号是起始帧信号 + 通道侧标识

FSALL

21:14

R/W

0

帧同步有效电平长度

它们指定音频帧中 FS 信号有效电平的长度,以位时钟 (SCK) 数 + 1 (FSALL[7:0] + 1)

FRL

29:22

R/W

0

帧长度,音频帧中的位数

保留

31:30

/

0x0

/

GEN_CFG1

地址偏移:0x4

表 8.3: gen_cfg1 的格式

字段

位

访问

复位值

描述

SLOTEN

15:0

R/W

0

时隙使能

每个 SLOTEN 位对应一个时隙位置,从 0 到 15(最多 16 个时隙) 0: 非活动时隙。1: 活动时隙。它们在 AC97 或 SPDIF 模式下被忽略

SLOTSZ

17:16

R/W

0

时隙大小

时隙大小等同于数据大小(在 DS[3:0] 中指定)

  • 2’b00: 8 位

  • 2’b01: 16 位

  • 2’b10: 32 位

  • 2’b11: 保留 它们在 AC’97 或 SPDIF 模式下被忽略

NBSLOT

21:18

R/W

0

音频帧中的时隙数

FBOFF

26:22

R/W

0

第一位偏移

设置在此位字段中的值定义时隙中第一个数据传输位的位置 它们在 AC’97 或 SPDIF 模式下被忽略

DS

29:27

R/W

0

帧数据大小

  • 3’b010: 8 位

  • 3’b011: 10 位

  • 3’b100: 16 位

  • 3’b101: 20 位

  • 3’b110: 24 位

  • 3’b111: 32 位

FRL_GT

30

R/W

0

帧长度关系

  • 1’b0: 帧长度小于等于 (slotsz * nbslot)

  • 1’b1: 帧长度大于 slotsz * nbslot

注意: (frl+1) - slotsz * nbslot < slotsz

保留

31

/

0x0

/

PDMCFG

地址偏移:0x8

表 8.4: pdmcfg 的格式

字段

位

访问

复位值

描述

DLYM4

2:0

R/W

0

第 4 对麦克风的延迟线

  • 3’b000: 无延迟

  • 3’b001: 延迟 1 个 TSAI_CK 周期

  • 3’b010: 延迟 2 个 TSAI_CK 周期

  • 3’b011: 延迟 3 个 TSAI_CK 周期

  • 3’b100: 延迟 4 个 TSAI_CK 周期

  • 3’b101: 延迟 5 个 TSAI_CK 周期

  • 3’b110: 延迟 6 个 TSAI_CK 周期

  • 3’b111: 延迟 7 个 TSAI_CK 周期

DLYM3

5:3

R/W

0

第 3 对麦克风的延迟线

DLYM2

8:6

R/W

0

第 2 对麦克风的延迟线

DLYM1

11:9

R/W

0

第 1 对麦克风的延迟线

保留

31:12

/

0x0

/

AUDIOCTRL

地址偏移:0xC

表 8.5: audioctrl 的格式

字段

位

访问

复位值

描述

SAIEN

0

R/W

0

音频块使能

  • 1’b0: SAI 音频块禁用

  • 1’b1: SAI 音频块使能

MONO

1

R/W

0

单声道模式

仅当时隙数等于 2 时才有意义。 当选择单声道模式时,发射器模式下时隙 0 数据覆盖时隙 1; 在接收器模式下,时隙 1 被丢弃,仅存储时隙 0 数据。

  • 1’b0: 立体声模式

  • 1’b1: 单声道模式

SYNCEN

3:2

R/W

0

同步使能

  • 2’b00: 音频子块在异步模式下

  • 2’b01: 音频子块与另一个内部音频子块同步(需从模式)

  • 2’b10: 音频子块与外部嵌入式 SAI 外设同步(需从模式)

  • 2’b11: 保留

SYNCIN

5:4

R/W

0

同步输入选择

  • 2’b00: 同步来自音频块 A

  • 2’b01: 同步来自音频块 B

  • 2’b10: 同步来自另一个 SAI

  • 2’b11: 保留

当两个音频子块(A 和 B)都禁用时,必须设置这些位; 若任一块定义为与外部 SAI 同步,则这些位有意义。

SYNCOUT

6

R/W

0

同步输出选择

  • 1’b0: 音频块 A 提供同步信号

  • 1’b1: 音频块 B 提供同步信号

此子块用于其他 SAI 的进一步同步。

MODE

8:7

R/W

0

SAIx 音频块模式

  • 2’b00: 主发射器

  • 2’b01: 主接收器

  • 2’b10: 从发射器

  • 2’b11: 从接收器

PRTCFG

10:9

R/W

0

协议配置

  • 2’b00: 自由协议 (I2S/PCM/TDM)

  • 2’b01: PDM

  • 2’b10: SPDIF 协议

  • 2’b11: AC’97 协议

REST_OF_FRL

16:11

R/W

0

FRL 的其余部分 = (FRL+1) - NBSLOT * SLOTSZ

PORTN

20:17

R/W

0

选择要使用的 io_intf 的数据端口

要使用的 io_intf 的 SD 数量:

  • 4’b0001: 使用 SD[0]

  • 4’b0010: 使用 SD[1]

  • 4’b0100: 使用 SD[2]

  • 4’b1000: 使用 SD[3]

  • 4’b1111: 使用所有 SD

bit0: 0 = SD[0] 禁用, 1 = SD[0] 使能 bit1: 0 = SD[1] 禁用, 1 = SD[1] 使能 bit2: 0 = SD[2] 禁用, 1 = SD[2] 使能 bit3: 0 = SD[3] 禁用, 1 = SD[3] 使能

CKPOL

21

R/W

0

时钟极性选择以输出 FS 用于 clk_gen

  • 1’b0: 上升沿输出 FS

  • 1’b1: 下降沿输出 FS

COPY_MONO

22

R/W

0

复制单声道模式

仅当时隙数等于 2 时才有意义。 当选择复制单声道模式时,发射器模式下时隙 0 数据在时隙 1 上重复。

  • 1’b0: 立体声模式

  • 1’b1: 单声道模式

保留

31:23

/

0x0

/

FIFOCTRL

地址偏移:0x10

表 8.6: fifoctrl 的格式

字段

位

访问

复位值

描述

FFLUSH

0

R/W

0

FIFO 刷新

  • 1’b0: 无 FIFO 刷新

  • 1’b1: FIFO 刷新

编程此位为 1 触发 FIFO 刷新;此位将由硬件清除; 当此位为 1 时软件不能写入 0 到此位。

DMAEN

1

R/W

0

DMA 使能

  • 1’b0: 禁用 DMA 接口

  • 1’b1: 启用 DMA 接口

FTH

4:2

R/W

0

FIFO 阈值

此位由软件设置和清除:

  • 3’b000: FIFO 空

  • 3’b001: 1/4 FIFO

  • 3’b010: 1/2 FIFO

  • 3’b011: 3/4 FIFO

  • 3’b100: FIFO 满

  • 101,110,111: 保留

保留

31:5

/

0x0

/

FIFO_RDAT

地址偏移:0x14

表 8.7: fifo_rdat 的格式

字段

位

访问

复位值

描述

DATA

31:0

R/W

0

写入或读取此寄存器以加载或清空 FIFO

  • 写入此寄存器加载 FIFO(前提是 FIFO 未满)

  • 读取此寄存器清空 FIFO(当 FIFO 不为空)

INT_STATUS

地址偏移:0x18

表 8.8: int_status 的格式

字段

位

访问

复位值

描述

OVRUDR

1:0

RO

0

溢出 / 下溢

  • 2’b00: 无溢出/下溢错误

  • 2’b01: 溢出错误

  • 2’b10: 下溢错误

  • 2’b11: 保留

MUTEDET

2

RO

0

静音检测中断(使能掩码后)

  • 1’b0: 在 SD 输入线上未检测到 MUTE

  • 1’b1: 在 SD 输入线上检测到 MUTE 值(0 值)用于指定数量的连续音频帧

WCKCFG

3

RO

0

错误时钟配置标志

  • 1’b0: 时钟配置正确

  • 1’b1: 时钟配置不遵守关于帧长度的规则

CNRDY

4

RO

0

编解码器未就绪中断(使能掩码后)(AC’97)

  • 1’b0: 外部 AC’97 编解码器就绪

  • 1’b1: 外部 AC’97 编解码器未就绪

AFSDET

5

RO

0

提前的帧同步检测中断(使能掩码后)

  • 1’b0: 无错误

  • 1’b1: 帧同步信号被检测到早于预期

LFSDET

6

RO

0

延迟的帧同步检测

  • 1’b0: 无错误

  • 1’b1: 帧同步信号在正确时间不存在

FREQ

7

RO

0

FIFO 请求中断(使能掩码后)

  • 1’b0: 无 FIFO 请求

  • 1’b1: FIFO 请求读取或写入 SAI_xDR

FLVL

10:8

RO

0

FIFO 水平阈值

如果 SAI 块配置为发射器:

  • 3’b000: FIFO 空

  • 3’b001: FIFO <= 1/4 但不空

  • 3’b010: 1/4 < FIFO <= 1/2

  • 3’b011: 1/2 < FIFO <= 3/4

  • 3’b100: 3/4 < FIFO 但不满

  • 3’b101: FIFO 满

如果 SAI 块配置为接收器:

  • 3’b000: FIFO 空

  • 3’b001: FIFO < 1/4 但不空

  • 3’b010: 1/4 <= FIFO < 1/2

  • 3’b011: 1/2 <= FIFO < 3/4

  • 3’b100: 3/4 <= FIFO 但不满

  • 3’b101: FIFO 满

保留

31:11

/

0x0

/

INTR_ENB

地址偏移:0x1C

表 8.9: intr_enb 的格式

字段

位

访问

复位值

描述

OVRUDRIE

0

R/W

0

溢出/下溢中断使能

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

MUTEDETIE

1

R/W

0

静音检测中断使能

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

WCKCFGIE

2

R/W

0

错误时钟配置中断使能

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

CNRDYIE

3

R/W

0

编解码器未就绪中断使能 (AC’97)

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

AFSDETIE

4

R/W

0

提前的帧同步检测中断使能

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

LFSDETIE

5

R/W

0

延迟的帧同步检测中断使能

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

FREQIE

6

R/W

0

FIFO 请求中断使能

  • 1’b0: 中断禁用

  • 1’b1: 中断使能

保留

31:7

/

0x0

/

INT_CLR

地址偏移:0x20

表 8.10: int_clr 的格式

字段

位

访问

复位值

描述

COVRUDR

0

W1C

0

清除溢出 / 下溢

编程此位为 1 清除 OVRUDR 标志。

读取此位始终返回 0(W1C 语义)。

CMUTEDET

1

W1C

0

清除静音检测标志

编程此位为 1 清除 MUTEDET 标志。

读取此位始终返回 0(W1C 语义)。

CWCKCFG

2

W1C

0

清除错误时钟配置标志

编程此位为 1 清除 WCKCFG 标志。 此位仅当音频块设置为主 (MODE[1] = 0) 且 NOMCK = 0 时使用。

读取此位始终返回 0(W1C 语义)。

CCNRDY

3

W1C

0

清除编解码器未就绪标志

编程此位为 1 清除 CNRDY 标志。 此位仅当选择 AC’97 音频协议时使用。

读取此位始终返回 0(W1C 语义)。

CAFSDET

4

W1C

0

清除提前的帧同步检测标志

编程此位为 1 清除 AFSDET 标志。 不在 AC’97 或 SPDIF 模式下使用。

读取此位始终返回 0(W1C 语义)。

CLFSDET

5

W1C

0

清除延迟的帧同步检测标志

编程此位为 1 清除 LFSDET 标志。 不在 AC’97 或 SPDIF 模式下使用。

读取此位始终返回 0(W1C 语义)。

保留

31:6

/

0x0

/

CKCFG

地址偏移:0x24

表 8.11: ckcfg 的格式

字段

位

访问

复位值

描述

OSR

0

R/W

0

主时钟的过采样率

  • 1’b0: 主时钟频率 = FFS x 256

  • 1’b1: 主时钟频率 = FFS x 512

NOMCK

1

R/W

0

无分频器

  • 1’b0: 主时钟发生器使能

  • 1’b1: 主时钟发生器禁用

由 MCKDIV 控制的时钟分频器仍可用于生成位时钟。

MCKDIV

7:2

R/W

0

主时钟分频器

保留

31:8

/

0x0

/

MSK

地址偏移:0x28

表 8.12: msk 的格式

字段

位

访问

复位值

描述

OVRUDRINTMSK

1:0

RO

0

溢出/下溢中断(使能掩码后)

MUTEDETINTMSK

2

RO

0

静音检测中断(使能掩码后)

WCKCFGINTMSK

3

RO

0

错误时钟配置中断(使能掩码后)

CNRDYINTMSK

4

RO

0

编解码器未就绪中断(使能掩码后)(AC’97)

AFSDETINTMSK

5

RO

0

提前的帧同步检测中断(使能掩码后)

LFSDETINTMSK

6

RO

0

延迟的帧同步检测中断(使能掩码后)

FREQINTMSK

7

RO

0

FIFO 请求中断(使能掩码后)

保留

31:8

/

0x0

/

IP_VER

地址偏移:0x2C

表 8.13: ip_ver 的格式

字段

位

访问

复位值

描述

MICRO

7:0

RO

8’h00

微版本

MINOR

15:8

RO

8’h01

次版本

MAJOR

23:16

RO

8’h00

主版本

保留

31:24

/

0x0

/

GIT_VER

地址偏移:0x30

表 8.14: git_ver 的格式

字段

位

访问

复位值

描述

GIT_VER

31:0

RO

32’h00002_0

QSAI GIT 版本

VPP_CFG

地址偏移:0x34

表 8.15: vpp_cfg 的格式

字段

位

访问

复位值

描述

HAS_IIR

0

RO

1

用于 PDM 配置的 IIR 支持