|
- #include "main.h"
- uint8 nLD_Mode = LD_MODE_IDLE; // 用來(lái)記錄當(dāng)前是在進(jìn)行ASR識(shí)別還是在播放MP3
- unsigned char ucRegVal;
- unsigned char ucHighInt;
- unsigned char ucLowInt;
- /*****************************************
- 函數(shù)功能 ;LD3320外部中斷初始化P1_6
- 入口參數(shù):無(wú)
- 出口參數(shù):無(wú)
- ******************************************/
- void LD3320_EXTERINT_Init()
- {
- P1SEL&=~BIT6;
- P1DIR&=~BIT6;
- P1REN|=BIT6;
- P1OUT|=BIT6;
- P1IES|=BIT6;
- P1IE|=BIT6;
- P1IFG&=~BIT6;
- }
- /*****************************************
- 函數(shù)功能 ;LD3320控制端口初始化
- 入口參數(shù):無(wú)
- 出口參數(shù):無(wú)
- ******************************************/
- void LD3320_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;
- }
- /*****************************************
- 函數(shù)功能 ;LD3320 SPI通信測(cè)試
- 入口參數(shù):無(wú)
- 出口參數(shù):無(wú)
- ******************************************/
- void Test_Information()
- {
- //測(cè)試讀寫(xiě)是否正常
- 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));
-
- //測(cè)試寄存器初始值是否正常
- LD_reset();
- nAsrRes=(LD_ReadReg(0x06));
- nAsrRes=(LD_ReadReg(0x06));
- nAsrRes=(LD_ReadReg(0x35));
- nAsrRes=(LD_ReadReg(0xb3));
- }
- /*****************************************
- 函數(shù)功能 ;LD3320寫(xiě)函數(shù)
- 入口參數(shù):address LD3320地址
- dataout LD3320數(shù)據(jù)
- 出口參數(shù):無(wú)
- ******************************************/
- void LD_WriteReg( unsigned char address, unsigned char dataout )
- {
- unsigned char i = 0;
- unsigned char command=0x04;
- CLR_LD_CS;//打開(kāi)片選
- __delay_cycles(500);
- ///////////////////////寫(xiě)命令
- 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;
- }
- /////////////////////寫(xiě)地址
- 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;
- }
- //////////////////////寫(xiě)數(shù)據(jù)
- 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;//關(guān)閉片選
-
- }
- /*****************************************
- 函數(shù)功能 ;LD3320讀函數(shù)
- 入口參數(shù):address LD3320地址
- 出口參數(shù):datain LD3320讀出的收據(jù)
- ******************************************/
- unsigned char LD_ReadReg( unsigned char address )
- {
- unsigned char i = 0;
- unsigned char datain =0 ;
- unsigned char command=0x05;
- CLR_LD_CS;//打開(kāi)片選
- __delay_cycles(2000);
- ///////////////////////寫(xiě)命令
- 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;
- }
- /////////////////////寫(xiě)地址
- 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);
- }
- /////////////////////讀數(shù)據(jù)
- 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;//關(guān)閉片選
- return datain;
- }
- /*****************************************
- 函數(shù)功能 ;LD3320復(fù)位函數(shù)
- 入口參數(shù):無(wú)
- 出口參數(shù):無(wú)
- ******************************************/
- void LD_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);
- }
- void LD_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);
-
- /*PLL setting*/
- 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);
- }
- void LD_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);
- }
- // Return 1: success.
- unsigned char LD_Check_ASRBusyFlag_b2()
- {
- unsigned char j;
- unsigned char flag = 0;
- for (j=0; j<10; j++)
- {
- if (LD_ReadReg(0xb2) == 0x21)
- {
- flag = 1;
- break;
- }
- __delay_cycles(200);
- }
- return flag;
- }
- /************************************************************************
- 功能描述: 啟動(dòng)ASR
- 入口參數(shù): none
- 返 回 值: none
- 其他說(shuō)明: none
- **************************************************************************/
- void LD_AsrStart()
- {
- LD_Init_ASR();
- }
- // Return 1: success.
- unsigned char LD_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)
- {
- return 0;
- }
- LD_WriteReg(0xB2, 0xff);
- LD_WriteReg(0x37, 0x06);
-
- __delay_cycles(20000);
- LD_WriteReg(0x1C, 0x0b); //配置麥克風(fēng)做為輸入信號(hào)
- //LD_WriteReg(0x1C, 0x07); //配置雙通道音頻信號(hào)做為輸入信號(hào)
- LD_WriteReg(0x29, 0x10);
-
- LD_WriteReg(0xBD, 0x00);
- //EX0=1;
- return 1;
- }
- /************************************************************************
- 功能描述:添加關(guān)鍵詞,此處為用戶修改部分
- 調(diào)用函數(shù):
- 入口參數(shù):
- 返回函數(shù):
- **************************************************************************/
- // Return 1: success.
- // 添加識(shí)別關(guān)鍵詞語(yǔ),開(kāi)發(fā)者可以學(xué)習(xí)"語(yǔ)音識(shí)別芯片LD3320高階秘籍.pdf"中關(guān)于垃圾詞語(yǔ)吸收錯(cuò)誤的用法
- unsigned char LD_AsrAddFixed()
- {
- unsigned char k, flag;
- uint8 nAsrAddLength;
- //uint8 code sRecog[4][20] = {"","kai fa ban yan zheng", "dai ma ce shi","jian cha wan bi"}; /*添加關(guān)鍵詞,用戶修改*/
- unsigned char sRecog[4][20] = {"","wo shi", "ce shi cheng gong ","jian yan wan bi"};
- unsigned char pCode[4] = {0,CODE_KFBYZ, CODE_DMCS, CODE_JCWB}; /*添加識(shí)別碼,用戶修改*/
- 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);
- }
- return flag;
- }
- /************************************************************************************/
- // RunASR()函數(shù)實(shí)現(xiàn)了一次完整的ASR語(yǔ)音識(shí)別流程
- // LD_Init_ASR() 函數(shù)實(shí)現(xiàn)了ASR初始化
- // LD_AsrAddFixed() 函數(shù)實(shí)現(xiàn)了添加關(guān)鍵詞語(yǔ)到LD3320芯片中
- // LD_AsrRun() 函數(shù)啟動(dòng)了一次ASR語(yǔ)音識(shí)別流程
- //
- // 任何一次ASR識(shí)別流程,都需要按照這個(gè)順序,從初始化開(kāi)始進(jìn)行
- /************************************************************************************/
- unsigned char RunASR()
- {
- unsigned char i=0;
- unsigned char asrflag=0;
- for (i=0; i<5; i++) // 防止由于硬件原因?qū)е翷D3320芯片工作不正常,所以一共嘗試5次啟動(dòng)ASR識(shí)別流程
- {
- LD_AsrStart();
- __delay_cycles(20000);
- if (LD_AsrAddFixed()==0)
- {
- LD_reset(); // LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
- __delay_cycles(20000); // 并從初始化開(kāi)始重新ASR識(shí)別流程
- continue;
- }
- __delay_cycles(20000);
- if (LD_AsrRun() == 0)
- {
- LD_reset(); // LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
- __delay_cycles(20000); // 并從初始化開(kāi)始重新ASR識(shí)別流程
- continue;
- }
- asrflag=1;
- break; // ASR流程啟動(dòng)成功,退出當(dāng)前for循環(huán)。開(kāi)始等待LD3320送出的中斷信號(hào)
- }
- return asrflag;
- }
- /************************************************************************
- 功能描述: 獲取識(shí)別結(jié)構(gòu)
- 調(diào)用函數(shù):
- 入口參數(shù):
- 返回函數(shù):
- **************************************************************************/
- unsigned char LD_GetResult()
- {
- return LD_ReadReg(0xc5 );
- }
- void ProcessInt0(void)
- {
- uint8 nAsrResCount=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) /*識(shí)別成功*/
- {
- nAsrResCount = LD_ReadReg(0xba);
- if(nAsrResCount>0 && nAsrResCount<=4)
- {
- nAsrStatus=LD_ASR_FOUNDOK;
- }
- else
- {
- nAsrStatus=LD_ASR_FOUNDZERO;
- }
- } /*沒(méi)有識(shí)別結(jié)果*/
- else
- {
- nAsrStatus=LD_ASR_FOUNDZERO;
- }
-
- LD_WriteReg(0x2b, 0);
- LD_WriteReg(0x1C,0);/*寫(xiě)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后 再次寫(xiě)0*/
- //EX0=1;
- }
- void Init_CLK(void)
- {
- WDTCTL = WDTPW + WDTHOLD ; // 關(guān)看門(mén)狗
- P5SEL |= 0x0C ; // 端口功能選擇振蕩器
- UCSCTL6 &= ~XT2OFF ; // 振蕩器使能
- // UCSCTL6 |= XCAP_3 ; // 設(shè)置內(nèi)部負(fù)載電容
- UCSCTL3 |= SELREF_2 ; // FLLref = REFO
- UCSCTL4 |= SELA_2 ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
- do
- {
- UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 錯(cuò)誤標(biāo)志
- SFRIFG1 &= ~OFIFG ;
- }while(SFRIFG1&OFIFG) ; // 檢測(cè)振蕩器錯(cuò)誤標(biāo)志
- UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驅(qū)動(dòng)模式 24~32MHz
- UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2
- }
復(fù)制代碼
|
-
-
MSP430 源程序.zip
2020-3-1 00:09 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
194.56 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5
|