一、产品市场
随着家用电子设备的普及,各种智能化设备进入人们生活中,如洗地机、扫地机、共享单车、智能门锁、智能桌游、智能网关等,客户想方便快捷的更换替换产品的音频文件。针对部分客户自主更换语音内容的需求,定制化的语音方案,唯创知音WT2003H0系列语音芯片远程更换语音bin的功能无疑是一个很好的选择。
本文以WT2003H0系列语音芯片为例,与唯创知音其余的WT2003H系列串口更新语音bin(bin文件包含运行程序+语音)不同,唯创知音新推出的这款芯片功能,为直接替换语音bin文件,由MP3、WAV格式合成,不包含运行程序。
二、产品应用框图
语音更换
三、芯片功能特点
(1)工作电压:2.0-5.2V;
(2)内置0.5W D类功放;
(3)可支持控制模式:一线、两线单双字节、UART串口控制、按键控制、SPI控制;
(4)默认通信波特率9600,用户可通过波特率切换指令,自由切换波特率设置,最高可达1Mbps;
(5)支持语音高品质音频格式,支持MP3和WAV格式,(音频码率支持8kbps~320kbps)声音优美;
(6)包含所有标准控制指令的同时,更设置有串口更新音频指令,用户可自由选择进入低功耗模式,功耗
(7)高精度ADC和DAC;
(8)大功率IO驱动能力,最高可直接驱动64mA;
(9)制作语音bin文件,搭配客户MCU通过串口自由更换语音;
(10)用户可提前预留出语音bin文件下载更新口pin点,方便后续更换音频+程序;
四、语音更新操作流程图
五、相关控制指令预览介绍
六、设计应用案例
1) 器件选型
2)设计原理图
A.串口更新语音说明
1.串口通信电平为3.3V TTL电平。
2.MCU TX与语音芯片RX之间需反接一个二极管,负极一端靠近MCU TX,目的是为了防止串口电平导致芯片未正常复位重启。
3.下载过程中,确保语音IC的TX和RX脚不会受到干扰,建议断开MCU的TX/RX与语音IC之间的连接或MCU不发送数据给到语音芯片。
4.离线下载时,确保烧写器中已烧录合成的bin文件,此时方可进行烧录,语音bin文件不要超过flash的容量,否则导致下载失败。
注:此款功能目前可支持MCU通过串口更新语音,后续如客户需替换整个语音及功能程序,可搭配本司下载器进行替换,因此建议提前预留出语音bin烧录口,如上图所示
B. 外挂Flash及功放电路说明
七、程序范例
/*本例程主要介绍,从文件系统读取一个文件,并将文件数据传输到WT2003HX的过程,客户也可通过其他方式
获取文件数据,进而实现数据传输*/
#define SECTOR_SIZE 512 //本例程按照最大512字节一包数据传输
extern u8 decext_buf[SECTOR_SIZE]; //缓存文件数据的BUFF
extern u8 uart_rx_buffer[SECTOR_SIZE]; //缓存串口接收数据的BUFF
u32 exspi_msc_fsize = 0; //文件大小
u32 exspi_msc_len = 0; //文件长度计数
void wt2003h_updata_file()
{
u16 delay_wait = 0;
u8 sum; //数据校验和
uart0_put_char(0x7e); //停止播放播放命令
uart0_put_char(0x03);
uart0_put_char(0xAB);
uart0_put_char(0xAE);
uart0_put_char(0xef);
delay_5ms(10);
uart0_put_char(0x7e); //创建文件名wt2003h.mp3命令
uart0_put_char(0x0B);
uart0_put_char(0xF1);
uart0_put_char(0x77);
uart0_put_char(0x74);
uart0_put_char(0x32);
uart0_put_char(0x30);
uart0_put_char(0x30);
uart0_put_char(0x33);
uart0_put_char(0x68);
uart0_put_char(0x2e);
uart0_put_char(0x6d);
uart0_put_char(0X70);
uart0_put_char(0x33);
uart0_put_char(0X55);
uart0_put_char(0Xef);
delay_5ms(40);
exspi_msc_len = 0;
fs_open_num(1); //文件系统接口,打开需要传输的文件
fs_lseek(0, 0);
exspi_msc_fsize = fs_get_file_size(); //文件系统接口,获取需要传输的文件大小
exspi_msc_fsize = ((exspi_msc_fsize + 511)/SECTOR_SIZE)*SECTOR_SIZE;//转换文件大小单位为一个SECTOR大小
sum = 0x05 + (u8)(exspi_msc_fsize>>24)+(u8)(exspi_msc_fsize>>16)+(u8)(exspi_msc_fsize>>8)+(u8)(exspi_msc_fsize);
uart0_put_char(0x7e); //发送文件信息命令
uart0_put_char(0x08);
uart0_put_char(0xfd);
uart0_put_char(0x00);
uart0_put_char(exspi_msc_fsize>>24);
uart0_put_char(exspi_msc_fsize>>16);
uart0_put_char(exspi_msc_fsize>>8);
uart0_put_char(exspi_msc_fsize);
uart0_put_char(sum);
uart0_put_char(0xef);
delay_5ms(20);
UINT len;
while(FR_OK == fs_read(decext_buf,SECTOR_SIZE,&len)) //文件系统接口,按顺序一包包读取需要传输的文件数据,记住,实际一包数据不满SECTOR_SIZE,需要补0处理
{
//发送文件数据命令
uart0_put_char(0x7e);
uart0_put_char(0x00);
uart0_put_char(0xf0);
uart0_put_char(0x02);
uart0_put_char(0x00);
sum = 0xf2;
for(u16 i = 0;i<512;i++)
{
uart0_put_char(decext_buf[i]);
sum+=decext_buf[i];
}
uart0_put_char(sum);
uart0_put_char(0xef);
delay_wait = 0;
uart_rx_cnt=0;
uart_rx_buffer[0] = 0xff;
uart_rx_buffer[1] = 0xff;
uart_rx_buffer[2] = 0xff;
uart_rx_buffer[3] = 0xff;
delay_5ms(20);
while(1)
{
/* 等待中断接收数据缓存到uart_rx_buffer 客户也可通过查询方式获取返回码数据*/
delay_us(100);
if((uart_rx_buffer[2] == 0xf0)&&(uart_rx_buffer[3] == 0x00))
{
delay_5ms(2);
break; //下载一包数据返回成功
}
if((uart_rx_buffer[1] == 0x08)&&(uart_rx_buffer[2] == 0xfd)&&(uart_rx_buffer[3] == 0x00))
{
WDT_EN();
WDT_CLR();
return true; //下载文件返回成功
}
delay_wait++;
if(delay_wait >= 20000) //设置2S超时
{
delay_wait = 0;
exspi_msc_len = 0;
WDT_EN();
WDT_CLR();
return false; //下载数据无响应,返回错误
}
}
exspi_msc_len++;
if(exspi_msc_len*SECTOR_SIZE>=exspi_msc_fsize)
{
return false; //文件读取完毕,未收到成功返回码,下载返回错误
}
}
}
相关文章