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

音频硬件配置

在设计声卡时,你可以通过编写audiohw.xc文件方便地配置连接到XU316芯片的外部设备,例如通过I2C配置DAC、ADC音频解码芯片,初始化I2C端口,以及根据采样率配置XMOS的主时钟(通过APP PLL或者选择外部晶振)。

audiohw

这种配置方式适用于不同型号的CODEC芯片,只需按照文档的指导,开发者就能够完成外围芯片的配置。

audiohw.xc文件通常位于src\extensions目录下,编译时工程会检查是否存在这个文件。

接下来我们会以audiohw.xc为例,介绍如何进行相关配置和调试操作。如果你正在寻找XMOS对这部分代码的说明,参考外部音频硬件配置函数

audiohw.xc 包含哪些配置?

通常,audiohw.xc会包含多数和硬件初始化和配置相关的两个函数:

  • AudioHwInit():在音频核心启动时,用于初始化外部音频硬件,例如时钟、DAC、ADC等。

  • AudioHwConfig():在音频核心启动或更改采样率时调用。它应根据提供的主时钟频率配置外部音频硬件,使得整个系统在指定的采样率下运行。

除此之外,user_main.h中使用的端口也在audiohw.xc中完成初始化,user_main.h 通过 extern 语法来引用这些端口。

配置Codec

配置Codec的方法有多种。一般来说,你需要借助lib_i2c库中的i2c.h头文件,通过使用预先编写好的I2C协议栈以加快开发速度。然后,你可以根据所需的采样率和应用需求来配置Codec的寄存器。

通常,仅修改audiohw.xc并不能使I2C配置立即生效,因为你还需要在user_main.h中创建I2C的驱动线程。

如果你需要参考样例,可以查看以下应用笔记:使用lib_i2c配置I2C Master

音频主时钟

通常,你无需修改音频时钟配置的部分。一种需要更改的情况是当你使用了不同来源的时钟,这种情况下,你需要修改对应的配置以获取不同的时钟源,如APP PLL或外部晶振。

在使用APP PLL作为音频主时钟源的情况下,可以通过向XMOS写入不同的寄存器来根据不同的采样率产生不同的时钟频率。注意,主时钟始终通过XU316的Tile 1上的1D端口输出。

audiohw.xc
// 使用XMOS内部的PLL产生音频时钟
#include "../../shared/apppll.h"

if (samFreq % 22050 == 0)
{
AppPllEnable(MCLK_441); // 当采样率是44100的倍数时
}
else
{
AppPllEnable(MCLK_48); // 当采样率是48000的倍数时
}

而当你选择使用外部晶振作为音频主时钟源时,通常需要两个晶振,其频率是44.1kHz和48kHz的整数倍,这与两种广泛使用的音频采样率相吻合。

以PXUA-XU316-KIT开发板为例,我们可以通过将一颗晶振的使能脚常态上拉,同时将另一颗晶振的使能脚拉低,从而实现切换主时钟源的功能。默认情况下,这些使能脚位于Tile 0上的4F1和4F2端口。

audiohw.xc
// 使用外部的音频晶振提供音频时钟
#include "gpio_access.h"

if (samFreq % 22050 == 0)
{
set_gpio(MCLK_441_ENABLE, 1); // 当采样率是44100的倍数时
set_gpio(MCLK_480_ENABLE, 0);
}
else
{
set_gpio(MCLK_441_ENABLE, 0); // 当采样率是48000的倍数时
set_gpio(MCLK_480_ENABLE, 1);
}