主题内容教学目的/扩展视频
MP3播放芯片电路原理,跳线设置,手册分析,驱动程序与调用。了解指令表。

师从洋桃电子,杜洋老师



回顾上期🔍STM32 MP3播放原理与应用开发—MY1690X-16S语音芯片全解析(上) | 零基础入门STM32第六十八步

回顾上期🔍STM32 MP3播放原理与应用开发—与MY1690语音芯片交互全解析(中) | 零基础入门STM32第六十九步


(图1:开发板与MP3芯片部分连接示意图)

一、系统架构与通信流程

1.1 硬件连接示意图

音频输出
用户输入
主控系统
USART3双向通信
GPIO中断
编码器接口
DAC立体声输出
BUSY状态反馈
PAM8403功放
3W扬声器
4x触摸按键
旋转编码器
MY1690语音模块
STM32F103C8T6\n核心板

1.2 指令通信流程图

用户操作 STM32 MY1690 扬声器 OLED 触发按键/编码器 发送指令帧(0x7E起始) 执行播放操作 返回状态码(STOP/OK) 更新播放状态显示 用户操作 STM32 MY1690 扬声器 OLED

二、核心代码解析

2.1 指令动态生成模块(MY1690.c)

2.1.1 指令帧结构解析
| 起始码 | 长度 | 操作码 | 参数 | 校验码 | 结束码 |
|--------|------|--------|------|--------|--------|
| 0x7E   | N    | CMD    | DATA | XOR    | 0xEF   |
2.1.2 校验码生成算法
// 以16位参数指令为例
void MY1690_CMD3(u8 a, u16 b){
    u8 c = b >> 8;    // 参数高8位
    u8 d = b & 0xFF;  // 参数低8位
    u8 i = 0x05 ^ a ^ c ^ d; // 异或校验
    // 发送指令帧...
}
2.1.3 典型指令实现
// 设置音量(0x31指令)
void Set_Volume(u8 vol){
    MY1690_CMD2(0x31, vol); // 操作码+8位参数
    // 等效指令:7E 04 31 1E 2B EF(设置音量30级)
}

2.2 主控逻辑(main.c)

2.2.1 按键处理机制
if(KEY_A按下){
    MY1690_PREV(); // 发送上一曲指令
    OLED显示"-- PREV --"
}
if(KEY_D按下){
    MY1690_CMD3(0x41,0x04); // 播放0004号文件
}
2.2.2 编码器集成
u8 enc_val = ENCODER_READ();
if(enc_val==1) MY1690_VUP();  // 右转音量+
if(enc_val==2) MY1690_VDOWN();// 左转音量-
if(enc_val==3) Toggle_Play(); // 播放/暂停切换

2.3 串口接收处理(usart.c)

2.3.1 中断配置
void USART3_Init(u32 BaudRate){
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    // 优先级配置...
}
2.3.2 状态机实现
void USART3_IRQHandler(void){
    u8 Res = USART_ReceiveData(USART3);
    if(Res == 'S') USART3_RX_STA = 1; // 检测到STOP
    if(Res == 'K') USART3_RX_STA = 2; // 检测到OK
}
2.3.3 主循环处理
if(USART3_RX_STA == 1){ // 播放结束
    OLED显示"-- STOP --"
    MP3_State = IDLE;
}

三、协议扩展应用

3.1 复合指令示例

// 播放指定文件夹曲目(02文件夹005号文件)
void Play_Folder_Song(u8 folder, u16 song){
    u16 param = (folder << 8) | song;
    MY1690_CMD3(0x42, param); // 0x42指令
}

3.2 智能播放队列

u16 playlist[] = {0x0001, 0x0003, 0x0005};
void Play_Sequence(){
    for(int i=0; i<3; i++){
        MY1690_CMD3(0x41, playlist[i]);
        while(USART3_RX_STA != 1); // 等待当前曲目结束
    }
}

四、调试与优化

4.1 常见问题排查表

现象可能原因解决方案
无音频输出功放未使能检查BUSY信号电平配置
指令无响应校验码计算错误使用逻辑分析仪抓包验证
播放卡顿指令发送间隔过短添加50ms延时
OLED显示异常数据竞争关中断操作显示缓冲区

4.2 性能优化建议

  1. DMA传输:改用DMA发送指令帧
  2. 双缓冲机制:分离指令发送与状态处理线程
  3. CRC校验:增强协议可靠性
  4. 指令队列:实现非阻塞式控制

五、扩展应用场景

5.1 智能家居中控

温湿度传感器
STM32
MY1690
语音播报
WiFi模块
手机APP

5.2 工业报警系统

触发条件响应动作
温度超过阈值循环播放高温警报
设备异常停机插播紧急停机通知
低电量警告播放"请更换电池"提示

通过深入理解指令协议和状态机设计,开发者可以构建高可靠性的语音交互系统。建议使用示波器观察指令时序,并配合Wireshark进行协议分析,以实现更精准的控制逻辑。


六、相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] MP3播放测试程序(含音乐文件)
[5] MY1690(MP3音乐播放芯片)数据手册


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨MP3语音播报程序,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-16)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐