去年接了个活。STM32 做主控,外壳里要能连手机放语音、播提示音。我一开始打算自己上蓝牙协议栈,搞了两周,广播都立不起来。后来换了思路,主控只管业务,蓝牙音频那摊子丢给一颗 WT2605C,三天出了样机。
下面把我这套 STM32 配 WT2605C 的接法捋一遍,省得你踩我踩过的坑。
说真的,STM32 很强,但它不是为啃蓝牙音频协议栈生的。你让它跑业务逻辑、扫按键、刷屏、收传感器,已经够忙了。蓝牙配网、A2DP 解码、功放驱动这些,硬塞进去就是给自己找不痛快。
WT2605C是WT2605系列里的蓝牙音频芯片,它把这堆活全收了。STM32 和它对上串口,发几个字节它就明白要播哪段、音量多大。主控干干净净,蓝牙那层被封装到对面去了。
我能用上的就这几样。双模蓝牙 5.0,经典音频 BR/EDR 和 BLE 都带。串口是标准 UART,115200 波特,3.3V 的 TTL 电平,跟 STM32 直接对插。存储也省心,SPI Flash、TF 卡、U 盘三种都能挂,FAT 格式,热插拔。那个 USB 口顺手干了四件事,挂 U 盘播、当读卡器拷文件、升固件,还能当免驱声卡。
硬件怎么连。WT2605C 的 UART 和 STM32 的 USART 交叉接,STM32 的 TX 接 WT2605C 的 RX,反过来一样。两边共地,电压都 3.3V,别拿 5V 去怼,会冒烟。晶振用 26M、11pF 负载、误差 ±10ppm,随便找颗料可能就不稳,这点后面专门说。
上电之后 WT2605C 会自己吐一帧返回码,7E 04 01 00 05 EF,串口助手开着就能看到。看到这串,说明通信通了,心里就有底了。
想让它放歌,STM32 发一条索引播放指令过去。我用 Flash 索引播放举例子,命令码是 A0,帧长 04,后面跟曲目序号。校验位别手填,让程序把前面字节累加取低八位算出来。
下面这段是 STM32 上跑的 HAL 代码。
uint8_t wt_sum(uint8_t *buf, uint8_t len) {
uint8_t s = 0;
for (uint8_t i = 0; i < len; i++) s += buf[i];
return s;
}
void wt_play(uint8_t index) {
uint8_t f[7];
f[0] = 0x7E;
f[1] = 0x04;
f[2] = 0xA0;
f[3] = 0x00;
f[4] = index;
f[5] = wt_sum(&f[1], 4);
f[6] = 0xEF;
HAL_UART_Transmit(&huart2, f, 7, HAL_MAX_DELAY);
}
调通以后你会发现,这方案舒服的地方在 STM32 不用碰蓝牙协议栈一行,参数漂不漂亮反倒次要。业务代码里调一个 wt_play(1),第一首就放出来了,干净。
玩熟了还能整点花的。BLE 那边留了数传通道,UUID 是 00010203 开头那串,手机 APP 写数据进去,WT2605C 从串口吐给 STM32,反过来 STM32 发的数据也能推到手机。做带蓝牙的语音播报器、玩具对讲,这套透传直接能用。按键和红外控制能定制,固件还能用 U 盘升级,画板时把 USB 留出来就行。
两个坑我得专门点出来。声卡模式跟蓝牙播放是互斥的,声道被占着,用声卡就得先断开蓝牙,不然蓝牙那边没声音。晶振也得用对,26M、11pF、±10ppm,我第一版随便焊了颗晶振,连上手机断断续续,换了指定料才稳。
命令码和曲目映射这块,我建议直接翻 V1.08 手册第五章,别凭记忆填。不同存储区的索引规则不一样,踩过一次就知道了。
要是你也在搞 STM32 配蓝牙音频,资料包和开发板我这能领。想动手的直接要一份 V1.08 手册对着看,群里一大帮人也在玩,遇到问题吼一声基本都有人回。
32
