SPDIFRX

简介

本文档是 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 的频率必须至少等于符号率。

表 6.1: 音频采样率对应的最小 ker_ck 频率

符号率

最小 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 中寄存器的偏移地址所示。

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

偏移量

寄存器名称

功能描述

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

表 8.2: SPDIFRX_CR 的格式

字段

位

访问

复位值

描述

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

表 8.3: SPDIFRX_IMR 的格式

字段

位

访问

复位值

描述

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

表 8.4: SPDIFRX_SR 的格式

字段

位

访问

复位值

描述

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

表 8.5: SPDIFRX_IFCR 的格式

字段

位

访问

复位值

描述

保留

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

表 8.6: SPDIFRX_FMT0_DR 的格式

字段

位

访问

复位值

描述

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

表 8.7: SPDIFRX_FMT1_DR 的格式

字段

位

访问

复位值

描述

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

表 8.8: SPDIFRX_FMT2_DR 的格式

字段

位

访问

复位值

描述

DRNL1

15:0

RO

0x0

数据值,此字段包含通道 B 的数据

DRNL2

31:16

RO

0x0

数据值,此字段包含通道 A 的数据

SPDIFRX_CSR

地址偏移:0x1C

表 8.9: SPDIFRX_CSR 的格式

字段

位

访问

复位值

描述

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

表 8.10: SPDIFRX_DIR 的格式

字段

位

访问

复位值

描述

THI

12:0

RO

0x0

高阈值。此字段包含当前的高阈值估计值

保留

15:13

/

0x0

/

TLO

28:16

RO

0x0

低阈值。此字段包含当前的低阈值估计值

保留

31:29

/

0x0

/

SPDIFRX_VERR

地址偏移:0x24

表 8.11: SPDIFRX_VERR 的格式

字段

位

访问

复位值

描述

MINREV

3:0

RO

0x1

SPDIFRX 次版本修订

MAJREV

7:4

RO

0x1

SPDIFRX 主版本修订

保留

31:8

/

0x0

/

SPDIFRX_IPIDR

地址偏移:0x28

表 8.12: SPDIFRX_IPIDR 的格式

字段

位

访问

复位值

描述

ID

31:0

RO

0x0

SPDIFRX 标识符

SPDIFRX_SIDR

地址偏移:0x2C

表 8.13: SPDIFRX_SIDR 的格式

字段

位

访问

复位值

描述

SID

31:0

RO

0x0

大小标识