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 的频率必须至少等于符号率。
符号率 |
最小 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 中寄存器的偏移地址所示。
偏移量 |
寄存器名称 |
功能描述 |
|---|---|---|
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
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SPDIFRXEN |
1:0 |
R/W |
0x0 |
外设块使能
|
RXDMAEN |
2 |
R/W |
0x0 |
数据流接收 DMA 使能
|
RXSTEO |
3 |
R/W |
0x0 |
立体声模式
|
DRFMT |
5:4 |
R/W |
0x0 |
RX 数据格式
|
PMSK |
6 |
R/W |
0x0 |
屏蔽奇偶校验错误位
|
VMSK |
7 |
R/W |
0x0 |
屏蔽有效位
|
CUMSK |
8 |
R/W |
0x0 |
屏蔽通道状态和用户位
|
PTMSK |
9 |
R/W |
0x0 |
屏蔽前导码类型位
|
CBDMAEN |
10 |
R/W |
0x0 |
控制流控制缓冲区 DMA 使能
|
CHSEL |
11 |
R/W |
0x0 |
通道选择
|
NBTR |
13:12 |
R/W |
0x0 |
同步阶段允许的最大重试次数
|
WFA |
14 |
R/W |
0x0 |
等待活动
|
保留 |
15 |
/ |
0x0 |
/ |
INSEL |
18:16 |
R/W |
0x0 |
SPDIFRX 输入选择
|
保留 |
19 |
/ |
0x0 |
/ |
CKSEN |
20 |
R/W |
0x0 |
符号时钟使能
|
CKSBKPEN |
21 |
R/W |
0x0 |
备用符号时钟使能
|
保留 |
31:22 |
/ |
0x0 |
/ |
SPDIFRX_IMR
地址偏移:0x4
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
RXNEIE |
0 |
R/W |
0x0 |
RXNE 中断使能
|
CSRNEIE |
1 |
R/W |
0x0 |
控制缓冲区就绪中断使能
|
PERRIE |
2 |
R/W |
0x0 |
奇偶校验错误中断使能
|
OVRIE |
3 |
R/W |
0x0 |
上溢错误中断使能
|
SBLKIE |
4 |
R/W |
0x0 |
同步块检测中断使能
|
SYNCDIE |
5 |
R/W |
0x0 |
同步完成中断使能
|
IFEIE |
6 |
R/W |
0x0 |
串行接口错误中断使能
|
保留 |
31:7 |
/ |
0x0 |
/ |
SPDIFRX_SR
地址偏移:0x8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
RXNE |
0 |
RO |
0x0 |
读数据寄存器非空
|
CSRNE |
1 |
RO |
0x0 |
控制缓冲区寄存器非空
|
PERR |
2 |
RO |
0x0 |
奇偶校验错误
|
OVR |
3 |
RO |
0x0 |
上溢错误
|
SBD |
4 |
RO |
0x0 |
同步块检测
|
SYNCD |
5 |
RO |
0x0 |
同步完成
|
FERR |
6 |
RO |
0x0 |
帧错误
|
SERR |
7 |
RO |
0x0 |
同步错误
|
TERR |
8 |
RO |
0x0 |
超时错误
|
保留 |
15:9 |
/ |
0x0 |
/ |
WIDTH5 |
30:16 |
RO |
0x0 |
用 spdifrx_ker_ck 计数的 5 个符号的持续时间 |
保留 |
31 |
/ |
0x0 |
/ |
SPDIFRX_IFCR
地址偏移:0xC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
保留 |
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
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
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 |
前导码类型
|
保留 |
31:30 |
/ |
0x0 |
/ |
SPDIFRX_FMT1_DR
地址偏移:0x14
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
PE |
0 |
RO |
0x0 |
奇偶校验错误位 |
V |
1 |
RO |
0x0 |
有效位 |
U |
2 |
RO |
0x0 |
用户位 |
C |
3 |
RO |
0x0 |
通道状态位 |
PT |
5:4 |
RO |
0x0 |
前导码类型
|
保留 |
7:6 |
/ |
0x0 |
/ |
DR |
31:8 |
RO |
0x0 |
数据值 |
SPDIFRX_FMT2_DR
地址偏移:0x18
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
DRNL1 |
15:0 |
RO |
0x0 |
数据值,此字段包含通道 B 的数据 |
DRNL2 |
31:16 |
RO |
0x0 |
数据值,此字段包含通道 A 的数据 |
SPDIFRX_CSR
地址偏移:0x1C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
USR |
15:0 |
RO |
0x0 |
用户数据信息 |
CS |
23:16 |
RO |
0x0 |
通道 A 状态信息 |
SOB |
24 |
RO |
0x0 |
块开始
|
保留 |
31:25 |
/ |
0x0 |
/ |
SPDIFRX_DIR
地址偏移:0x20
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
THI |
12:0 |
RO |
0x0 |
高阈值。此字段包含当前的高阈值估计值 |
保留 |
15:13 |
/ |
0x0 |
/ |
TLO |
28:16 |
RO |
0x0 |
低阈值。此字段包含当前的低阈值估计值 |
保留 |
31:29 |
/ |
0x0 |
/ |
SPDIFRX_VERR
地址偏移:0x24
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
MINREV |
3:0 |
RO |
0x1 |
SPDIFRX 次版本修订 |
MAJREV |
7:4 |
RO |
0x1 |
SPDIFRX 主版本修订 |
保留 |
31:8 |
/ |
0x0 |
/ |
SPDIFRX_IPIDR
地址偏移:0x28
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
ID |
31:0 |
RO |
0x0 |
SPDIFRX 标识符 |
SPDIFRX_SIDR
地址偏移:0x2C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SID |
31:0 |
RO |
0x0 |
大小标识 |