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; }
uint8 LD_AsrRun() //开始识别 { ld3320_write_reg(0x35, MIC_VOL);//麦克风音量 ld3320_write_reg(0xB3, 0xF); //灵敏度 ld3320_write_reg(0x1C, 0x09); //ADC开关控制 写09H Reserve保留命令字 ld3320_write_reg(0xBD, 0x20); //初始化控制寄存器 写入20H;Reserve保留命令字 ld3320_write_reg(0x08, 0x01); //清除FIFO内容第0位:写入1→清除FIFO_DATA 第2位:写入1→清除FIFO_EXT delay_ms( 1 ); ld3320_write_reg(0x08, 0x00); //清除FIFO内容第0位(清除指定FIFO后再写入一次00H) delay_ms( 1 ); if (LD_Check_ASRBusyFlag_b2() == 0) //芯片内部出错 { return 0; } ld3320_write_reg(0xB2, 0xff); //ASR:DSP忙闲状态 0x21 表示闲,查询到为闲状态可以进行下一步 ??? 为什么不是read?? ld3320_write_reg(0x37, 0x06); //识别控制命令下发寄存器 写06H 通知DSP开始识别语音 下发前,需要检查B2寄存器 delay_ms( 5 ); LD_TEST(); ld3320_write_reg(0x1C, 0x0b); // ADC开关控制 写0BH 麦克风输入ADC通道可用 ld3320_write_reg(0x29, 0x10); //中断允许 第2位:FIFO 中断允许 第4位:同步中断允许 1允许;0不允许 ld3320_write_reg(0xBD, 0x00); //初始化控制寄存器 写入00 然后启动 为ASR模块 return 1; }
// 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; }
// Return 1: success. // 添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法 uint8 LD_AsrAddFixed() { uint8 k, flag; SendString("\nLD_AsrAddFixed()."); SendLineEnd(); flag = 1; for (k=0; k<ITEM_COUNT; k++) { if(LD_Check_ASRBusyFlag_b2() == 0) { flag = 0; break; } LD_AsrAddFixed_ByIndex(k); } return flag; }
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; }