全部例程

I2S - 音频传输接口

W55MH32

更新于 2026年8月13日

本篇总结

使用 I2S,循环输出正弦波音频信号。

🔑 KEIL MDK、UART调试、I2S

W55MH32L 内置 1 个 I2S 接口,支持飞利浦、MSB 和 LSB 对齐三种标准,采样率支持 8kHz~192kHz。本示例使用 I2S2 主机发送模式,循环输出 1kHz 正弦波音频数据。

前置工具准备

开始本例程前,请确认以下工具已安装:

  • WIZ UartTool V1.0:串口收发测试工具:点击下载

硬件连接

本例程使用 I2S2 的 WS(PB12)、CK(PB13)、SD(PB15) 引脚连接外部 I2S DAC(如 WM8978、PCM5102)或音频编解码器。如需测量波形,可用逻辑分析仪连接这三个引脚。USART1 用于输出调试信息。

引脚功能方向模式
PB12I2S2_WS(字选择)开发板 → DAC复用推挽输出 (AF_PP)
PB13I2S2_CK(位时钟)开发板 → DAC复用推挽输出 (AF_PP)
PB15I2S2_SD(数据线)开发板 → DAC复用推挽输出 (AF_PP)
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (IN_FLOATING)

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\I2S\,核心文件如下:

I2S/
├── USER/
│   ├── main.c            ← I2S配置 + 音频数据发送
│   ├── w55mh32_conf.h    ← 外设头文件集中包含
│   ├── w55mh32_it.c/h    ← 中断服务函数
│   ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│   └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
    └── delay/
        └── delay.c/h      ← SysTick 延时函数

步骤1:I2S 初始化配置

函数:I2S_Configuration() — 配置 PB12(WS)/PB13(CK)/PB15(SD) 为复用推挽输出,I2S2 为主机发送模式、飞利浦标准、16 位数据、44.1kHz 采样率。


void I2S_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2S_InitTypeDef  I2S_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    /* PB12: I2S_WS, PB13: I2S_CK, PB15: I2S_SD → 复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* I2S2: 主机发送 / 飞利浦标准 / 16位数据 / 44.1kHz */
    I2S_InitStructure.I2S_Mode          = I2S_Mode_MasterTx;
    I2S_InitStructure.I2S_Standard      = I2S_Standard_Phillips;
    I2S_InitStructure.I2S_DataFormat    = I2S_DataFormat_16b;
    I2S_InitStructure.I2S_MCLKOutput    = I2S_MCLKOutput_Disable;
    I2S_InitStructure.I2S_AudioFreq     = I2S_AudioFreq_44k;
    I2S_InitStructure.I2S_CPOL          = I2S_CPOL_Low;
    I2S_Init(SPI2, &I2S_InitStructure);
    I2S_Cmd(SPI2, ENABLE);
}
  

I2S 配置要点:模式(主机发送 I2S_Mode_MasterTx)、标准(飞利浦 I2S_Standard_Phillips)、数据格式(16 位 I2S_DataFormat_16b)、采样率(44.1kHz I2S_AudioFreq_44k)。I2S 接口与 SPI2 共用部分硬件资源,但通过 I2S_Init/I2S_Cmd 函数独立配置。

如果你想自定义

  • 改采样率 → 修改 I2S_AudioFreq,如 I2S_AudioFreq_48kI2S_AudioFreq_8k
  • 改数据格式 → 选择 16位/24位/32位,需与外部 DAC 匹配
  • 改 I2S 标准 → 飞利浦/MSB对齐/LSB对齐/PCM 短帧/长帧
  • 使用 DMA 发送 → 配置 DMA 自动搬运音频数据,降低 CPU 负载

步骤2:音频数据发送

函数:main() — 64 点 16 位正弦波查表,循环通过 I2S 发送音频数据。


/* 1kHz 正弦波音频数据(16位,44.1kHz采样率) */
uint16_t AudioBuffer[64] = {
    0x0000, 0x187E, 0x30FB, 0x471C, 0x5A82, 0x6A6D, 0x7641, 0x7D8A,
    0x7FFF, 0x7D8A, 0x7641, 0x6A6D, 0x5A82, 0x471C, 0x30FB, 0x187E,
    0x0000, 0xE782, 0xCF05, 0xB8E4, 0xA57E, 0x9593, 0x89BF, 0x8276,
    0x8001, 0x8276, 0x89BF, 0x9593, 0xA57E, 0xB8E4, 0xCF05, 0xE782,
    0x0000, 0x187E, 0x30FB, 0x471C, 0x5A82, 0x6A6D, 0x7641, 0x7D8A,
    0x7FFF, 0x7D8A, 0x7641, 0x6A6D, 0x5A82, 0x471C, 0x30FB, 0x187E,
    0x0000, 0xE782, 0xCF05, 0xB8E4, 0xA57E, 0x9593, 0x89BF, 0x8276,
    0x8001, 0x8276, 0x89BF, 0x9593, 0xA57E, 0xB8E4, 0xCF05, 0xE782
};

int main(void)
{
    RCC_ClocksTypeDef clocks;
    uint8_t index = 0;

    delay_init();
    UART_Configuration(115200);
    RCC_GetClocksFreq(&clocks);
    printf("I2S Audio Test.\n");

    I2S_Configuration();

    while (1)
    {
        /* 循环发送音频数据 */
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI2, AudioBuffer[index]);
        index = (index + 1) % 64;
    }
}
  

音频数据为 1kHz 正弦波的 64 点采样(16 位),采样率 44.1kHz。发送时等待 TXE(发送缓冲区空)标志置位后写入新数据。64 个采样点覆盖约 1.45ms(64/44100),循环发送产生连续的 1kHz 正弦波音频。

编译与下载

Keil MDK 中打开 I2S.uvprojxF7 编译,确认 0 Error(s)。连接 DEBUG USB 口到 PC,F8 下载。

运行验证

下载固件并按 RESET 后,I2S2 的 PB12(WS)、PB13(CK)、PB15(SD) 引脚输出音频数据信号。使用逻辑分析仪可观察到 WS、CK 和 SD 的波形。如连接了外部 I2S DAC 和扬声器/耳机,可听到 1kHz 正弦波音频。串口打印 "I2S Audio Test." 提示信息。

I2S逻辑分析仪波形
逻辑分析仪捕获 I2S 信号:WS(字选择)、CK(位时钟)、SD(串行数据)波形

常见问题

Q: I2S 无数据输出

确认 I2S_Cmd(SPI2, ENABLE) 已调用。检查 GPIO 引脚配置为复用推挽输出(AF_PP)。确认 SPI2/I2S 时钟已使能。用示波器检查 CK 引脚是否有时钟信号。

Q: 音频杂音或失真

检查采样率和数据格式是否与外部 DAC 匹配。确保音频查表数据正确覆盖完整周期。考虑使用 DMA 发送以避免数据中断间隙。

Q: I2S 和 SPI 是否冲突

I2S2 与 SPI2 共用部分硬件,同一时刻只能使用其中一种。通过 I2S_Init 配置为 I2S 模式后,SPI 功能不可用。如需同时使用 SPI 和 I2S,需使用不同的 SPI 实例。

总结

本文基于 W55MH32L 的 I2S2 接口实现了音频数据传输:

  • I2S2 主机发送模式:飞利浦标准,16 位数据,44.1kHz 采样率
  • 三线接口:PB12(WS 字选择)、PB13(CK 位时钟)、PB15(SD 串行数据)
  • 64 点 16 位正弦波查表循环发送,产生 1kHz 音频信号
  • W55MH32L 内置 1 个 I2S 接口,支持 8kHz~192kHz 采样率,可连接外部 I2S DAC 或音频编解码器

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家