// Return 1: success. uint8 LD_AsrRun() { SendString("LD_AsrRun()."); SendLineEnd(); LD_WriteReg(0x35, MIC_VOL); // LD_WriteReg(0xB3, 0x0D); // 用户阅读 开发手册 理解B3寄存器的调整对于灵敏度和识别距离的影响 LD_WriteReg(0x1C, 0x09); LD_WriteReg(0xBD, 0x20); LD_WriteReg(0x08, 0x01); delay( 1 ); LD_WriteReg(0x08, 0x00); delay( 1 ); if(LD_Check_ASRBusyFlag_b2() == 0) { return 0; } LD_WriteReg(0xB2, 0xff); LD_WriteReg(0x37, 0x06); delay( 5 ); LD_WriteReg(0x1C, 0x0b); LD_WriteReg(0x29, 0x10); LD_WriteReg(0xBD, 0x00); EX0=1; return 1; }
static unsigned char LD_AsrRun(void) { LD_WriteReg(0x35, MIC_VOL); //麦克风音量 // LD_Write(0xB3, 0x0D); // LD_WriteReg(0x1C, 0x09); //ADC开关控制,写09H Reserve 保留命令字 LD_WriteReg(0xBD, 0x20); //初始化控制寄存器 写入20H; LD_WriteReg(0x08, 0x01); //清除FIFO内容第0位:写入->清除FIFO_DATA第二位 delay( 1 ); LD_WriteReg(0x08, 0x00); // delay( 1 ); if(LD_Check_ASRBusyFlag_b2() == 0) { return 0; } LD_WriteReg(0xB2, 0xff); // LD_WriteReg(0x37, 0x06); // delay( 5 ); //LD_TEST(); LD_WriteReg(0x1C, 0x0b); // LD_WriteReg(0x29, 0x10); // LD_WriteReg(0xBD, 0x00); // //EX0=1; // EXTI_ClearITPendingBit(EXTI_Line5); return 1; }
void LD_AdjustMIX2SPVolume(uint8 val) { ucSPVol = val; val = ((15-val)&0x0f) << 2; LD_WriteReg(0x8E, val | 0xc3); LD_WriteReg(0x87, 0x78); }
void LD_AsrAddFixed_ByString(char * pRecogString, uint8 k) { uint8 nAsrAddLength; SendByteHex(k); SendString(" "); SendString(pRecogString); SendLineEnd(); if (*pRecogString==0) return; LD_WriteReg(0xc1, k ); LD_WriteReg(0xc3, 0 ); LD_WriteReg(0x08, 0x04); delay(1); LD_WriteReg(0x08, 0x00); delay(1); for (nAsrAddLength=0; nAsrAddLength<50; nAsrAddLength++) { if (pRecogString[nAsrAddLength] == 0) break; LD_WriteReg(0x5, pRecogString[nAsrAddLength]); } LD_WriteReg(0xb9, nAsrAddLength); LD_WriteReg(0xb2, 0xff); LD_WriteReg(0x37, 0x04); }
static void LD_Init_ASR(void) { LD_Init_Common(); LD_WriteReg(0xBD, 0x00); LD_WriteReg(0x17, 0x48); delay(5); 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(1); }
void LD_Init_ASR() { nLD_Mode=LD_MODE_ASR_RUN; LD_Init_Common(); LD_WriteReg(0xBD, 0x00); LD_WriteReg(0x17, 0x48); delay( 10 ); 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( 1 ); }
void LD_ReloadMp3Data_2() { uint32 nCurMp3Pos; uint8 val; uint8 k; nCurMp3Pos = nMp3StartPos + nMp3Pos; FLASH_CS=1; FLASH_CLK=0; FLASH_CS=0; IO_Send_Byte(W25P_FastReadData); IO_Send_Byte(((nCurMp3Pos & 0xFFFFFF) >> 16)); IO_Send_Byte(((nCurMp3Pos & 0xFFFF) >> 8)); IO_Send_Byte(nCurMp3Pos & 0xFF); IO_Send_Byte(0xFF); ucStatus = LD_ReadReg(0x06); while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) ) { val=0; for(k=0;k<8;k++) { FLASH_CLK=0; val<<=1; FLASH_CLK=1; val|=FLASH_DO; } LD_WriteReg(0x01,val); nMp3Pos++; ucStatus = LD_ReadReg(0x06); } FLASH_CS=1; FLASH_CLK=0; }
void LD_play() { nMp3Pos=0; bMp3Play=1; if (nMp3Pos >= nMp3Size) return ; LD_ReloadMp3Data(); LD_WriteReg(0xBA, 0x00); LD_WriteReg(0x17, 0x48); LD_WriteReg(0x33, 0x01); LD_WriteReg(0x29, 0x04); LD_WriteReg(0x02, 0x01); LD_WriteReg(0x85, 0x5A); EX0=1; }
void ProcessInt(void) { unsigned char nAsrResCount=0; unsigned char ucRegVal; unsigned char ucHighInt; unsigned char ucLowInt; ucRegVal = LD_ReadReg(0x2B); if(myRobot.ld3320State.mode==LD_MODE_ASR_RUN) { //语音识别产生的中断 //有声音输入,不论是别成功或失败都有中断 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) { myRobot.ld3320State.state=LD_ASR_FOUNDOK; } else { myRobot.ld3320State.state=LD_ASR_FOUNDZERO; } } else { myRobot.ld3320State.state=LD_ASR_FOUNDZERO; } LD_WriteReg(0x2b,0); LD_WriteReg(0x1C,0); return; } ucHighInt = LD_ReadReg(0x29); ucLowInt=LD_ReadReg(0x02); LD_WriteReg(0x29,0) ; LD_WriteReg(0x02,0) ; if(LD_ReadReg(0xBA)&CAUSE_MP3_SONG_END) { // A. 声音数据全部播放完毕 LD_WriteReg(0x2B, 0); LD_WriteReg(0xBA, 0); LD_WriteReg(0xBC,0x0); LD_WriteReg(0x08,1); LD_WriteReg(0x08,0); LD_WriteReg(0x33, 0); myRobot.ld3320State.mode=LD_MODE_ASR_RUN; myRobot.ld3320State.state=LD_ASR_NONE; return ; } // if(nMp3Pos>=nMp3Size) // { // // B. ÉùÒôÊý¾ÝÒÑ·¢ËÍÍê±Ï¡£ // LD_Write(0xBC, 0x01); // LD_Write(0x29, 0x10); // f_close(&fsrc); // nLD_Mode = LD_MODE_ASR_RUN; // nAsrStatus = LD_ASR_NONE; // return; // } LD_WriteReg(0x29,ucHighInt); LD_WriteReg(0x02,ucLowInt) ; }
static unsigned char LD_AsrAddFixed(void) { unsigned char k, flag; unsigned char nAsrAddLength; #define DATE_A 12 //数组二维数值 #define DATE_B 50 //数组以为数值 //添加关键词 unsigned char sRecog[DATE_A][DATE_B] = { "ni shi shui", \ "ni zai na li", \ "wo shi shui", \ "xuan zhuan", \ "ting zhi", \ "chang shou ge", \ "xiang qian zou", \ "xiang hou tui", \ "yao tou", \ "niu yao", \ "zuo ge bo", \ "you ge bo", \ }; unsigned char pCode[DATE_A] = { 1, \ 2, \ 3, \ 4, \ 5, \ 6, \ 7, \ 8, \ 9, \ 10, \ 11, \ 12, \ }; flag = 1; for (k=0; k<DATE_A; k++) { if(LD_Check_ASRBusyFlag_b2() == 0) { flag = 0; break; } LD_WriteReg(0xc1, pCode[k] ); LD_WriteReg(0xc3, 0); LD_WriteReg(0x08, 0x04); delay(1); LD_WriteReg(0x08, 0x00); delay(1); for (nAsrAddLength=0; nAsrAddLength<DATE_B; 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; }
void LD_Init_Common(void) { //bMp3Play = 0; LD_ReadReg(0x06); LD_WriteReg(0x17, 0x35); delay(10); LD_ReadReg(0x06); LD_WriteReg(0x89, 0x03); delay(5); LD_WriteReg(0xCF, 0x43); delay(5); LD_WriteReg(0xCB, 0x02); /*PLL setting*/ LD_WriteReg(0x11, LD_PLL_11); if (myRobot.ld3320State.mode == LD_MODE_MP3) { LD_WriteReg(0x1E, 0x00); //!! 注意,下面三个寄存器,会随晶振频率变化而设置不同 //!! 注意, 请根据使用的晶振频率修改参考程序中的 CLK_IN LD_WriteReg(0x19, LD_PLL_MP3_19); LD_WriteReg(0x1B, LD_PLL_MP3_1B); LD_WriteReg(0x1D, LD_PLL_MP3_1D); } else { // LD_WriteReg(0x1E,0x00); //!! 注意,下面三个寄存器,会随晶振频率变化而设置不同 //!! 注意, 请根据使用的晶振频率修改参考程序中的 CLK_IN LD_WriteReg(0x19, LD_PLL_ASR_19); LD_WriteReg(0x1B, LD_PLL_ASR_1B); LD_WriteReg(0x1D, LD_PLL_ASR_1D); } LD_WriteReg(0xCD, 0x04); LD_WriteReg(0x17, 0x4c); delay(5); LD_WriteReg(0xB9, 0x00); LD_WriteReg(0xCF, 0x4f); LD_WriteReg(0x6F, 0xFF); }
void LD_Init_MP3() { nLD_Mode = LD_MODE_MP3; LD_Init_Common(); LD_WriteReg(0xBD,0x02); LD_WriteReg(0x17, 0x48); delay(10); LD_WriteReg(0x85, 0x52); LD_WriteReg(0x8F, 0x00); LD_WriteReg(0x81, 0x00); LD_WriteReg(0x83, 0x00); LD_WriteReg(0x8E, 0xff); LD_WriteReg(0x8D, 0xff); delay(1); LD_WriteReg(0x87, 0xff); LD_WriteReg(0x89, 0xff); delay(1); LD_WriteReg(0x22, 0x00); LD_WriteReg(0x23, 0x00); LD_WriteReg(0x20, 0xef); LD_WriteReg(0x21, 0x07); LD_WriteReg(0x24, 0x77); LD_WriteReg(0x25, 0x03); LD_WriteReg(0x26, 0xbb); LD_WriteReg(0x27, 0x01); }
void LD_Init_Common() { bMp3Play = 0; LD_ReadReg(0x06); LD_WriteReg(0x17, 0x35); delay(10); LD_ReadReg(0x06); LD_WriteReg(0x89, 0x03); delay(5); LD_WriteReg(0xCF, 0x43); delay(5); LD_WriteReg(0xCB, 0x02); /*PLL setting*/ LD_WriteReg(0x11, LD_PLL_11); if (nLD_Mode == LD_MODE_MP3) { LD_WriteReg(0x1E, 0x00); LD_WriteReg(0x19, LD_PLL_MP3_19); LD_WriteReg(0x1B, LD_PLL_MP3_1B); LD_WriteReg(0x1D, LD_PLL_MP3_1D); } else { 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(10); LD_WriteReg(0xCD, 0x04); LD_WriteReg(0x17, 0x4C); delay(5); LD_WriteReg(0xB9, 0x00); LD_WriteReg(0xCF, 0x4F); LD_WriteReg(0x6F, 0xFF); }
void ProcessInt0() { uint8 nAsrResCount=0; EX0=0; ucRegVal = LD_ReadReg(0x2B); if(nLD_Mode == LD_MODE_ASR_RUN) { // 语音识别产生的中断 // (有声音输入,不论识别成功或失败都有中断) 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); return; } // 声音播放产生的中断,有三种: // A. 声音数据已全部播放完。 // B. 声音数据已发送完毕。 // C. 声音数据暂时将要用完,需要放入新的数据。 ucHighInt = LD_ReadReg(0x29); ucLowInt=LD_ReadReg(0x02); LD_WriteReg(0x29,0) ; LD_WriteReg(0x02,0) ; if(LD_ReadReg(0xBA)&CAUSE_MP3_SONG_END) { // A. 声音数据已全部播放完。 LD_WriteReg(0x2B, 0); LD_WriteReg(0xBA, 0); LD_WriteReg(0xBC,0x0); bMp3Play=0; // 声音数据全部播放完后,修改bMp3Play的变量 LD_WriteReg(0x08,1); delay_2(5); LD_WriteReg(0x08,0); LD_WriteReg(0x33, 0); return ; } if(nMp3Pos>=nMp3Size) { // B. 声音数据已发送完毕。 LD_WriteReg(0xBC, 0x01); LD_WriteReg(0x29, 0x10); // bMp3Play=0; // 此时,只是主控MCU把所有MP3数据发送到LD3320芯片内,但是还没有把送入的数据全部播放完毕 EX0=1; return; } // C. 声音数据暂时将要用完,需要放入新的数据。 LD_ReloadMp3Data_2(); LD_WriteReg(0x29,ucHighInt); LD_WriteReg(0x02,ucLowInt) ; delay_2(10); EX0=1; }