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

syn6288语音模块python驱动 语音驱动芯片_单片机

三、驱动层

在头文件中宏定义,用的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();
}

syn6288语音模块python驱动 语音驱动芯片_syn6288语音模块python驱动_02


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;
}

syn6288语音模块python驱动 语音驱动芯片_单片机_03

syn6288语音模块python驱动 语音驱动芯片_syn6288语音模块python驱动_04

四、应用层

tips

1、连码播放时 F3 指令和地址之间需留 2ms 的间隔时间,可参考下图。

syn6288语音模块python驱动 语音驱动芯片_驱动程序_05

/********************************************************
 * @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
}

五、其他

如有用到下载器按下图连接

syn6288语音模块python驱动 语音驱动芯片_syn6288语音模块python驱动_06




结语

该芯片比较简单,想不到太多展开,也有一线串口的使用方法,更加简单,有问题直接提问。

源码查询该文章