音频(WM8960)测试

本测试将实现通过I2C对WM8960的配置,并读取WM8960的音频数据(用Line In或者MIC In作为输入源)后再回环输出到WM8960,通过耳机或者喇叭播放出来。

创建vivado工程

重新创建一个vivado工程,根据之前的步骤,配置好PS 的Quad SPI FLASH , UART, DDR 控制器。由于本次实验用到了 I2C 控制器,用于通过 I2C 接口对 WM8960 进行配置,需要注意的是,WM8960 的 I2C 接口(scl和 sda)在硬件上连接到了 PL 端的引脚,因此 PS 端的 I2C 控制器需要通过 EMIO 连接到 PL 的两个引脚上。

配置完成的结果如下:

 

image-20250806171244481

image-20250806171303802

 

image-20250806171216196

 

image-20250806171326701

 

image-20250806171358843

在图中点击选中箭头所指示的 IIC_0 接口,然后右击,在弹出的菜单列表中选择“Make External”,从而引出 I2C 接口。引出接口后,将其重命名为“aud_iic”,如下图:

image-20250806171622699

添加新的IP核:在 Diagram 工具栏中点击符号“+”来添加 IP,在弹出的搜索框中输入“i2s”,可以看到 I2S Receiver和 I2S Transmitter 两个 IP 核,我们需要分别将其添加到设计中。

image-20250806171850164

按照下图进行配置:transmitter也是同样的配置

image-20250806171928581

引出两个 I2S IP 核与 WM8960 芯片通信的接口。I2S Receiver 模块负责采集 WM8960 输出的音频数据,因此需要通过“Make External”的方式引出音频数据输入接口“sdata_0_in”,引出接口后,将接口的名称修改为“aud_adc_data”。

一般情况下 I2S Receiver 和 I2S Transmitter 两个 IP 核只支持主模式,但我们本次需要使用WM8960芯片的板载时钟进行时钟同步,所以将I2S Receiver 设为从模式,将 I2S Transmitter设为主模式。

双击I2S Receiver 核,将C_IS_MASTER值改为0如下图所示:

image-20250807165310764

将I2S Receiver 设为从模式,将 I2S Transmitter设为主模式后 Receiver端的Irclk_in/sclk_in由Transmitter端的Irclk_out/sclk_out提供。

image-20250807165224206

 

I2S Transmitter 模块负责将要播放的音频数据输出给 WM8960,因此同样通过“Make External”的方式引出音频数据输出接口“sdata_0_out”,然后将这个接口重命名为“aud_dac_data”,图中还从 I2S Transmitter 模块引出了一个接口 sclk_out,它是 I2S 传输协议中的位时钟 BCLK,要进行两端的位时钟同步,即将 Transmitter的该接口连接至Receiver的 sclk_in接口 如下图所示:

image-20250807171416184

为了实现音频环回的功能,将 I2S Receiver 模块的 m_axis_aud 接口连接到 I2S Transmitter模块的 s_axis_aud 接口。即把接收模块输出的 AXI4-Stream 格式的音频数据,直接输出给发送模块,如下所示:

image-20250806173957945

搜索并添加时钟模块:

image-20250806174122795

对时钟进行配置:在 Clocking Options 页将输入时钟由WM8960模块的MCLK引脚提供时钟。WM8960模块的MCLK输出的频率是24MHz。所以这里输入频率设置为手动“MANUAL”,并将时钟频率修改为24MHz。

image-20250807171533207

在 Output Clocks 页面中将输出时钟 clk_out1 的频率设置为 18.432MHz,为 I2S Receiver/I2S Transmitter 模块提供MCLK。该时钟频率为 128 * Fs 的整数倍,其中 Fs 为音频采样率。在本次实验中使用的音频采样率 Fs 为 48KHz,那么 clk_out1 的时钟频率为 N ×12848 KHz,其中 N 为正整数。当 N为 3 时,计算出来的时钟频率为 3 ×12848000 = 18432000Hz,即 18.432MHz。

image-20250807171601937

在 Output Clocks 页面的最下面,取消勾选时钟模块的复位接口“reset”。设置完成后在图中点击右下角的“OK”

image-20250805141057418

 

将上图中的 clk_in1 以“Make External”的方式引出接口,并重命名为“aud_mclk”;然后 clk_out1连接至 I2S Receiver 和 I2S Transmitter,设置完成之后如下图:

image-20250807171945298

image-20250807172319039

搜索“vector”并添加“Utility Vector Logic”IP 核,进行下面的配置:

image-20250807102658734

用该非门对时钟模块输出的“locked”信号进行取反,然后将取反之后的信号连接到 I2S Receiver和 I2S Transmitter 模块的 aud_mrst 接口。在时钟模块输出的时钟稳定之后,locked 信号会拉高;而 aud_mrst信号是高电平复位,因此需要添加一个非门对 locked 信号取反。如下图所示:

image-20250807172417943

接下来分别点击 Diagram 窗口上方的“Run Block Automation”和“Run Connection Automation”,让工具自动对剩余的模块接口进行连接:

image-20250807172445013

在点击“Run Connection Automation”后弹出的对话框中,需要在左侧勾选“All Automation”,进行自动连接,连接完成后CTRL+S保存工程,进行生成顶层文件HDL步骤。

添加管脚约束:右击Constraints-->Add Sourse

image-20250805142356667

添加xdc文件:

image-20250805142442674

进行综合,实现,导出.xsa文件。

创建vitis工程

新创建平台工程,应用工程,导入xsa文件,创建.c文件

核心代码如下,主要是针对寄存器的操作

 

编译调试

使用音频连接线一端连接音频播放设备,另一端与开发板的 LINE_IN 接口连接;

使用 USB 连接线将电脑与底板上的 JTAG 接口连接。

然后使用 USB 连接线将开发板左侧的 USB_UART 接口与电脑连接,用于串口通信。