SPDIFRX #################### .. toctree:: :maxdepth: 3 :caption: 目录: 简介 ---- 本文档是 SPDIFRX IP 的用户手册。SPDIFRX 可用于根据 IEC-60958 和 IEC-61937 标准接收 S/PDIF 数据流。 主要特性 -------- SPDIFRX 的主要特性如下: - 支持 4 路输入 - 符合 IEC-60958 标准和 IEC-61937 标准 - 支持自动检测符号率 - 支持 DMA 数据传输 - 支持高达 12.288 MHz 的符号率,并支持 8 至 192kHz 的立体声音频格式 功能描述 -------- SPDIFRX 解码器 (SPDIFRX_DC) ---------------------------- 解码模块主要负责解码接收到的 spdif 数据流,包括以下功能: - 对输入信号进行重采样 - 对采样数据执行滤波 - 解码前导码的格式 - 解码 IEC-60958 帧和块 同步 ---- 当 SPDIFRX_CR 寄存器的 SPDIFRXEN 位设置为 0b01 或 0b11 时,同步开始。如果 SPDIFRX_CR 寄存器的 WFA 位设置为 0,则不需要主动检测。如果 WFA 位设置为 1,我们需要通过成功检测四次转换来检查所选的 spdif_in 是否处于活动状态,然后再进行同步。当检测到 spdif_in 活动时,它执行粗同步和精同步步骤。如果精确同步成功,sync_done 被设置为 1(内部信号)。如果在精确同步期间发生错误,则会再次执行粗同步和精确同步。当重试次数达到 TRCNT 时,会报告错误消息。sync_done 之后,无论 SPDIF 处于 SYNC 状态还是 RCV 状态,SPDIFRX 将始终保持精确同步。 SPDIF 处理 ---------- SPDIF 可以处于以下状态之一: - **IDLE**:当 SPDIFRXEN 为 0b00 且 SPDIF 处于 IDLE 状态时,将 SPDIFRXEN 设置为 0b01 或 0b11 以将状态更改为 SYNC。 - **SYNC**:如果发生各种错误(FERR 或 SERR 或 TERR),则进入 STOP 状态;如果 SPDIFRXEN 为 0b00,则进入 IDLE 状态;如果同步完成且 SPDIFRXEN 为 0b01,SPDIF 保持同步状态;如果同步完成(SYNC_DONE=1)且 SPDIFRXEN 为 0b11,则状态进入 RCV 状态。 - **RCV**:如果发生各种错误(FERR 或 SERR 或 TERR),则进入 STOP 状态;当 SPDIFRXEN 为 0b00 时,状态进入 IDLE 状态。 - **STOP**:当 SPDIFRXEN 为 0b00 时,状态进入 IDLE 状态。 在 IDLE 状态下,外设被禁用。在 SYNC 状态下,外设与流同步,阈值定期更新,用户和通道状态可通过中断或 DMA 读取。音频样本不提供给接收缓冲区。在 RCV 状态下,外设与流同步,阈值定期更新,用户、通道状态和音频样本可通过中断或 DMA 通道读取。当 SPDIFRXEN 变为 11 时,SPDIF 在开始保存音频样本之前等待 "B" 前导码。在 STOP 状态下,外设不再同步,用户、通道状态和音频样本的接收停止。 SPDIF 数据 ---------- 有三种数据格式,可通过 SPDIFRX_CR 寄存器的 DRFMT 和 RXSTEO 位控制。当 DRFMT 设置为 0b00 时,数据左对齐;当 DRFMT 设置为 0b01 时,数据右对齐;当 DRFMT 设置为 0b10 时,数据以线性模式存储。 时钟 ---- SPDIFRX 模块需要两种不同的时钟: - **ICB 时钟 (clk)**,用于寄存器接口。 - **ker_ck**,主要由 SPDIFRX_DC 部分使用。这些时钟不要求相位锁定,因此跨时钟域的所有信号都会被重新同步。 为了正确解码传入的 S/PDIF 流,SPDIFRX_DC 必须使用至少比最大符号率高 11 倍或比音频采样率高 704 倍的时钟对接收到的数据进行重采样。例如,如果用户期望接收高达 12.288 MHz 的符号率,则采样率必须至少为 135.2 MHz。SPDIFRX_DC 使用的时钟是 ker_ck。spdifrx_pclk 的频率必须至少等于符号率。 .. list-table:: 表 6.1: 音频采样率对应的最小 ker_ck 频率 :header-rows: 1 :widths: auto * - 符号率 - 最小 ker_ck 频率 - 备注 * - 3.072 MHz - 33.8 MHz - 适用于 48 KHz 流 * - 6.144 MHz - 67.6 MHz - 适用于 96 KHz 流 * - 12.288 MHz - 135.2 MHz - 适用于 192 KHz 流 中断 ----- 在顶层,SPDIFRX 会向 SoC 输出一个 spdifrx_it,它是所有中断的或逻辑。 中断产生 -------- 一个中断线由以下事件共享: - 数据流的接收事件 (RXNE) - 控制流的接收事件 (CSRNE) - 数据损坏检测 (PERR) - 传输流中断 (OVR) - 帧结构和同步错误 (SERR, TERR 和 FERR) - 新块开始中断 (SBD) - 同步完成 (SYNCD) 清除中断源 ---------- 每个中断信号的清除方法如下: - **RXNE**:读取 SPDIFRX_FMTx_DR 寄存器时清除 - **CSRNE**:读取 SPDIFRX_CSR 寄存器时清除 - **FERR**:将 SPDIFRXEN 设置为 0 时清除 - **SERR**:将 SPDIFRXEN 设置为 0 时清除 - **TERR**:将 SPDIFRXEN 设置为 0 时清除 - **其他**:通过 SPDIFRX_IFCR 寄存器清除 .. note:: SBD 事件只能在 SPDIFRX 与输入流同步 (SYNCD = 1) 时发生。当包含 B 前导码的子帧因溢出而丢失时,SBD 标志的行为无法保证。 处理来自 SPDIFRX 的中断 ------------------------ 当收到来自 SPDIFRX 的中断时,软件必须通过读取 SPDIFRX_SR 寄存器来检查中断源。 - 如果 **SYNCD** 设置为 1,则表示同步已成功完成。在我们的情况下,由于 DMA 已编程,无需执行任何操作。软件只需等待 DMA 中断以读取通道状态信息。必须通过将 SPDIFRX_IFCR 寄存器的 SYNCDCF 位设置为 1 来清除 SYNCD 标志。 - 如果 **TERR**、**SERR** 或 **FERR** 设置为 1,软件必须将 SPDIFRXEN 设置为 0,并从初始化阶段重新启动。 - **TERR** 表示在同步阶段或之后发生超时。 - **SERR** 表示同步失败,因为达到了最大允许重试次数。 - **FERR** 表示同步后读取信息失败(例如意外前导码、错误数据解码)。 - 如果 **PERR** 设置为 1,则表示检测到奇偶校验错误,因此接收到的音频样本或通道状态或用户数据位中的一个已损坏。此处采取的操作取决于应用程序:一种操作可能是丢弃当前的通道状态块,因为它不可靠。由于同步未丢失,无需从初始化阶段重新启动。必须通过将 SPDIFRX_IFCR 寄存器的 PERCRF 位设置为 1 来清除 PERR 标志。 处理来自 DMA 的中断 ------------------- - 如果中断来自用于通道状态的 DMA 通道 (SPDIFRX_CSR): - 如果未发生错误(即没有 PERR),CPU 可以开始解码通道信息。例如,通道状态的第 1 位告知用户当前流是否为线性。此信息对于设置适当的处理链非常重要。同样,通道状态的第 24 到 27 位提供传入流的采样频率。 - 借助这些信息,用户可以在开始数据接收之前配置 RXSTEO 位和 DRFMT 字段。例如,如果当前流是非线性 PCM,则将 RXSTEO 设置为 0,并将 DRFMT 设置为 10。然后用户可以通过将 SPDIFRXEN 设置为 11 来启用数据接收。 - SOB 位,当设置为 1 时,表示新块的开始。此信息帮助软件识别通道状态的第 0 位。请注意,如果 DMA 在每次将 24 个值传输到内存时生成中断,那么第一个字始终对应于新块的开始。 - 如果中断来自用于音频样本的 DMA 通道 (SPDIFRX_FMTx_DR): - 此处执行的过程取决于数据类型(线性或非线性)以及选择的数据格式。例如,在线性模式下,如果设置了 PE 或 V 位,可以在本地执行特殊处理以避免输出出现杂散。在非线性模式下,这些位不重要,因为数据帧有自己的校验和。 寄存器 ------- 寄存器描述 ~~~~~~~~~~~~ SPDIF_BLOCK 寄存器 ^^^^^^^^^^^^^^^^^^^ SPDIF_BLOCK 中的寄存器及其相应的偏移量如表 8.1: SPDIF_BLOCK 中寄存器的偏移地址所示。 .. list-table:: 表 8.1: SPDIF_BLOCK 中寄存器的偏移地址 :header-rows: 1 :widths: auto * - 偏移量 - 寄存器名称 - 功能描述 * - 0x0 - SPDIFRX_CR - 控制寄存器 * - 0x4 - SPDIFRX_IMR - 中断屏蔽寄存器 * - 0x8 - SPDIFRX_SR - 状态寄存器 * - 0xC - SPDIFRX_IFCR - 中断标志清除寄存器 * - 0x10 - SPDIFRX_FMT0_DR - 数据输入寄存器 * - 0x14 - SPDIFRX_FMT1_DR - 数据输入寄存器 * - 0x18 - SPDIFRX_FMT2_DR - 数据输入寄存器 * - 0x1C - SPDIFRX_CSR - 通道状态寄存器 * - 0x20 - SPDIFRX_DIR - 调试信息寄存器 * - 0x24 - SPDIFRX_VERR - SPDIFRX 版本寄存器 * - 0x28 - SPDIFRX_IPIDR - SPDIFRX 标识寄存器 * - 0x2C - SPDIFRX_SIDR - SPDIFRX 大小标识寄存器 SPDIFRX_CR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x0 .. list-table:: 表 8.2: SPDIFRX_CR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - SPDIFRXEN - 1:0 - R/W - 0x0 - 外设块使能 - 2'b00:禁用 SPDIFRX (STATE_IDLE) - 2'b01:仅启用 SPDIFRX 同步 - 2'b10:保留 - 2'b11:启用 SPDIF 接收器 * - RXDMAEN - 2 - R/W - 0x0 - 数据流接收 DMA 使能 - 1'b0:DMA 模式禁用接收 - 1'b1:DMA 模式使能接收 * - RXSTEO - 3 - R/W - 0x0 - 立体声模式 - 1'b0:外设处于单声道模式 - 1'b1:外设处于立体声模式 * - DRFMT - 5:4 - R/W - 0x0 - RX 数据格式 - 2'b00:数据样本右对齐(最低有效位) - 2'b01:数据样本左对齐(最高有效位) - 2'b10:通过将两个 16 位样本打包到一个 32 位字中来存储数据 - 2'b11:保留 * - PMSK - 6 - R/W - 0x0 - 屏蔽奇偶校验错误位 - 1'b0:奇偶校验错误位被复制到 SPDIFRX_FMTx_DR - 1'b1:奇偶校验错误位不被复制到 SPDIFRX_FMTx_DR,而是写入 0 * - VMSK - 7 - R/W - 0x0 - 屏蔽有效位 - 1'b0:有效位被复制到 SPDIFRX_FMTx_DR - 1'b1:有效位不被复制到 SPDIFRX_FMTx_DR,而是写入 0 * - CUMSK - 8 - R/W - 0x0 - 屏蔽通道状态和用户位 - 1'b0:通道状态和用户位被复制到 SPDIFRX_FMTx_DR - 1'b1:通道状态和用户位不被复制到 SPDIFRX_FMTx_DR,而是写入 0 * - PTMSK - 9 - R/W - 0x0 - 屏蔽前导码类型位 - 1'b0:前导码类型位被复制到 SPDIFRX_FMTx_DR - 1'b1:前导码类型位不被复制到 SPDIFRX_FMTx_DR,而是写入 0 * - CBDMAEN - 10 - R/W - 0x0 - 控制流控制缓冲区 DMA 使能 - 1'b0:DMA 模式禁用接收通道状态和用户数据信息 - 1'b1:DMA 模式使能接收通道状态和用户数据信息 * - CHSEL - 11 - R/W - 0x0 - 通道选择 - 1'b0:控制流从通道 A 获取通道状态 - 1'b1:控制流从通道 B 获取通道状态 * - NBTR - 13:12 - R/W - 0x0 - 同步阶段允许的最大重试次数 - 2'b00:不允许重试(仅尝试一次) - 2'b01:允许 3 次重试 - 2'b10:允许 15 次重试 - 2'b11:允许 63 次重试 * - WFA - 14 - R/W - 0x0 - 等待活动 - 1'b0:SPDIFRX 在执行同步前不等待 SPDIFRX_IN 线上的活动 - 1'b1:SPDIFRX 在执行同步前等待 SPDIFRX_IN 线上的活动(4 次跳变) * - 保留 - 15 - / - 0x0 - / * - INSEL - 18:16 - R/W - 0x0 - SPDIFRX 输入选择 - 3'b000:选择 SPDIFRX_IN0 - 3'b001:选择 SPDIFRX_IN1 - 3'b010:选择 SPDIFRX_IN2 - 3'b011:选择 SPDIFRX_IN3 * - 保留 - 19 - / - 0x0 - / * - CKSEN - 20 - R/W - 0x0 - 符号时钟使能 - 1'b0:SPDIFRX 不产生符号时钟 - 1'b1:SPDIFRX 产生符号时钟 * - CKSBKPEN - 21 - R/W - 0x0 - 备用符号时钟使能 - 1'b0:SPDIFRX 不产生备用符号时钟 - 1'b1:如果 CKSEN = 1,SPDIFRX 产生备用符号时钟 * - 保留 - 31:22 - / - 0x0 - / SPDIFRX_IMR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x4 .. list-table:: 表 8.3: SPDIFRX_IMR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - RXNEIE - 0 - R/W - 0x0 - RXNE 中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 RXNE = 1 时,产生 SPDIFRX 接口中断 * - CSRNEIE - 1 - R/W - 0x0 - 控制缓冲区就绪中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 CSRNE = 1 时,产生 SPDIFRX 接口中断 * - PERRIE - 2 - R/W - 0x0 - 奇偶校验错误中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 PERR = 1 时,产生 SPDIFRX 接口中断 * - OVRIE - 3 - R/W - 0x0 - 上溢错误中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 OVR = 1 时,产生 SPDIFRX 接口中断 * - SBLKIE - 4 - R/W - 0x0 - 同步块检测中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 SBD = 1 时,产生 SPDIFRX 接口中断 * - SYNCDIE - 5 - R/W - 0x0 - 同步完成中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 SYNCD = 1 时,产生 SPDIFRX 接口中断 * - IFEIE - 6 - R/W - 0x0 - 串行接口错误中断使能 - 1'b0:禁止中断 - 1'b1:每当 SPDIFRX_SR 寄存器中的 SERR = 1、TERR = 1 或 FERR = 1 时,产生 SPDIFRX 接口中断 * - 保留 - 31:7 - / - 0x0 - / SPDIFRX_SR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x8 .. list-table:: 表 8.4: SPDIFRX_SR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - RXNE - 0 - RO - 0x0 - 读数据寄存器非空 - 1'b0:未接收到数据 - 1'b1:接收到的数据已准备好可读 * - CSRNE - 1 - RO - 0x0 - 控制缓冲区寄存器非空 - 1'b0:SPDIFRX_CSR 寄存器上无可用控制字 - 1'b1:SPDIFRX_CSR 寄存器上有一个控制字可用 * - PERR - 2 - RO - 0x0 - 奇偶校验错误 - 1'b0:无奇偶校验错误 - 1'b1:奇偶校验错误 * - OVR - 3 - RO - 0x0 - 上溢错误 - 1'b0:无上溢错误 - 1'b1:检测到上溢错误 * - SBD - 4 - RO - 0x0 - 同步块检测 - 1'b0:未检测到“B”前导码 - 1'b1:检测到“B”前导码 * - SYNCD - 5 - RO - 0x0 - 同步完成 - 1'b0:同步挂起 - 1'b1:同步完成 * - FERR - 6 - RO - 0x0 - 帧错误 - 1'b0:未检测到曼彻斯特违规 - 1'b1:检测到曼彻斯特违规 * - SERR - 7 - RO - 0x0 - 同步错误 - 1'b0:未检测到同步错误 - 1'b1:检测到同步错误 * - TERR - 8 - RO - 0x0 - 超时错误 - 1'b0:未检测到序列错误 - 1'b1:检测到序列错误 * - 保留 - 15:9 - / - 0x0 - / * - WIDTH5 - 30:16 - RO - 0x0 - 用 spdifrx_ker_ck 计数的 5 个符号的持续时间 * - 保留 - 31 - / - 0x0 - / SPDIFRX_IFCR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0xC .. list-table:: 表 8.5: SPDIFRX_IFCR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 保留 - 1:0 - / - 0x0 - / * - PERRCF - 2 - W1C - 0x0 - 清除奇偶校验错误标志 * - OVRCF - 3 - W1C - 0x0 - 清除上溢错误标志 * - SBDCF - 4 - W1C - 0x0 - 清除同步块检测标志 * - SYNCDCF - 5 - W1C - 0x0 - 清除同步完成标志 * - 保留 - 31:6 - / - 0x0 - / SPDIFRX_FMT0_DR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x10 .. list-table:: 表 8.6: SPDIFRX_FMT0_DR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DR - 23:0 - RO - 0x0 - 数据值 * - PE - 24 - RO - 0x0 - 奇偶校验错误位 * - V - 25 - RO - 0x0 - 有效位 * - U - 26 - RO - 0x0 - 用户位 * - C - 27 - RO - 0x0 - 通道状态位 * - PT - 29:28 - RO - 0x0 - 前导码类型 - 2'b00:未使用 - 2'b01:接收到前导码 B - 2'b10:接收到前导码 M - 2'b11:接收到前导码 W * - 保留 - 31:30 - / - 0x0 - / SPDIFRX_FMT1_DR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x14 .. list-table:: 表 8.7: SPDIFRX_FMT1_DR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - PE - 0 - RO - 0x0 - 奇偶校验错误位 * - V - 1 - RO - 0x0 - 有效位 * - U - 2 - RO - 0x0 - 用户位 * - C - 3 - RO - 0x0 - 通道状态位 * - PT - 5:4 - RO - 0x0 - 前导码类型 - 2'b00:未使用 - 2'b01:接收到前导码 B - 2'b10:接收到前导码 M - 2'b11:接收到前导码 W * - 保留 - 7:6 - / - 0x0 - / * - DR - 31:8 - RO - 0x0 - 数据值 SPDIFRX_FMT2_DR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x18 .. list-table:: 表 8.8: SPDIFRX_FMT2_DR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DRNL1 - 15:0 - RO - 0x0 - 数据值,此字段包含通道 B 的数据 * - DRNL2 - 31:16 - RO - 0x0 - 数据值,此字段包含通道 A 的数据 SPDIFRX_CSR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x1C .. list-table:: 表 8.9: SPDIFRX_CSR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - USR - 15:0 - RO - 0x0 - 用户数据信息 * - CS - 23:16 - RO - 0x0 - 通道 A 状态信息 * - SOB - 24 - RO - 0x0 - 块开始 - 1'b0:CS[0] 不是新块的第一个位 - 1'b1:CS[0] 是新块的第一个位 * - 保留 - 31:25 - / - 0x0 - / SPDIFRX_DIR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x20 .. list-table:: 表 8.10: SPDIFRX_DIR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - THI - 12:0 - RO - 0x0 - 高阈值。此字段包含当前的高阈值估计值 * - 保留 - 15:13 - / - 0x0 - / * - TLO - 28:16 - RO - 0x0 - 低阈值。此字段包含当前的低阈值估计值 * - 保留 - 31:29 - / - 0x0 - / SPDIFRX_VERR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x24 .. list-table:: 表 8.11: SPDIFRX_VERR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - MINREV - 3:0 - RO - 0x1 - SPDIFRX 次版本修订 * - MAJREV - 7:4 - RO - 0x1 - SPDIFRX 主版本修订 * - 保留 - 31:8 - / - 0x0 - / SPDIFRX_IPIDR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x28 .. list-table:: 表 8.12: SPDIFRX_IPIDR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ID - 31:0 - RO - 0x0 - SPDIFRX 标识符 SPDIFRX_SIDR ^^^^^^^^^^^^^^^^^^^ 地址偏移:0x2C .. list-table:: 表 8.13: SPDIFRX_SIDR 的格式 :header-rows: 1 :widths: 12 10 10 10 58 * - 字段 - 位 - 访问 - 复位值 - 描述 * - SID - 31:0 - RO - 0x0 - 大小标识