小封装 MCU 做产品时,IO 永远是稀缺资源。按键、传感器、指示灯把引脚占得差不多了,老板还要加个语音提示,一算 IO 余量,往往只剩一两根。这时候如果语音芯片还要占 CLK 加 DATA 两根串口线,方案可能直接卡死。WT588F40B-16S 的一线串口模式,恰好能把控制压到一根 DATA 线,MCU 一个普通 IO 就能播、停、循环全搞定。
先说清楚一线串口是怎么工作的。在固定一线或兼容一线两线配置下,MCU 只通过 DATA 线给芯片发数据,CLK 脚固定电平即可,不需要参与通信。发送的是 16 位控制字,内容可以是播放某段地址、调节音量、循环、停止、连码等。也就是说,控制层面的硬件成本就是一个 IO 口,外加可选的 BUSY 状态脚用来判断芯片是否在播。
接线很简单。一线串口 PWM 输出模式的应用电路里,芯片的 DATA 接 MCU 任意一个 GPIO,喇叭直接挂在 PWM 输出脚上,不需要外置功放。BUSY 脚是可选的,如果你只关心触发不关心状态,这脚可以省掉,真正只留一根 DATA 线。低功耗场景记得 DATA 脚内部有 1M 下拉,播放结束把它拉低能防止 IO 倒灌。
发码才是关键,这里把时序讲明白。每次发指令,先把 DATA 拉低 5 毫秒(允许 5 到 20 毫秒),然后发送 16 位数据。字节顺序是先发高字节、再发低字节,每个字节内部先发低位、再发高位。每一位用高电平和低电平的脉宽比例来代表 0 或 1,而且规定高电平必须排在前面、低电平在后面。具体的位宽比例以规格书时序图为准,常见的一线串口约定是每位约 800 微秒,发 0 时高 200 低 600,发 1 时高 600 低 200,写代码时照这个节奏拉高拉低即可。
常用的命令码下面这张表直接抄。
| 命令 | 命令码 | 说明 |
|---|---|---|
| 播放指定段 | 段地址(如 0001H) | 播放对应语音地址内容 |
| 音量调节 | FFE0H 最小,FFEFH 最大 | 16 级,播放或待机都可发 |
| 循环播放 | FFF1H | 循环当前地址,退出发 FFFE 或再发一次 FFF1 |
| 停止播放 | FFFEH | 立即停止当前播放 |
| 连码播放 | FFF3H+地址A+FFF3H+地址B | 依次播 A、B、C,最多 40 段 |
命令码以规格书与上位机工具为准,不同版本可能有差异。
几个实战里容易踩的坑要记住。第一,同一条指令里两个字节之间间隔要小于 4 毫秒,建议 2 毫秒,拖太长芯片会认为指令结束。第二,连码时相邻两段之间间隔要小于 20 毫秒。第三,连码最多 40 段,超了发不进去。第四,上电默认最大音量 FFEFH,而且上电后如果一次语音都没播过,不要直接发循环类指令,先触发一次播放更稳妥。第五,连码指令全部发完后,芯片大约等 100 毫秒才开始播,这段代码里别急着发下一条。
给你一段发码思路,不依赖具体平台。先拉低 DATA 5 毫秒,取命令码,先送高 8 位再送低 8 位,每字节从 bit0 到 bit7,发 0 就高电平 T1、低电平 T2,发 1 就高电平 T3、低电平 T4,始终高在前,字节间留 2 毫秒,发完释放 DATA,让芯片内部下拉把它拉稳,1 秒后自动休眠。照这个框架填位宽,就能用任意 MCU 的一个 IO 口驱动语音播报。
回到开头那个痛点。当 IO 只剩一两根,语音芯片还想要两线串口,方案基本就废了。WT588F40B-16S 的一线串口把控制压到一根线,再配合 PWM 直驱喇叭省掉功放、停播自动休眠省掉软件管理,整体外围非常干净。对 IO 紧张的小封装产品来说,这根线省下的,不只是引脚,还有一整套 BOM 和调试时间。
106
