本篇总结
使用 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 用于输出调试信息。
| 引脚 | 功能 | 方向 | 模式 |
| PB12 | I2S2_WS(字选择) | 开发板 → DAC | 复用推挽输出 (AF_PP) |
| PB13 | I2S2_CK(位时钟) | 开发板 → DAC | 复用推挽输出 (AF_PP) |
| PB15 | I2S2_SD(数据线) | 开发板 → DAC | 复用推挽输出 (AF_PP) |
| PA9 | USART1_TX | 开发板 → PC | 复用推挽输出 (AF_PP) |
| PA10 | USART1_RX | PC → 开发板 | 浮空输入 (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_48k、I2S_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.uvprojx,F7 编译,确认 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 信号: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 或音频编解码器