// 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;
}
Example #2
0
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);
}
Example #5
0
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;

}
Example #9
0
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) ;
}
Example #10
0
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;
}
Example #11
0
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);
}	
Example #12
0
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); 
}
Example #13
0
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); 
}
Example #14
0
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;

}