Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

其他特性

本节详细介绍了通过支持的外部依赖项启用其他功能,例如,lib_xua可以通过使用lib_spdif提供S/PDIF输出。

在需要定义某些内容时,建议在xua_conf.h文件中进行定义,但也可以在应用程序的Makefile中进行定义。

S/PDIF传输

lib_xua通过使用lib_spdif支持具有S/PDIF传输功能的设备开发。XMOS的S/PDIF发射器在单个核心中运行,并支持高达192kHz的速率。

S/PDIF发射器核心通过通道接收PCM音频样本,并以S/PDIF格式输出到端口。样本由XUA_AudioHub()任务提供给S/PDIF发射器任务。

通道应按照正常方式声明:

chan c_spdif_tx;

为了在lib_xua中使用S/PDIF发射器,必须声明一个1位端口,例如:

buffered out port :32 p_spdif_tx = PORT_SPDIF_OUT; /* S/PDIF传输端口 */

这个端口应该从主时钟进行时钟同步,lib_spdif提供了一个辅助函数来设置端口:

spdif_tx_port_config(p_spdif_tx, clk_audio_mclk, p_mclk_in, delay);

如果与XUA_AudioHub(或任何其他任务)共享主时钟端口和时钟块,则应在par语句中运行任务之前进行此设置。

最后,必须运行S/PDIF发射器任务 - 并传入用于与XUA_AudioHub通信的端口和通道。例如:

par
{
while (1)
{
/* 运行S/PDIF发射器任务 */
spdif_tx(p_spdif_tx, c_spdif_tx);
}
/* AudioHub / IO核心负责大部分音频I/O,例如I2S(也作为所有音频的中心)。
* 注意,由于我们不使用I2S,我们将LR和Bit时钟端口以及I2S数据线端口都设置为null */
XUA_AudioHub(c_aud, clk_audio_mclk, null, p_mclk_in, null, null, null, null, c_spdif_tx);
}

有关更多详细信息,请参阅lib_spdif提供的文档、应用笔记和示例。

S/PDIF接收

lib_xua通过使用lib_spdif支持具有S/PDIF接收功能的设备开发。XMOS的S/PDIF接收器在单个核心中运行,并支持高达192kHz的速率。

S/PDIF接收器通过端口输入数据,并通过通道输出样本。它需要一个1位端口,该端口必须是4位带缓冲的。例如:

buffered in port :4 p_spdif_rx = PORT_SPDIF_IN;

它还需要一个时钟块,例如:

clock clk_spd_rx = XS1_CLKBLK_1;

最后,必须声明一个用于输出样本的通道,注意,这应该是一个流式通道:

streaming chan c_spdif_rx;

S/PDIF接收器应在适当的tile上调用:

SpdifReceive(p_spdif_rx, c_spdif_rx, 1, clk_spd_rx);

建议将initial_divider参数设置为1。

通过上述步骤,xCORE可以捕获S/PDIF流。为了实现功能上的可用性,音频主时钟必须能够与外部数字流同步。此外,主机可以被通知有关该流的有效性、频率等的变化。为了与外部流同步,代码库假设使用外部Cirrus Logic CS2100设备。

lib_xua的ClockGen()任务提供了CS2100设备的参考信号,并处理时钟有效性的记录等。有关ClockGen()的完整详细信息,请参阅实现细节

它还为S/PDIF样本提供了一个小的FIFO,然后将其转发到AudioHub核心。因此,它需要在S/PDIF接收器和AudioHub核心之间的通信路径中插入。例如:

chan c_dig_rx;
streaming chan c_spdif_rx;
par
{
SpdifReceive(..., c_spdif_rx, ...);
clockGen(c_spdif_rx, ..., c_dig_rx, ...);
XUA_AudioHub(..., c_dig_rx, ...);
}