WT588F/E系列语音芯片驱动程序&注意事项
- 一、简介
- 二、硬件连接
- 三、驱动层
- 1、配置GPIO
- 2、发送数据函数
- 3、播放语音
- 4、是否在播放语音
- 5、语音&命令码地址表
- 四、应用层
- 1、连码播放demo
- 五、其他
- 1、在线下载器更换语音
开的这个专栏会一直记录自己用过的驱动,有触摸芯片,RFID芯片,语音芯片,显示屏驱动,ADC,各种通讯模块等等,感兴趣的可以一起交流学习
源码查询该文章
专栏地址
一、简介
WT588F区别于传统OTP(单次烧写)的语音芯片,可以通过配套的下载器在线更换芯片内部语音内容。支持6-32KHz的WAV文件,工作电压2.0-5.5V。
语音芯片的时长及采样率自己根据使用情况联系芯片厂家。
二、硬件连接
本次项目MCU用的是复旦微的FM33G026,内核是Cortex-M0。
芯片IO口,默认内部1M下拉。用的是两线串口控制的模式,两线串口控制方式具有较好的抗干扰能力。
引脚:
CLK:时钟信号;MCU_OUT
DATA:发送数据信号;MCU_OUT
BUSY:时钟信号,默认播放语音时忙脚低电平;MCU_IN
三、驱动层
在头文件中宏定义,用的FM33G026的库供参考,其他MCU配置管脚大同小异。
/* data */
#define WT588F_DATA_PORT GPIOE
#define WT588F_DATA_PIN GPIO_Pin_2
#define WT588F_DATA_OUT_CFG() (OutputIO(WT588F_DATA_PORT,WT588F_DATA_PIN,OUT_PUSHPULL))
#define WT588F_DATA_OUT_H() (GPIO_SetBits(WT588F_DATA_PORT,WT588F_DATA_PIN))
#define WT588F_DATA_OUT_L() (GPIO_ResetBits(WT588F_DATA_PORT,WT588F_DATA_PIN))
/* busy */
#define WT588F_BUSY_PORT GPIOB
#define WT588F_BUSY_PIN GPIO_Pin_14
#define WT588F_BUSY_IPU_CFG() (InputtIO(WT588F_BUSY_PORT,WT588F_BUSY_PIN,IN_NORMAL))
#define WT588F_BUSY_READIN() (GPIO_ReadInputDataBit(WT588F_BUSY_PORT,WT588F_BUSY_PIN))
/* clk */
#define WT588F_CLK_PORT GPIOB
#define WT588F_CLK_PIN GPIO_Pin_15
#define WT588F_CLK_OUT_CFG() (OutputIO(WT588F_CLK_PORT,WT588F_CLK_PIN,OUT_PUSHPULL))
#define WT588F_CLK_OUT_H() (GPIO_SetBits(WT588F_CLK_PORT,WT588F_CLK_PIN))
#define WT588F_CLK_OUT_L() (GPIO_ResetBits(WT588F_CLK_PORT,WT588F_CLK_PIN))
初始化WT588F,注意:上电初始化要200ms
/********************************************************
* @brief void WT588F_Init()
* 初始化
* @param
* @arg:
* @return
* none
* @note
******************************************************/
void WT588F_Init()
{
WT588F_DATA_OUT_CFG();
WT588F_BUSY_IPU_CFG();
WT588F_CLK_OUT_CFG();
delay_ms(200);
WT588F_DATA_OUT_H();
WT588F_CLK_OUT_L();
}
tips:
1、 WT588F 语音芯片上电初始化时间大概 200ms,初始化期间无法响应指令。
2、一条指令最短时间为6.6ms(5ms+0.2ms*8=6.6ms)。
3、芯片 IO 口,默认内部1M下拉。因此在做低功耗休眠时,播放结束后可以将 CLK 和DATA 拉低,防止倒灌电流;若 CLK 拉低,发指令前需将 CLK 拉高大于 3ms 后再发送指令。
/********************************************************
* @brief static void send_data()
* 发送数据
* @param
* @arg:
* @return
* none
* @note CLK高位数据有效
******************************************************/
static void send_data(u8 data)
{
u8 i;
WT588F_CLK_OUT_L();
WT588F_DATA_OUT_H();
delay_ms(5); //发送一个字节数据前,时钟信号CLK拉低5ms
delay_us(300); //时钟周期
for(i=0;i<8;i++)
{
if(data & 0x01)
{
WT588F_DATA_OUT_H();
}
else
{
WT588F_DATA_OUT_L();
}
data >>= 1;
WT588F_CLK_OUT_H(); //在时钟的上升沿接收数据
delay_us(300);
WT588F_CLK_OUT_L();
delay_us(300);
}
WT588F_DATA_OUT_H();
WT588F_CLK_OUT_H();
}
tips
1、低功耗休眠若 CLK 拉低,发指令前需将 CLK 拉高大于 3ms 后再发送指令。
/********************************************************
* @brief void WT588F_Play(u8 addr)
* 播放对应地址语音
* @param
* @arg:
* @return
* none
* @note
******************************************************/
void WT588F_Play(u8 addr)
{
WT588F_CLK_OUT_H();
delay_ms(3); //做低功耗时CLK拉低,发指令前需将CLK拉高大于3ms后再发送指令。
send_data(addr);
}
/********************************************************
* @brief u8 WT588F_isBusy()
* 是否在播放语音
* @param
* @arg:
* @return
* busy:低电平
* @note
******************************************************/
u8 WT588F_isBusy()
{
if(!WT588F_BUSY_READIN())
{
return 1;
}
return 0;
}
四、应用层
tips
1、连码播放时 F3 指令和地址之间需留 2ms 的间隔时间,可参考下图。
/********************************************************
* @brief void WT588F_ListPlay()
* 连码播放
* @param
* @arg:
* @return
* none
* @note
******************************************************/
void WT588F_ListPlay()
{
WT588F_CLK_OUT_H();
delay_ms(3); //做低功耗时CLK拉低,发指令前需将CLK拉高大于3ms后再发送指令。
send_data(LOOP_EXTI); //F3
delay_ms(2);
send_data(ZERO); //01
delay_ms(2);
send_data(LOOP_EXTI); //F3
delay_ms(2);
send_data(ONE); //02
delay_ms(2);
send_data(LOOP_EXTI); //F3
delay_ms(2);
send_data(TWO); //03
delay_ms(2);
send_data(LOOP_EXTI); //F3
delay_ms(2);
send_data(THREE); //04
}
五、其他
如有用到下载器按下图连接
结语
该芯片比较简单,想不到太多展开,也有一线串口的使用方法,更加简单,有问题直接提问。
源码查询该文章