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

音频应用程序 - USB Audio

除了总体框架外,还提供了参考设计应用程序。这些应用程序提供了框架的合格配置,它们支持并在附带的硬件上进行验证。本节将介绍各种应用程序如何定制和扩展框架。

6.1 USB音频2.0参考设计(L系列)应用程序

USB音频2.0参考设计是USB音频框架的应用,专门用于2.6中描述的硬件,并在l系列单片机(500MIPS)上实现。该代码可以在app_usb_aud_l2中找到,该软件设计支持两个通道的音频在样本频率高达192 kHz,并使用以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • S/PDIF Transmitter or MIDI

图32和图33显示了在XS1-L芯片上运行的代码的软件布局。每个单元与其他单元同时运行在一个核心中。这些线路表示每个功能单元之间的通信。由于USB驱动程序的MIPS要求(见3.14),在单个tilel系列设备上只能运行6个内核,因此只能支持一个S/PDIF传输或MIDI。

Single Tile L-Series Software Core Diagram (with S/PDIF TX)

图32:单片L系列软件核心图(带S/PDIF TX)

Single Tile L-Series Software Core Diagram (with MIDI I/O)

图33:单片L系列软件核心图(带有MIDII/O)

6.1.1 端口32A

XS1-L设备上的端口32A是一个32位宽的端口,它有几个单独的信号位信号连接到它之上,可以通过多个核访问。为此,到这个端口的任何输出都必须是读-修改-写,即为了更改端口的一个位,软件读取跨32位驱动的当前值,翻转一点,然后输出修改后的值。

这种端口使用方法(即在核之间共享一个端口)不在标准XC使用模型之外,因此可以根据需要使用内联组装来实现。peek指令用于获取端口上的当前输出值:

/* Peek at current port value using port 32 A resource ID */
asm (" peek %0 , res [%1] " := r"(x ):"r "( XS1_PORT_32A )) ;

然后使用相关的位操作组装所需的输出值,然后直接将数据输出到端口:

/* Output to port */
asm (" out res [%0] , %1 " :: " r"( XS1_PORT_32A ) ,"r" (x)) ;

图34显示了连接到USB音频2.0参考设计板端口32A的信号。注意,它们都是来自XS1-L设备的输出。

PinPortSignal
XD49P32A0USB_PHY_RST_N
XD50P32A1CODEC_RST_N
XD51P32A2MCLK_SEL
XD52P32A3LED_A
XD53P32A4LED_B

图34:端口32A信号

6.1.2 时钟

该板有两个片上振荡器,用于主时钟的生成。它们对采样率44.1、88.2、176.4 KHz等产生11.2896MHz,对采样率48、96、192 kHz等产生24.567MHz。

通过端口P32A[2] (端口32A的引脚2)从其中一个外部主时钟电路中选择所需的主时钟。设置P32A[2]高选择11.2896MHz,低选择24.576MHz。

参考设计板使用了一个24位,192 kHz的立体声音频编解码器(Cirrus逻辑CS4270)。

该编解码器被配置为在独立模式下*stand-alone*运行,这意味着不需要串行配置接口。数字音频接口设置为I2S模式,所有时钟都为输入(即从属模式 slave mode)。

根据所使用的采样率,编解码器有三种内部模式。这些都改变了在编解码器内部使用的过采样比。这三种模式如下所示:

Audio Clock Connections

图35 音频时钟连接

在独立模式中,编解码器根据输入时钟速率自动决定操作哪个模式。

CODEC modeCODEC sample rate range (kHz)
Single-Speed4-54
Double-Speed50-108
Quad-Speed100-216

图36 编解码器模式

内部的主时钟分频器是使用MDIV引脚来设置的。MDIV被捆绑得很低,MDIV2被连接到端口32A的位2(以及连接到主时钟选择)。当MDIV2电压较低时,主时钟在单速模式下必须为256Fs,在双速模式下必须为128Fs,在四速模式下必须为64Fs。这允许一个11.2896MHz主时钟用于44.1、88.2和176.4 kHz的采样率。

当MDIV2高时,主时钟在单速模式下必须为512Fs,在双速模式下为256Fs,在四速模式下为128Fs。这允许一个24.576MHz的主时钟用于48、96和192 kHz的采样率。

当改变采样频率时,CodecConfig()函数首先通过设置P32A[1]low将编解码器复位。它选择所需的主时钟/编解码器分频器,并保持编解码器重置1 ms,以允许时钟稳定。通过设置P32A[1]回到高,使编解码器退出复位。

6.1.3 HID

参考设计实现了基本的HID控制。对vendor_ReadHidButtons()的调用只需从按钮A和按钮B中读取,并根据所需的功能(播放/暂停/跳过等)以相关位返回它们的状态。注意,这些按钮是活动的低,HID控制活动的高。因此,这些按钮就会被读取,然后就会被倒置。

/* Write HID Report Data into hidData array
*
* Bits are as follows :
* 0: Play / Pause
* 1: Scan Next Track
* 2: Scan Prev Track
* 3: Volume Up
* 4: Volime Down
* 5: Mute
*/
void UserReadHIDButtons ( unsigned char hidData [])
{
#ifndef MIDI
unsigned a , b;
p_but_a : > a;
p_but_b : > b;
a = (~ a) & 1;
b = (~ b) & 1;
/* Assign buttons A and B to Vol Up / Down */
hidData [0] = (a << HID_CONTROL_VOLUP_SHIFT ) | ( b <<HID_CONTROL_VOLDN_SHIFT );
#endif
}

在上面的示例中,这些按钮被分配给上/下的音量。

6.1.4 验证的编译选项

通过更改构建选项,可以以几种方式构建参考设计。这些都在usb_audio_sec_custom_defines_api中有描述。

该设计只根据应用程序中设置的分布式构建选项进行了完全验证。有关详细信息和二进制命名,请参见5.3。

在实践中,由于U系列和L系列函数集之间的相似性,我们完全预计所有列出的u系列配置都将在l系列上按预期运行,反之亦然。

6.1.4.1 配置 2 ioxs

此配置运行在高速音频类2.0模式下,禁用了混频器,支持2个通道输入,2个通道输出,并支持采样率高达192 kHz和S/PDIF传输。

6.1.4.2 配置 2 iomx

此配置将禁用S/PDIF,并启用MIDI。

这个配置可以通过在Makefile中定义SPDIF_TX设置为零来实现:

-DSPDIF_TX =0

MIDI设置为1:

-DMIDI =1

6.1.4.3 配置 1 ioxs

这种配置类似于第一个配置,除了它运行在音频1.0上的全速USB。

这可以在Makefile中实现:

-DAUDIO_CLASS =1

6.2 USB音频2.0DJ套件(U系列)

USB音频2.0参考设计是USB音频框架的应用,专门用于2.5中描述的硬件,并在u系列单tile设备(500MIPS)上实现。软件设计支持四个通道的音频样本频率高达192 kHz和使用以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • S/PDIF Transmitter or MIDI

软件布局是相同的单片L系列参考设计,因此图32和图33显示了代码的软件布局运行在XS1-U芯片。

与L系列一样,每个单元与其他单元同时运行在一个核心中。

由于USB驱动程序的MIPS要求(见3.14),在单片L系列设备上只能运行6个内核,因此只能支持一个S/PDIF传输或MIDI。

6.2.1 时钟和时钟的选择

实际硬件涉及时钟的产生有点不同于单tilel系列板。代替两个单独的振荡器和开关逻辑,一个带锁相环PLL的振荡器产生固定的24.576MHz和22.5792MHz主时钟。

这对在软件交互方面的主时钟的选择没有任何改变:单个大头针是(端口4C的第1位)仍然用于在两个主时钟频率之间进行选择。

该系统的优点是组件较少,电路板面积较小。

当改变采样频率时,编解码器配置()函数首先通过设置P4C[2]低来将编解码器重置。它选择所需的主时钟,并保持编解码器复位1 ms,以允许时钟稳定。通过设置P4C[2]回到高,使编解码器退出复位。

6.2.2 编解码器配置

该板配备了两个立体声音频编解码器(Cirrus Logic CS4270),提供4个通道的输入和4个通道的输出。这些代码的配置使用I2C进行,两者共享相同的I2C总线。该设计使用了开源的I2C组件sc_i2c[^27]

[^27]http://www.github.com/xcore/sc_i2c

6.2.3u系列ADC

该代码库包括对如何使用内置到u系列设备中的ADC的代码测试。一旦设置了一个大头针被用来使ADC采样,这个样本然后通过一个通道发送到xCORE设备。

在DJ套件上,ADC通过与I2SLR时钟相同的大头针进行计时。因为这意味着每个音频样本都接收到ADC样本,所以ADC的数据接收到音频驱动程序核心(audio.xc)

该代码只需将ADC值写入全局变量g_adcVal,以便根据需要在程序的其他地方使用。通过将SU1_ADC_ENABLE定义为1来启用ADC代码。

6.2.4HID示例

该代码库包括一个基于ADC数据的HID卷控制实现的示例。此代码只能被视为一个例子,因为一个绝对的ADC输入不能作为一个相对的HID卷控制的理想输入。按钮(如单tilel系列板上的按钮)或旋转编码器将是更合适的输入组件选择。

如果HID_CONTROLS、SU1_ADC_ENABLEADC_VOL_CONTROL均定义为1,则将启用此代码。

Vendor_ReadHIDButtons()函数只是查看ADC的值,如果接近它报告卷上升的最大值,则接近报告卷下降的最小值。如果ADC值为中档值,则不报告任何事件。该代码如下图所示:

void Vendor_ReadHIDButtons ( unsigned char hidData [])
{
unsigned adcVal ;
int diff ;
hidData [0] = 0;
# if defined ( ADC_VOL_CONTROL ) && ( ADC_VOL_CONTROL == 1)
adcVal = g_adcVal >> 20;
if ( adcVal < ( ADC_MIN + THRESH ))
{
/* Volume down */
hidData [0] = 0 x10 ;
}
else if ( adcVal > ( ADC_MAX - THRESH ) )
{
/* Volume up */
hidData [0] = 0 x08 ;
}
}

6.2.5已验证的生成选项

通过更改生成选项,可以以多种方式构建参考设计。这些在usb_audio_sec_custom_defines_api中被描述了。

该设计只根据应用程序中设置的分布式构建选项进行了完全验证。详情和二进制命名方案请参见5.3。

下面列出了这些完全经过验证的构建配置。在实践中,由于u系列和l系列函数集之间的相似性,我们完全预计所有列出的u系列配置都将在l系列上按预期运行,反之亦然。

6.2.5.1配置2ioxs

此配置运行在高速音频类2.0模式下,禁用混频器,支持2个通道输入,2个通道输出,支持采样率高达192 kHz和S/PDIF传输。

此配置将禁用S/PDIF,并启用MIDI。

6.2.5.2配置2iomx

此配置将禁用S/PDIF,并启用MIDI。

这个配置可以通过在Makefile中定义SPDIF_TX设置为零来实现:

-DSPDIF_TX =0

MIDI设置为1:

-DMIDI =1

6.2.5.3配置2ixxx

此配置仅供输入(NUM_USB_CHAN_OUT设置为零)。即,一个麦克风应用程序或类似的应用程序。

6.2.5.4配置1ioxs

这个配置类似于第一个配置,除了它运行在音频1.0通过全速USB。

这可以在Makefile中实现:

-DAUDIO_CLASS =1

6.2.5.5 配置1xoxs

此配置类似于上面的配置,因为它运行在音频1.0通过全速USB。但是,它只被输出(即输入路径被-DNUM_USB_CHAN_IN=0禁用

6.3 USB音频2.0多信道参考设计(l系列)软件

USB音频2.0多通道参考设计是USB音频框架的一个应用程序,并在l系列双tile设备(1000MIPS)上实现。该软件设计支持多达16个通道的音频输入和10个通道的音频输出,并支持高达192 kHz的采样频率,并使用以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • Mixer

  • S/PDIF Transmitter

  • S/PDIF Receiver

  • ADAT Receiver

  • Clockgen

  • MIDI

图37显示了USB音频2.0多通道参考设计的软件布局。

Dual Tile L-Series Reference Design Core Layout

图37 双片l系列参考设计核心布置图

6.3.1时钟

为完整的时钟灵活性,双tilel系列参考设计驱动一个参考时钟到一个外部分数n时钟乘法器IC(Cirrus Logic CS2300)。这反过来又产生了在设计上使用的主时钟。这在3.10中也有描述。

6.3.2已验证的构建选项

通过更改usb_audio_sec_custom_defines_api中描述的选项,可以以几种方式构建参考设计。但是,该设计只根据应用程序中设置的构建选项进行了验证。

6.3.2.1配置1

所有的#定义都是按照分布式应用程序进行设置的。它启用了混频器,支持16个通道输入,10个通道输出,并支持高达96 kHz的采样率。

6.3.2.2配置2

与配置1相同,但编解码器设置为I2S主(XCORE Tile作为从)。这个配置可以通过注释自定义:

//# define CODEC_SLAVE 1

6.3.3.3配置3

这个配置支持高达192 kHz的采样率,但只支持10个通道进出。它也禁用了ADAT接收和混合器。它可以通过 customdefines.h中注释以下行来实现:

//# define MIXER
//# define ADAT_RX 1

并将以下定义更改为:

#define NUM_USB_CHAN_IN (10)
#define I2S_CHANS_ADC (6)
#define SPDIF_RX_INDEX (8)

6.3.2.4配置4

与配置3相同,但将编解码器设置为I2S主服务器。这个配置可以通过对配置3进行更改,并在customdefines.h中注释掉以下一行。

//# define CODEC_SLAVE 1

6.4 多功能音频套件(U-系列)

提供专门针对2.3中描述的硬件的USB音频框架的应用,并在u系列单片设备(500MIPS)上实现。该应用程序假设附加了一个标准的USBB插座(即USB设备)作为USB连接方法。

该软件设计支持2个通道的音频通道,采样频率可达192 kHz,并使用以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • S/PDIF Transmitter or MIDI

软件布局与单块l系列参考设计相同,因此图32和图33显示了在XS1-U芯片上运行的代码的软件布局。

与l系列一样,每个单元与其他单元同时运行在一个核心中。这些线路表示每个功能单元之间的通信。由于USB驱动程序的MIPS要求(见3.14),在单个片l系列设备上只能运行6个内核,因此只能支持一个S/PDIF传输或MIDI。

6.4.1 时钟和时钟的选择

使用带有锁相环PLL的单振荡器产生固定的24.576MHz和22.5792MHz主时钟。

这不会改变软件交互中主时钟的选择:单针针(端口32A的第1位)用于在两个主时钟频率之间进行选择。

当改变采样频率时,AudioHwConfig()函数首先通过设置P4C[0]P4C[1]为低来重置DAC和ADC。它选择所需的主时钟,并保持DAC和ADC复置1ms,以使时钟稳定。通过设置P4C[0]和P4C[1]重新调高,使DAC和ADC退出复位。

6.4.2 DAC和ADC配置

该板配备了单立体声音频DAC(Cirrus Logic CS4392)和单立体声ADC(Cirrus Logic 5340),提供2个通道的输入和2个通道的输出。

使用I2C配置DAC。该设计使用了开源的I2C组件sc_i2c28,在软件中不需要配置ADC,它通过其在电路板上的配置引脚被设置为从属模式。

6.4.3 U系列ADC

代码库包括对如何使用u系列设备中内置的ADC的代码测试。一旦设置了一个大头针被用来使ADC采样,这个样本然后通过一个通道发送到xCORE设备。在多功能音频板上,ADC通过与I2SLR时钟相同的引脚进行时钟。因为这意味着每个音频样本都接收到ADC样本,所以ADC的数据接收到音频驱动程序核心(audio.xc)。U8设备的ADC输入只是简单地固定在测试点头上。因此,在ADC数据中没有附加任何示例功能。

6.4.4 HID示例

该代码库包括一个使用这两个按钮和多功能音频板上的开关的HID控制实现的示例。

如果HID_CONTROLS都定义为1,则将启用此示例代码。启用此定义后,对函数Vendor_ReadHIDButtons()的调用将被启用并必须实现。如果不这样做,将导致生成错误。

示例Vendor_ReadHIDButtons()首先读取按钮和开关的状态。这些输入都连接到同一个4位端口。由于按钮是活动的低,而HID报告是活动的高,所以值读取是颠倒的。然后使用一些按位排列的操作来精确化按钮和开关的各个状态。

如果开关输入低(即反转时高),则按钮状态上移到所需位置,上下执行音量并写入hidData[]数组:

hidData [0] = (a << HID_CONTROL_VOLUP_SHIFT ) | ( b << HID_CONTROL_VOLDN_SHIFT);

如果开关输入值高(即反转时值低),则按钮状态用于指示播放/暂停或下一次/上一次。基于计数器和一个小的状态机,一次点击任何一个按钮都可以提供一个播放/暂停命令。双击按钮A或B分别提供上一个或下一个命令。完整的代码列表如下图所示:

void UserReadHIDButtons ( unsigned char hidData [])
{
/* Variables for buttons a & b and switch sw */
unsigned a , b , sw , tmp ;

p_sw :> tmp ;
/* Buttons are active low */
tmp = ~ tmp ;
a = ( tmp & ( P_GPI_BUTA_MASK )) >> P_GPI_BUTA_SHIFT ;
b = ( tmp & ( P_GPI_BUTB_MASK )) >> P_GPI_BUTB_SHIFT ;
sw = ( tmp & ( P_GPI_SW1_MASK ) ) >> P_GPI_SW1_SHIFT ;
if(sw)
{
/* Assign buttons A and B to Vol Up / Down */
hidData [0] = (a << HID_CONTROL_VOLUP_SHIFT ) | ( b << HID_CONTROL_VOLDN_SHIFT );
}
else
{
/* Assign buttons A and B to play for single tap , next / prev for double tap */
if (b)
{
multicontrol_count ++;
wait_counter = 0;
lastA = 0;
}
else if (a )
{
multicontrol_count ++;
wait_counter = 0;
lastA = 1;
}
else
{
if ( multicontrol_count > THRESH )
{
state ++;
}
wait_counter ++;
if ( wait_counter > MULTIPRESS_WAIT )
{
if ( state == STATE_PLAY )
{
hidData [0] = (1 << HID_CONTROL_PLAYPAUSE_SHIFT );
}
else if ( state == STATE_NEXTPREV )
{
if ( lastA )
hidData [0] = (1 << HID_CONTROL_PREV_SHIFT );
else
hidData [0] = (1 << HID_CONTROL_NEXT_SHIFT );
}
state = STATE_IDLE ;
}
multicontrol_count = 0;
}
}
}

6.4.5 验证的生成选项

通过更改编译选项,可以以几种方式编译参考设计。这些在7.1中被描述。

该设计只根据应用程序中设置的分布式编译选项进行了完全验证。详情和二进制命名方案请参见5.3。

下面列出了这些完全经过验证的编译配置。在实践中,由于u系列和l系列功能集之间的相似性,我们完全预计所有列出的u系列配置都将在l系列上按预期运行,反之亦然。

6.4.5.1 配置2ioxs

此配置运行在高速音频类2.0模式下,禁用了混频器,支持2个通道输入,2个通道输出,支持采样率高达192 kHz和S/PDIF传输。

6.4.5.2 配置2iomx

此配置将禁用S/PDIF,并启用MIDI。这个配置可以通过在Makefile中定义SPDIF_TX为零来实现:

- DSPDIF_TX =0

MIDI为1:

- DMIDI =1

6.4.5.3 配置2ixxx

此配置仅供输入(NUM_USB_CHAN_OUT设置为零)。即,一个麦克风应用程序或类似的应用程序。

6.4.5.4 配置1iox

这种配置类似于第一个配置,除了它运行在音频1.0上的全速USB。

这可以在Makefile中实现:

- DAUDIO_CLASS =1

6.4.5.5 配置1xoxs

此配置类似于上面的配置,因为它运行在音频1.0通过全速USB。但是,它只被输出(即输入路径被-DNUM_USB_CHAN_IN=0禁用

6.5 u系列多通道USB音频套件

USB音频框架的应用专门针对2.4中描述的硬件,并在u系列双片设备(1000MIPS)上实现。该应用程序假设提供了一个标准的USBB插座(即USB设备)作为USB连接方法。相关的代码可以在app_usb_aud_u16_audio8中找到。

该设计支持10个通道的音频输入和输出通道,采样频率最高可达192 kHz,并使用以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • S/PDIF Transmitter

  • MIDI

软件布局与单片l系列多通道参考设计相同,因此图37显示了在XS1-U芯片上运行的代码的软件布局。

与l系列一样,每个单元与其他单元同时运行在一个核心中。这些线路表示每个功能单元之间的通信。

6.5.1 时钟和时钟的选择

XA-SK-AUDIO8双槽片包括两个主时钟生成的选项:

  • 一个带锁相环PLL的单振荡器产生固定的24.576MHz和22.5792MHz主时钟

  • 一个Cirrus逻辑CS2100时钟乘法器,允许主时钟从一个XCore派生的引用中生成。

主时钟源由一个mux控制,而这个mux又由PORT 4D的第1位控制:

解释
0主时钟来自于相位链PLL
1主时钟是来源于Cirrus时钟倍增器

图 38 主时钟源选择

所提供的应用程序的当前版本只支持使用来自相位链部分的固定主时钟。从锁相环部分进行的时钟选择通过PORT4E的第2位进行控制:

频率
024.576MHz
122.579MHz

图 39 主时钟频率选择

6.5.2 DAC和ADC配置

该板配备有单多通道音频DAC(Cirrus Logic CS4384)和单多通道ADC(Cirrus Logic CS5368),提供8通道的模拟输出和8通道的模拟输入。

DAC和ADC的配置都使用I2C进行。该设计采用了I2C组件sc_i2c[^29]。

DAC和ADC的复位线分别连接到PORT4E的0位和1位。

6.5.3 AudioHwInit()函数

AudioHwInit()函数用来执行以下功能:

  • 初始化I2C主软件模块

  • 将音频硬件重置

  • 启用音频硬件的电源

  • 选择锁相环PLL作为音频主时钟源

6.5.4 AudioHwConfig()函数

每次样本频率变化时,都会调用AudioHwConfig()函数。

AudioHwConfig()函数先通过设置P4E[0]和P4E[1]为低来重置DAC和ADC。然后,它选择所需的主时钟,并保持DAC和ADC在重置一段时间,以便允许时钟稳定。

通过将P4E[0]和P4E[1]重新调高,使DAC和ADC退出复位。

然后根据需要将各种寄存器写入ADC和DAC。

6.5.5 验证的生成选项

通过更改编译选项,可以以几种方式编译参考设计。这些在7.1中被描述。

该设计只根据应用程序中设置的分布式编译选项进行了完全验证。详情和二进制命名方案请参见5.3。

下面列出了这些完全经过验证的编译配置。在实践中,由于u系列和l系列功能集之间的相似性,我们完全预计所有列出的u系列配置都将在l系列上按预期运行,反之亦然。

6.5.5.1 配置2ioxs

此配置运行在高速音频类2.0模式下,并启用了混频器核心(仅用于音量处理,支持10个通道输入,10个通道输出,支持采样率高达192 kHz和S/PDIF传输。

6.6 xCORE-200多通道音频板

该USB音频框架的应用是专门针对2.1中描述的硬件提供的,并在xcore-200系列双平铺设备上实现。相关的代码可以在app_usb_aud_xk_216_mc中找到。

该设计支持多达10个通道的模拟音频输入/输出,采样率高达192 kHz,假设使用I2S。这可以通过利用TDM来进一步增加。

该设计使用了以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • S/PDIF Transmitter

  • MIDI

软件布局与双层l系列多通道参考设计相同,因此图37显示了在xCORE-200设备上运行的代码的软件布局。

与L/u系列一样,每个单元与其他单元同时运行在一个核心中。这些线路表示每个功能单元之间的通信。

6.6.1 时钟和时钟的选择

该板包括两个选项的主时钟生成:

  • 一个带有锁相环PLL的单振荡器产生固定的24.576MHz和22.5792MHz主时钟

  • 一个Cirrus逻辑CS2100时钟倍增器,允许主时钟从XCore派生的参考生成。

主时钟源由一个mux控制,而这个mux又由PORT 8C的第5位控制:

解释
0主时钟来自于锁相环PLL
1主时钟是来源于Cirrus时钟倍增器

图 40 主时钟源选择

锁相环部分的时钟选择通过PORT 8C的第7位进行控制:

频率
024.576MHz
122.579MHz

图 41 主时钟频率选择

6.6.2 DAC和ADC配置

该板配备有单多通道音频DAC(Cirrus Logic CS4384)和单多通道ADC(Cirrus Logic CS5368),提供8通道的模拟输出和8通道的模拟输入。

DAC和ADC的配置都使用I2C进行。该设计采用了I2C组件sc_i2c1

DAC和ADC的复位线分别连接到PORT8C的第1位和第6位。

6.6.3 AudioHwInit()函数

AudioHwInit()函数用来执行以下功能:

  • 初始化I2C主软件模块

  • 将音频硬件重置

  • 启用音频硬件的电源

  • 选择锁相环PLL作为音频主时钟源

6.6.4 AudioHwConfifig()函数

每次样本频率变化时,都会调用AudioHwConfig()函数。

AudioHwConfig()函数先通过设置P8C[1]和P8C[6]为低来重置DAC和ADC。然后,它选择所需的主时钟,并保持DAC和ADC在重置一段时间,以便允许时钟稳定。

通过将P4E[0]和P4E[1]重新调高,使DAC和ADC退出复位。

然后根据需要将各种寄存器写入ADC和DAC。

6.6.5验证的生成选项

通过更改编译选项,可以以几种方式编译参考设计。这些在7.1中被描述。

该设计只根据应用程序中设置的、在Makefile中分布的编译选项进行了完全验证。详情和二进制命名方案请参见5.3。

这些完全验证的编译配置在提供的制造文件中进行了枚举,由于U/L/xCORE-200系列特性集之间的相似性,完全预计所有列出的U系列配置将在l系列上按预期运行,反之亦然。

生成文件中使用的编译配置命名方案如下:

**Feature **Option 1Option 2
Audio Class12
Input启用:i(通道数)禁用:x
Output启用:o(通道数)禁用:x
MIDI启用:m禁用:x
SPDIF output启用:s禁用:x
SPDIF input e启用:s禁用:x
ADAT output启用:a禁用:x
ADAT input启用:a禁用:x
DSD output启用:d禁用:x

图 42 编译配置命名方案

例如,一个名为2i10o10xsxxx的编译配置将意味着:音频类2.0,启用输入和输出(每个10个通道),没有MIDI SPDIF输出,没有SPDIF输入,没有ADAT或DSD输出。

除此之外,术语tdmslave可以被附加到编译配置名称中,以指示所使用的I2S模式。

6.7 xCORE-200阵列麦克风板

USB音频框架的应用专门针对2.2中描述的硬件提供,并在xcore-200系列双平铺设备上实现。相关的代码可以在app_usb_aud_array_mic中找到。

该设计支持多达2个通道的模拟音频输出在采样率从车载DAC。该设计还支持来自7个PDM麦克风的输入。

该设计使用了以下组件:

  • XMOS USB Device Driver (XUD)

  • Endpoint 0

  • Endpoint buffer

  • Decoupler

  • Audio Driver

  • Device Firmware Upgrade (DFU)

  • PDM Microphone integration

软件布局与双层l系列多通道参考设计相同,因此图37显示了在xCORE-200设备上运行的代码的软件布局。

与L/u系列一样,每个单元与其他单元同时运行在一个核心中。这些线路表示每个功能单元之间的通信。

所提供的应用程序还包括一个基本的麦克风数据处理的示例。

6.7.1 时钟和时钟的选择

该板包括一个外部分数n音频时钟乘法器(Cirrus Logic CS2100)的音频时钟生成。

这允许音频主时钟由xCORE提供的参考时钟产生,可选地来自一些外部来源,例如输入的数字流。

提示

此功能主要包括在电路板上,以允许以太网AVB,其中需要同步到一个外部时钟。在USB音频设计中,IC被简单地用于静态主时钟的生成。

提示

系统宽的音频主时钟连接到CS2100部分的AUX输出。默认情况下,如果没有配置,CS2100部件将24.576MHz REF输入输出到此输出端口。

时钟乘比通过I2C总线被编程到CS2100中。默认情况下,一个核心被用来使用计时器和端口I/O来驱动对CS2100部件的固定引用。由于此I/O位于4位端口上,因此不能直接从时钟块输出(这将保存核心)。为了减少核心数量,可以进行以下操作:

  • 将I/O移动到一个1位端口和驱动时钟直接从一个时钟块

  • 结合这个(计算简单)任务到另一个任务·

  • 使用时钟方法,不需要这个裁判信号如前面解释,不可能采用时钟方法在生产环境中如果不需要锁定外部时钟。

6.7.2 DAC配置

板配备了一个单立体声音频DAC集成耳机放大器(Cirrus Logic CS43L21)两个DAC配置使用I2C。

该设计采用了I2C组件sc_i2c[^31]。

DAC的复位线连接到位0 PORT 4F

6.7.3 AudioHwInit()函数

AudioHwInit()函数在通电时被调用,并被实现以执行以下功能::

  • 将DAC重置

  • 初始化I2C主软件模块

  • 在I2C上初始化CS2100部分

  • 配置CS2100部件以输出一个合适的初始主时钟频率(DEFAULT_MCLK_FREQ)

6.7.4 AudioHwConfifig()函数

每次样本频率变化时,都会调用AudioHwConfig()函数。

AudioHwConfig()函数首先通过写入PORT 4F,将DAC/耳机功放重置。

通过将P4E[0]和P4E[1]重新调高,使DAC和ADC退出复位。

然后,根据mClk参数,通过I2C在CS2100中设置所需的比率。在一个延迟之后,为了允许来自CS2100的主时钟来解决DAC,将退出复位。然后通过I2C配置DAC,这主要涉及到将DAC切换到I2S从属模式。

6.7.5麦克风处理示例

所提供的应用程序包括处理来自PDM麦克风的数据的基本示例。这个基本的处理示例位于user_pdm_process()中。它将一块PCM麦克风样本作为输入,并将处理后的样本写入输出阵列参数。

处理过程涉及到对所有麦克风应用一个简单的增益。正常操作可以看到这个增益应用于来自7个麦克风的数据,然后写入output[0-6]。分别按B和C按钮可以增加和降低增益。

该示例还提供了一个简单的求和例子,其中所有7个麦克风被求和为output[0],原始麦克风信号输出到output[1..7]。使用按钮A启用和禁用此功能。

6.7.6 验证的生成选项

通过更改编译选项,可以以几种方式编译参考设计。这些在7.1中被描述。

该设计只根据应用程序中设置的、在Makefile中分布的编译选项进行了完全验证。有关详细信息和二进制命名方案,请参见5.3。

这些完全验证的编译配置在提供的制造文件中进行了枚举。

由于U/L/xCORE-200系列特性集之间的相似性,完全预计所有列出的U系列配置将在l系列上按预期运行,反之亦然。

生成文件中使用的编译配置命名方案如下:

**Feature **Option 1Option 2
Audio Class12
Input启用:i(通道数)禁用:x
Output启用:i(通道数)禁用:x

图43 编译配置命名方案

例如,一个名为2i8o2的编译配置将表示:音频类2.0,启用了输入和输出(8输入,2输出)。

Footnotes

  1. http://www.github.com/xcore/sc_i2c