I2S — 双板主机轮询收发 I2S_TwoBoard_CommunicationMaster_Polling
固件库: PY32F403_Firmware V1.4.5
芯片: PY32F403(Cortex-M4)⭐ F403 特色外设
源文件:PY32F403-STK/Example/I2S/I2S_TwoBoard_CommunicationMaster_Polling/Src/main.c
核心外设: SPI2 复用为 I2S(PB12=WS / PB13=CK / PB15=SD)
1. 功能简介(大白话)
I2S 是数字音频专用的总线。本例把 PY32F403 的 SPI2 外设切换成 I2S 模式,当作主机(Master),和另一块板(从机 Slave)对传音频样本:
- 主机先以
I2S_MODE_MASTER_TX把 16 个 16 位数据{1,2,...,16}发给从机; - 从机收到后回发同样数据;
- 主机再切换成
I2S_MODE_MASTER_RX把从机回发的数据收回来; - 比较「发出去的是否等于收回来的」:一致点亮 LED,不一致 LED 闪烁。
虽然是「数据回环」式验证,但流程与真实音频链路完全一致:MCU 用 I2S 把 PCM 样本送给 DAC 播出来,或从 ADC/麦克风收样本。
2. 硬件准备
| 物品 | 数量 | 说明 |
|---|---|---|
| PY32F403-STK 开发板 | 2 | 一块烧主机(Master_Polling),一块烧从机(Slave_Polling) |
| USB 线 | 2 | 供电 + 下载 |
接线(主从一一对应,务必共地):
|
|
操作:
- 主机烧
I2S_TwoBoard_CommunicationMaster_Polling,从机烧I2S_TwoBoard_CommunicationSlave_Polling; - 主从都上电并按复位键;
- 先按从机用户键让从机先跑,再按主机用户键启动主机;
- 主从 LED 由灭变常亮 = 收发成功;任一 LED 闪烁 = 失败。
I2S 是同步总线,主机提供 CK 和 WS,从机跟随。所以 CK/WS 是主机→从机单向,SD 双向传数据。
3. 完整代码(带中文注释)
|
|
附:MSP 里的引脚配置(HAL_I2S_Init 自动调用)
|
|
4. 代码分段讲解
4.1 为什么用 SPI2 当 I2S?
PY32F403 的 I2S 功能复用在 SPI2 这个外设上(硬件层面共享)。所以代码里 Instance = SPI2,但调用的是 HAL_I2S_* 函数——HAL 会根据你选的 I2S_* 模式把 SPI 模块切到 I2S 工作方式,引脚走 I2S 的 AF14 复用。
4.2 采样率与时钟关系
I2S_AUDIOFREQ_8K 设定目标采样率 8kHz。HAL 内部会用 SPI2(APB1=8MHz)的时钟去分频,产生:
- WS 频率 ≈ 8kHz(每 8k 次采样切换一次左右声道);
- CK 频率 = 8k × 16bit × 2声道 = 256kHz。
想换 44.1k/48k 音乐采样率,把 AudioFreq 改掉即可(前提是主时钟能分频得到,必要时打开 MCLK 给 CODEC 作基准)。
4.3 主机先发后收:同一句柄切 Mode
同一 I2sHandle,先 I2S_MODE_MASTER_TX 发完,再 I2S_MODE_MASTER_RX 收,重新 HAL_I2S_Init 即可切换方向。真实音频链路里方向通常固定(DAC 端只发、ADC 端只收),本例为演示才来回切。
4.4 标准格式必须主从一致
I2S_STANDARD_PHILIPS + I2S_CPOL_HIGH 是从机示例默认的格式。只要主从任何一方格式不同(如改成 MSB 对齐),数据就会错位。这是接 CODEC 时最常踩的坑。
4.5 轮询的局限
HAL_I2S_Transmit/Receive 会阻塞到完成或超时(5s)。教学够用,但连续音频流不能这么干——要用 *_DMA 版把样本流持续搬进/出缓冲。这正是 I2S_..._DMA 示例的用途。
5. 实验现象
- 正确接线、先跑从机再按主机键后:
- 主机 LED 常亮 = 收发校验成功(收到
{1..16}); - 任一板 LED 闪烁 = 失败(查接线、共地、主从格式是否一致)。
- 主机 LED 常亮 = 收发校验成功(收到
- 若用逻辑分析仪抓 CK/WS/SD,可见 WS 以 8kHz 翻转、SD 上逐位送出样本。
6. 常见问题
| 现象 | 原因 | 解决 |
|---|---|---|
| LED 一直闪(失败) | 没共地 / 线序错 / 从机没先跑 | 接好 GND,CK/WS 主机→从机,SD 交叉;先按从机键 |
| 收到全 0 或错乱 | 主从 Standard/CPOL 不一致 | 双方都用 PHILIPS + CPOL_HIGH |
| 音频有杂音/采样率偏 | 系统时钟与 AudioFreq 不匹配 | 确认主时钟;必要时开 MCLK 输出 |
| 想连续播放音乐 | 轮询占 CPU | 改用 I2S_..._DMA + 双缓冲 |
| 找不到 I2S 引脚 | 误用 SPI 引脚 | I2S2 = PB12/13/15(AF14),不是普通 SPI2 MOSI/MISO |
| 只有一路声道 | 只发了单声道 | I2S 默认立体声;单声道数据需按格式填充 |
7. 小结
- I2S 是音频专用同步总线,由 SPI2 复用实现(引脚 PB12/13/15,AF14);
- 配置四要素:标准格式、位宽、采样率、主/从模式,且主从必须完全一致;
- 例程用 8kHz、16 位,主机先
Master_TX发 16 样本、再Master_RX收回校验; - 轮询简单但占 CPU;真实音频流用 DMA/IT 版(
I2S_..._DMA)。
8. 拓展应用(学了能做什么项目)
- 播放提示音/WAV:I2S DAC(MAX98357A)接 SD/CK/WS,DMA 送 PCM 数据;
- 录音/声控:I2S MEMS 麦克风做采集,配合 FFT 做频谱;
- 双向音频:CODEC(WM8978)接 I2S,做通话/采集;
- 不间断音频流:
I2S_..._DMA+ 双缓冲,从 Flash/SD 卡连续取数据; - 数字功放/语音识别前端:I2S 是标准接口,方便对接各类音频芯片。
返回:I2S 音频总线总览