基于MSP430的语音模块程序.docx
- 文档编号:9030061
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:17.71KB
基于MSP430的语音模块程序.docx
《基于MSP430的语音模块程序.docx》由会员分享,可在线阅读,更多相关《基于MSP430的语音模块程序.docx(18页珍藏版)》请在冰点文库上搜索。
基于MSP430的语音模块程序
#include"main.h"
uint8nLD_Mode=LD_MODE_IDLE;//用来记录当前是在进行ASR识别还是在播放MP3
unsignedcharucRegVal;
unsignedcharucHighInt;
unsignedcharucLowInt;
/*****************************************
函数功能;LD3320外部中断初始化P1_6
入口参数:
无
出口参数:
无
******************************************/
voidLD3320_EXTERINT_Init()
{
P1SEL&=~BIT6;
P1DIR&=~BIT6;
P1REN|=BIT6;
P1OUT|=BIT6;
P1IES|=BIT6;
P1IE|=BIT6;
P1IFG&=~BIT6;
}
/*****************************************
函数功能;LD3320控制端口初始化
入口参数:
无
出口参数:
无
******************************************/
voidLD3320_Port_Init()
{
P7OUT|=(BIT3+BIT4+BIT5+BIT6+BIT7);
P7REN|=(BIT3+BIT4+BIT5+BIT6+BIT7);
P7DIR|=(BIT3+BIT4+BIT5+BIT6+BIT7);
DIR_LD_CS_OUT;
DIR_LD_CLK_OUT;
DIR_LD_DI_OUT;
DIR_LD_DO_IN;
DIR_LD_RST_OUT;
DIR_LD_SPIS_OUT;
}
/*****************************************
函数功能;LD3320SPI通信测试
入口参数:
无
出口参数:
无
******************************************/
voidTest_Information()
{
//测试读写是否正常
LD_reset();
LD_ReadReg(0x06);
LD_WriteReg(0x35,0x33);
LD_WriteReg(0x1b,0x55);
LD_WriteReg(0xb3,0xaa);
nAsrRes=(LD_ReadReg(0x35));
nAsrRes=(LD_ReadReg(0x1b));
nAsrRes=(LD_ReadReg(0xb3));
//测试寄存器初始值是否正常
LD_reset();
nAsrRes=(LD_ReadReg(0x06));
nAsrRes=(LD_ReadReg(0x06));
nAsrRes=(LD_ReadReg(0x35));
nAsrRes=(LD_ReadReg(0xb3));
}
/*****************************************
函数功能;LD3320写函数
入口参数:
addressLD3320地址
dataoutLD3320数据
出口参数:
无
******************************************/
voidLD_WriteReg(unsignedcharaddress,unsignedchardataout)
{
unsignedchari=0;
unsignedcharcommand=0x04;
CLR_LD_CS;//打开片选
__delay_cycles(500);
///////////////////////写命令
for(i=0;i<8;i++)
{
if((command&0x80)>0)
SET_LD_DI;
else
CLR_LD_DI;
__delay_cycles(500);
CLR_LD_CLK;
command=(command<<1);
__delay_cycles(500);
SET_LD_CLK;
}
/////////////////////写地址
for(i=0;i<8;i++)
{
if((address&0x80)>0)
SET_LD_DI;
else
CLR_LD_DI;
__delay_cycles(500);
CLR_LD_CLK;
address=(address<<1);
__delay_cycles(500);
SET_LD_CLK;
}
//////////////////////写数据
for(i=0;i<8;i++)
{
if((dataout&0x80)>0)
SET_LD_DI;
else
CLR_LD_DI;
__delay_cycles(500);
CLR_LD_CLK;
dataout=(dataout<<1);
__delay_cycles(500);
SET_LD_CLK;
}
__delay_cycles(500);
SET_LD_CS;//关闭片选
}
/*****************************************
函数功能;LD3320读函数
入口参数:
addressLD3320地址
出口参数:
datainLD3320读出的收据
******************************************/
unsignedcharLD_ReadReg(unsignedcharaddress)
{
unsignedchari=0;
unsignedchardatain=0;
unsignedcharcommand=0x05;
CLR_LD_CS;//打开片选
__delay_cycles(2000);
///////////////////////写命令
for(i=0;i<8;i++)
{
if((command&0x80)>0)
SET_LD_DI;
else
CLR_LD_DI;
__delay_cycles(2000);
CLR_LD_CLK;
command=(command<<1);
__delay_cycles(2000);
SET_LD_CLK;
}
/////////////////////写地址
for(i=0;i<8;i++)
{
if((address&0x80)>0)
SET_LD_DI;
else
CLR_LD_DI;
__delay_cycles(2000);
CLR_LD_CLK;
address=(address<<1);
__delay_cycles(2000);
SET_LD_CLK;
__delay_cycles(2000);
}
/////////////////////读数据
DIR_LD_DO_IN;
for(i=0;i<8;i++)
{
datain=datain<<1;
CLR_LD_CLK;
if(LD_DO)datain|=0x01;
__delay_cycles(200);
SET_LD_CLK;
__delay_cycles(200);
}
__delay_cycles(2000);
SET_LD_CS;//关闭片选
returndatain;
}
/*****************************************
函数功能;LD3320复位函数
入口参数:
无
出口参数:
无
******************************************/
voidLD_reset()
{
SET_LD_RST;
__delay_cycles(200);
CLR_LD_RST;
__delay_cycles(200);
SET_LD_RST;
__delay_cycles(200);
CLR_LD_CS;
__delay_cycles(200);
SET_LD_CS;
__delay_cycles(200);
}
voidLD_Init_Common()
{
LD_ReadReg(0x06);
LD_WriteReg(0x17,0x35);
__delay_cycles(200);
LD_ReadReg(0x06);
LD_WriteReg(0x89,0x03);
__delay_cycles(200);
LD_WriteReg(0xCF,0x43);
__delay_cycles(200);
LD_WriteReg(0xCB,0x02);
/*PLLsetting*/
LD_WriteReg(0x11,LD_PLL_11);
LD_WriteReg(0x1E,0x00);
LD_WriteReg(0x19,LD_PLL_ASR_19);
LD_WriteReg(0x1B,LD_PLL_ASR_1B);
LD_WriteReg(0x1D,LD_PLL_ASR_1D);
__delay_cycles(2000);
LD_WriteReg(0xCD,0x04);
LD_WriteReg(0x17,0x4c);
__delay_cycles(200);
LD_WriteReg(0xB9,0x00);
LD_WriteReg(0xCF,0x4F);
LD_WriteReg(0x6F,0xFF);
}
voidLD_Init_ASR()
{
nLD_Mode=LD_MODE_ASR_RUN;
LD_Init_Common();
LD_WriteReg(0xBD,0x00);
LD_WriteReg(0x17,0x48);
__delay_cycles(200);
LD_WriteReg(0x3C,0x80);
LD_WriteReg(0x3E,0x07);
LD_WriteReg(0x38,0xff);
LD_WriteReg(0x3A,0x07);
LD_WriteReg(0x40,0);
LD_WriteReg(0x42,8);
LD_WriteReg(0x44,0);
LD_WriteReg(0x46,8);
__delay_cycles(200);
}
//Return1:
success.
unsignedcharLD_Check_ASRBusyFlag_b2()
{
unsignedcharj;
unsignedcharflag=0;
for(j=0;j<10;j++)
{
if(LD_ReadReg(0xb2)==0x21)
{
flag=1;
break;
}
__delay_cycles(200);
}
returnflag;
}
/************************************************************************
功能描述:
启动ASR
入口参数:
none
返回值:
none
其他说明:
none
**************************************************************************/
voidLD_AsrStart()
{
LD_Init_ASR();
}
//Return1:
success.
unsignedcharLD_AsrRun()
{
LD_WriteReg(0x35,MIC_VOL);
LD_WriteReg(0x1C,0x09);
LD_WriteReg(0xBD,0x20);
LD_WriteReg(0x08,0x01);
__delay_cycles(20000);
LD_WriteReg(0x08,0x00);
__delay_cycles(20000);
if(LD_Check_ASRBusyFlag_b2()==0)
{
return0;
}
LD_WriteReg(0xB2,0xff);
LD_WriteReg(0x37,0x06);
__delay_cycles(20000);
LD_WriteReg(0x1C,0x0b);//配置麦克风做为输入信号
//LD_WriteReg(0x1C,0x07);//配置双通道音频信号做为输入信号
LD_WriteReg(0x29,0x10);
LD_WriteReg(0xBD,0x00);
//EX0=1;
return1;
}
/************************************************************************
功能描述:
添加关键词,此处为用户修改部分
调用函数:
入口参数:
返回函数:
**************************************************************************/
//Return1:
success.
//添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法
unsignedcharLD_AsrAddFixed()
{
unsignedchark,flag;
uint8nAsrAddLength;
//uint8codesRecog[4][20]={"","kaifabanyanzheng","daimaceshi","jianchawanbi"};/*添加关键词,用户修改*/
unsignedcharsRecog[4][20]={"","woshi","ceshichenggong","jianyanwanbi"};
unsignedcharpCode[4]={0,CODE_KFBYZ,CODE_DMCS,CODE_JCWB};/*添加识别码,用户修改*/
flag=1;
for(k=0;k<4;k++)
{
if(LD_Check_ASRBusyFlag_b2()==0)
{
flag=0;
break;
}
LD_WriteReg(0xc1,pCode[k]);
LD_WriteReg(0xc3,0);
LD_WriteReg(0x08,0x04);
__delay_cycles(2000);
LD_WriteReg(0x08,0x00);
__delay_cycles(2000);
for(nAsrAddLength=0;nAsrAddLength<20;nAsrAddLength++)
{
if(sRecog[k][nAsrAddLength]==0)
break;
LD_WriteReg(0x5,sRecog[k][nAsrAddLength]);
}
LD_WriteReg(0xb9,nAsrAddLength);
LD_WriteReg(0xb2,0xff);
LD_WriteReg(0x37,0x04);
}
returnflag;
}
/************************************************************************************/
//RunASR()函数实现了一次完整的ASR语音识别流程
//LD_Init_ASR()函数实现了ASR初始化
//LD_AsrAddFixed()函数实现了添加关键词语到LD3320芯片中
//LD_AsrRun()函数启动了一次ASR语音识别流程
//
//任何一次ASR识别流程,都需要按照这个顺序,从初始化开始进行
/************************************************************************************/
unsignedcharRunASR()
{
unsignedchari=0;
unsignedcharasrflag=0;
for(i=0;i<5;i++)//防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
{
LD_AsrStart();
__delay_cycles(20000);
if(LD_AsrAddFixed()==0)
{
LD_reset();//LD3320芯片内部出现不正常,立即重启LD3320芯片
__delay_cycles(20000);//并从初始化开始重新ASR识别流程
continue;
}
__delay_cycles(20000);
if(LD_AsrRun()==0)
{
LD_reset();//LD3320芯片内部出现不正常,立即重启LD3320芯片
__delay_cycles(20000);//并从初始化开始重新ASR识别流程
continue;
}
asrflag=1;
break;//ASR流程启动成功,退出当前for循环。
开始等待LD3320送出的中断信号
}
returnasrflag;
}
/************************************************************************
功能描述:
获取识别结构
调用函数:
入口参数:
返回函数:
**************************************************************************/
unsignedcharLD_GetResult()
{
returnLD_ReadReg(0xc5);
}
voidProcessInt0(void)
{
uint8nAsrResCount=0;
//EX0=0;
ucRegVal=LD_ReadReg(0x2B);
LD_WriteReg(0x29,0);
LD_WriteReg(0x02,0);
if((ucRegVal&0x10)&&
LD_ReadReg(0xb2)==0x21&&
LD_ReadReg(0xbf)==0x35)/*识别成功*/
{
nAsrResCount=LD_ReadReg(0xba);
if(nAsrResCount>0&&nAsrResCount<=4)
{
nAsrStatus=LD_ASR_FOUNDOK;
}
else
{
nAsrStatus=LD_ASR_FOUNDZERO;
}
}/*没有识别结果*/
else
{
nAsrStatus=LD_ASR_FOUNDZERO;
}
LD_WriteReg(0x2b,0);
LD_WriteReg(0x1C,0);/*写0:
ADC不可用*/
LD_WriteReg(0x29,0);
LD_WriteReg(0x02,0);
LD_WriteReg(0x2B,0);
LD_WriteReg(0xBA,0);
LD_WriteReg(0xBC,0);
LD_WriteReg(0x08,1);/*清除FIFO_DATA*/
LD_WriteReg(0x08,0);/*清除FIFO_DATA后再次写0*/
//EX0=1;
}
voidInit_CLK(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
P5SEL|=0x0C;//端口功能选择振荡器
UCSCTL6&=~XT2OFF;//振荡器使能
//UCSCTL6|=XCAP_3;//设置内部负载电容
UCSCTL3|=SELREF_2;//FLLref=REFO
UCSCTL4|=SELA_2;//ACLK=REFO,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+XT1HFOFFG+DCOFFG);//清除XT2,XT1,DCO错误标志
SFRIFG1&=~OFIFG;
}while(SFRIFG1&OFIFG);//检测振荡器错误标志
UCSCTL6|=XT2DRIVE0+XT2DRIVE1;//XT2驱动模式24~32MHz
UCSCTL4|=SELS_5+SELM_5;//SMCLK=MCLK=XT2
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MSP430 语音 模块 程序