STM32单片机+LD3320语音识别模块+MP3模块或者nsy8266语音合成模块制作的语音插座

自己利用空闲时间,用32单片机和一些模块做了一个语音插座,既有12V直流电输出,也有两路220交流输出(其中一路可以支持高低档切换,实现原理就是在两个继电器中间串一个1N5408二极管)。本制作语音插座,有PCB、原理图,PCB印制电路板都是原创,还有预留了两个DS18b20温度传感器的焊盘位置和两个按键,一个可以探测5V和3.3V芯片的工作温度,另一个可以探测外部温度,然后配合预留继电器12V供电,可以实现温度控制。除了这些已经连接好了的电路,还把剩余的其他IO口引出,有一组spi协议(后期可以添加显示屏)、3.3v、5v、12v的电源。毕竟是业余时间做的,可能在有些方面不是很完善。
一、资料展示
1.原理图
在这里插入图片描述

2.PCB印制电路板
因为自己做的板,所以在布线的时候那那么专业,能用就好。
在这里插入图片描述
在这里插入图片描述

3.实物图
外观大概就这样,工作状态
在这里插入图片描述

4、说明
外壳使用3D打印的,就是第一次使用,建模这些不是很好,打出6面后用热熔枪连接·······
5、代码

#include "LD3320.h"
#include "led.h"
#include "time.h"
#include "delay.h"
#include "Relay.h"
//#include "mp3.h"
#include "syn6288.h"

/************************************************************************************
//	nAsrStatus ÓÃÀ´ÔÚmainÖ÷³ÌÐòÖбíʾ³ÌÐòÔËÐеÄ״̬£¬²»ÊÇLD3320оƬÄÚ²¿µÄ״̬¼Ä´æÆ÷
//	LD_ASR_NONE:			±íʾûÓÐÔÚ×÷ASRʶ±ð
//	LD_ASR_RUNING£º		±íʾLD3320ÕýÔÚ×÷ASRʶ±ðÖÐ
//	LD_ASR_FOUNDOK:		±íʾһ´Îʶ±ðÁ÷³Ì½áÊøºó£¬ÓÐÒ»¸öʶ±ð½á¹û
//	LD_ASR_FOUNDZERO:	±íʾһ´Îʶ±ðÁ÷³Ì½áÊøºó£¬Ã»ÓÐʶ±ð½á¹û
//	LD_ASR_ERROR:			±íʾһ´Îʶ±ðÁ÷³ÌÖÐLD3320оƬÄÚ²¿³öÏÖ²»ÕýÈ·µÄ״̬
*********************************************************************************/
uint8 nAsrStatus = 0;	
uint8 nLD_Mode = LD_MODE_IDLE;//ÓÃÀ´¼Ç¼µ±Ç°ÊÇÔÚ½øÐÐASRʶ±ð»¹ÊÇÔÚ²¥·ÅMP3
uint8 ucRegVal;
uint8 LD_Password=0;
uint8 LD_K=0;
uint8 nAsrRes=0;

void LD3320_START(void)
{
  
	LD3320_init();	   		
	nAsrStatus = LD_ASR_NONE;//³õʼ״̬£ºÃ»ÓÐÔÚ×÷ASR     nAsrStatus   ÉÏÃæÓж¨Òå         #define LD_ASR_NONE					0x00	//±íʾûÓÐÔÚ×÷ASRʶ±ð

}
	

///Óû§ÐÞ¸Ä
void LD3320_main(void)
{
	

		
		switch(nAsrStatus)
		{
			case LD_ASR_RUNING:                //#define LD_ASR_RUNING				0x01	//±íʾLD3320ÕýÔÚ×÷ASRʶ±ðÖÐ										
			case LD_ASR_ERROR:                //#define LD_ASR_ERROR	 			0x31	//	±íʾһ´Îʶ±ðÁ÷³ÌÖÐLD3320оƬÄÚ²¿³öÏÖ²»ÕýÈ·µÄ״̬
					break;	
			case LD_ASR_NONE:                  //#define LD_ASR_NONE					0x00	//±íʾûÓÐÔÚ×÷ASRʶ±ð
					nAsrStatus=LD_ASR_RUNING;     //³õʼ״̬£ºÃ»ÓÐÔÚ×÷ASR     nAsrStatus   ÉÏÃæÓж¨Òå         #define LD_ASR_NONE					0x00	//±íʾûÓÐÔÚ×÷ASRʶ±ð
					if (RunASR()==0)//Æô¶¯Ò»´ÎASRʶ±ðÁ÷³Ì£ºASR³õʼ»¯£¬ASRÌí¼Ó¹Ø¼ü´ÊÓÆô¶¯ASRÔËËã
					{		
						nAsrStatus = LD_ASR_ERROR;
					}
					break;
					
			case LD_ASR_FOUNDOK:
					 nAsrRes = LD_GetResult();//Ò»´ÎASRʶ±ðÁ÷³Ì½áÊø£¬È¥È¡ASRʶ±ð½á¹û										 
					 if(nAsrRes==CODE_XFTX)
					 {
						 SYN_FrameInfo(0, "ÎÒÔÚ£¬Çë·Ô¸À£¡");
						 LD_Password=1;
						 Bright();
					 }
					  if(LD_Password==1)  
					 {
						 TIM2_Int_Init(9999,7199);
						 switch(nAsrRes)		   			//¶Ô½á¹ûÖ´ÐÐÏà¹Ø²Ù×÷,¿Í»§ÐÞ¸Ä
						  {
							case CODE_DKCZ:					//´ò¿ª²å×ù
								if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==0)       //Åжϲå×ùÊÇ·ñÔڹرÕ״̬
								{	
						     Relay2_on();      //´ò¿ª²å×ù
							   SYN_FrameInfo(0, "²å×ùÒÑ´ò¿ª£¡");  
							  }
								else              //²å×ùÒѾ­´ò¿ª£¬²»ÐèÒªÖظ´²Ù×÷
								 SYN_FrameInfo(0, "ÕýÔÚÔËÐÐÖУ¬ÇëÎðÖظ´²Ù×÷£¡");  
								
								 TIM2_STOP();
                 LD_Password=0;
                 Extinguish();
								break;
								
							case CODE_GBCZ:	 					//¹Ø±Õ²å×ù
							 if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==1)       //Åжϲå×ùÊÇ·ñÔÚ¿ªÆô״̬
								{	
						     Relay2_off(); //¹Ø±ÕµçÔ´
							   SYN_FrameInfo(0, "²å×ùÒѹرգ¡");   
							  }
								else              //²å×ùÒѾ­¹Ø±Õ£¬²»ÐèÒªÖظ´²Ù×÷
								 SYN_FrameInfo(0, "²å×ùδ¹¤×÷£¡");  
								
							   TIM2_STOP();
                 LD_Password=0;
                 Extinguish();
								break;
								
							case CODE_QNGD:					//¸ßµµÄ£Ê½
								if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==1)  //ÅжϵçÔ´ÊÇ·ñ´ò¿ª
								{
							   if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4)==0)  //ÅжÏÊÇ·ñ¹¤×÷Ôڵ͵µ×´Ì¬
								 {
								  Relay1_on();   //¸ßµµÄ£Ê½¹¤×÷ÖÐ
							    SYN_FrameInfo(0, "¸ßµ²Ä£Ê½ÒÑ¿ªÆô£¡");  
								 }
								 else      //¸ßµµÄ£Ê½ÔËÐÐÖУ¬²»ÒªÒªÖظ´²Ù×÷
									SYN_FrameInfo(0, "µ±Ç°Ä£Ê½¹¤×÷ÖУ¬ÇëÎðÖظ´²Ù×÷£¡"); 
							  }
								else    //µçԴ먦Æô£¬Çë´ò¿ªµçÔ´
								 SYN_FrameInfo(0, "ȡůÆ÷δ¹¤×÷£¬Çë´ò¿ªÈ¡Å¯Æ÷£¡");
							  
                TIM2_STOP();
								LD_Password=0;
                Extinguish();
								break;
								
							case CODE_QNDD:					//µÍµµÄ£Ê½
							  if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==1)  //ÅжϵçÔ´ÊÇ·ñ´ò¿ª
								{
							   if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4)==1)  //ÅжÏÊÇ·ñ¹¤×÷Ôڸߵµ×´Ì¬
								 {
								  Relay1_off();   //µÍµµÄ£Ê½¹¤×÷ÖÐ
							    SYN_FrameInfo(0, "µÍµ²Ä£Ê½ÒÑ¿ªÆô£¡");
								 }
								 else      //µÍµµÄ£Ê½ÔËÐÐÖУ¬²»ÒªÒªÖظ´²Ù×÷
									SYN_FrameInfo(0, "µ±Ç°Ä£Ê½¹¤×÷ÖУ¬ÇëÎðÖظ´²Ù×÷£¡"); 
							  }
								else    //µçԴ먦Æô£¬Çë´ò¿ªµçÔ´
								 SYN_FrameInfo(0, "ȡůÆ÷δ¹¤×÷£¬Çë´ò¿ªÈ¡Å¯Æ÷£¡");
							   
                 TIM2_STOP();
								 LD_Password=0;
                 Extinguish();
							  break;
								
							case CODE_DKQNQ:						//´ò¿ªÈ¡Å¯Æ÷
							   if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==0)  //ÅжÏÊÇ·ñ¹¤×÷
								 {
								  Relay_on();   //´ò¿ª
							   SYN_FrameInfo(0, "ȡůÆ÷ÒÑ´ò¿ª£¡");
								 }
								 else      //ÒѾ­ÔÚ¹¤×÷¿©£¡
									SYN_FrameInfo(0, "ÕýÔÚÔËÐÐÖУ¬ÇëÎðÖظ´²Ù×÷£¡");  
							   
                 TIM2_STOP();
								 LD_Password=0;
                 Extinguish();
							  break;
								 
							case CODE_GBQNQ:						//¹Ø±ÕȡůÆ÷
							   if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==1)  //ÅжÏÊÇ·ñ¹¤×÷
								 {
								  Relay_off();   //¹Ø±Õ
							    SYN_FrameInfo(0, "ȡůÆ÷Òѹرգ¡");
								 }
								 else      //ÒѾ­¹Ø±Õ¿©£¡
									SYN_FrameInfo(0, "ȡůÆ÷δ¹¤×÷£¡"); 
							  
                 TIM2_STOP();
								 LD_Password=0;
                 Extinguish();
							  break;
								 
							case CODE_DKFS:
                	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_12)==1)  //ÅжϵçÔ´ÊÇ·ñ´ò¿ª
									 SYN_FrameInfo(0, "·çÉÈÔËÐÐÖУ¬ÇëÎðÖØвÙ×÷£¡"); 
                  else 
									{
									 Relay3_on();  
							     SYN_FrameInfo(0, "·çÉÈÒѹ¤×÷£¡");
									}
               	 
                 TIM2_STOP();
								 LD_Password=0;
                 Extinguish();						
                 break;
									
								
									
              case CODE_GBFS:
                	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_12)==0)  //ÅжϵçÔ´ÊÇ·ñ´ò¿ª
									 SYN_FrameInfo(0, "·çÉÈδ¹¤×÷£¡");  
                  else 
									{
									 Relay3_off();   
							     SYN_FrameInfo(0, "·çÉÈÒѹرգ¡");
									}	
								 
                 TIM2_STOP();
								 LD_Password=0;
                 Extinguish();
                 break;
									
							
									
              case CODE_GBSYSB:
									 Relay_off();   //¹Ø±ÕµçÔ´
							     Relay1_off();   //¹Ø±Õ¹¦ÂÊ
							     Relay2_off();   //¹Ø±ÕÒ¡Í· 
							     Relay3_off();   //¹Ø±ÕÖ±Á÷É豸2
							    SYN_FrameInfo(0, "É豸¶¼ÒѾ­¹ØÀ²£¡"); 
							   TIM2_STOP();
                 LD_Password=0;
                 Extinguish();
                 break;	
							
							default:
								break;
						   }
               							 
							 
					 }
					  nAsrStatus = LD_ASR_NONE;
					   break; 
			case LD_ASR_FOUNDZERO:
			default:
					nAsrStatus = LD_ASR_NONE;
					break;
			}
}

static uint8 LD_AsrAddFixed(void)
{
	uint8 k, flag;
	uint8 nAsrAddLength;
	#define DATE_A 12    //Êý×é¶þάÊýÖµ
	#define DATE_B 30		//Êý×éһάÊýÖµ
	//Ìí¼Ó¹Ø¼ü´Ê£¬Óû§ÐÞ¸Ä
	uint8  sRecog[DATE_A][DATE_B] = {
	 			"xiao feng tong xue",\
				"da kai cha zuo",\
				"guan bi cha zuo",\
				"da kai feng shan",\
				"guan bi feng shan",\
				"da kai qu nuan qi",\
				"guan bi qu nuan qi",\
				"qu naun di dang" ,\
				"qu naun gao dang", \
				"guan bi shuo you she bei"
		
																	};	
	uint8  pCode[DATE_A] = {
	 															CODE_XFTX,	\
																CODE_DKCZ,\
															  CODE_GBCZ,\
															  CODE_DKFS,\
															  CODE_GBFS,\
															  CODE_DKQNQ,\
															  CODE_GBQNQ,\
															  CODE_QNDD,\
															  CODE_QNGD,\
															  CODE_GBSYSB
															};	//Ìí¼Óʶ±ðÂ룬Óû§ÐÞ¸Ä
	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);
		LD3320_delay(1);
		LD_WriteReg(0x08, 0x00);
		LD3320_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;
}





///Óû§ÐÞ¸Ä end

///Ïà¹Ø³õʼ»¯
static void LD3320_init(void)          //³õʼ»¯
{
	LD3320_GPIO_Cfg();	                 //³õʼ»¯GPIO
	LD3320_EXTI_Cfg();                   //³õʼ»¯ÖжÏ
	LD3320_SPI_cfg();                    //³õʼ»¯SPIͨѶ
	LD_reset();                          //I/O¿Ú¸ßµÍÔÚ¼ÓÑÓʱ£¬ÕâÀïµÄÑÓʱÊÇËÀÑÓʱ£¬ÌرðҪעÒâÒª¸Ä
}

static void LD3320_GPIO_Cfg(void)                              //³õʼ»¯»¯IO
{	
		GPIO_InitTypeDef GPIO_InitStructure;
		RCC_APB2PeriphClockCmd(LD3320RST_GPIO_CLK | LD3320CS_GPIO_CLK,ENABLE);
		//LD_CS	/RSET
		GPIO_InitStructure.GPIO_Pin =LD3320CS_PIN;                 //GPIO_Pin_4
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
		GPIO_Init(LD3320CS_GPIO_PORT,&GPIO_InitStructure);         //GPIOA
	
		GPIO_InitStructure.GPIO_Pin =LD3320RST_PIN;                //GPIO_Pin_15	
		GPIO_Init(LD3320RST_GPIO_PORT,&GPIO_InitStructure);        //GPIOB
}

static void LD3320_EXTI_Cfg(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	

	RCC_APB2PeriphClockCmd(LD3320IRQ_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =LD3320IRQ_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(LD3320IRQ_GPIO_PORT, &GPIO_InitStructure);
	//ÍⲿÖжÏÏßÅäÖÃ
  GPIO_EXTILineConfig(LD3320IRQEXIT_PORTSOURCE, LD3320IRQPINSOURCE);
  EXTI_InitStructure.EXTI_Line = LD3320IRQEXITLINE;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
	//ÖжÏǶÌ×ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = LD3320IRQN;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

static void LD3320_SPI_cfg(void)
{
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
  //spi¶Ë¿ÚÅäÖÃ
	RCC_APB2PeriphClockCmd(LD3320SPI_CLK,ENABLE);		
  RCC_APB2PeriphClockCmd(LD3320WR_GPIO_CLK | LD3320SPIMISO_GPIO_CLK | LD3320SPIMOSI_GPIO_CLK | LD3320SPISCK_GPIO_CLK,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = LD3320SPIMISO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(LD3320SPIMISO_GPIO_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = LD3320SPIMOSI_PIN;
	GPIO_Init(LD3320SPIMOSI_GPIO_PORT,&GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = LD3320SPISCK_PIN;
	GPIO_Init(LD3320SPISCK_GPIO_PORT,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = LD3320WR_PIN;				
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(LD3320WR_GPIO_PORT, &GPIO_InitStructure);
	
	LD_CS_H();
	
	SPI_Cmd(LD3320SPI, DISABLE);

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   	//È«Ë«¹¤
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;						   						//Ö÷ģʽ
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;					   					//8λ
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;						   							//ʱÖÓ¼«ÐÔ ¿ÕÏÐ״̬ʱ£¬SCK±£³ÖµÍµçƽ
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;						   						//ʱÖÓÏàλ Êý¾Ý²ÉÑù´ÓµÚÒ»¸öʱÖÓ±ßÑØ¿ªÊ¼
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;							   							//Èí¼þ²úÉúNSS
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //²¨ÌØÂÊ¿ØÖÆ SYSCLK/128
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;				   					//Êý¾Ý¸ßλÔÚÇ°
	SPI_InitStructure.SPI_CRCPolynomial = 7;							   							//CRC¶àÏîʽ¼Ä´æÆ÷³õʼֵΪ7
	SPI_Init(LD3320SPI, &SPI_InitStructure);

	SPI_Cmd(LD3320SPI, ENABLE);
}

///Ïà¹Ø³õʼ»¯ end 

///Öмä²ã
void EXTI9_5_IRQHandler(void)
{
	if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET ) 
	{
		ProcessInt(); 
		EXTI_ClearFlag(LD3320IRQEXITLINE);
		EXTI_ClearITPendingBit(LD3320IRQEXITLINE);//Çå³ýLINEÉϵÄÖжϱê־λ  
	} 
}

static void LD3320_delay(unsigned long uldata)
{
	unsigned int i  =  0;
	unsigned int j  =  0;
	unsigned int k  =  0;
	for (i=0;i<5;i++)
	{
		for (j=0;j<uldata;j++)
		{
			k = 200;
			while(k--);
		}
	}
}

static uint8 RunASR(void)
{
	uint8 i=0;
	uint8 asrflag=0;
	for (i=0; i<5; i++)		//·ÀÖ¹ÓÉÓÚÓ²¼þÔ­Òòµ¼ÖÂLD3320оƬ¹¤×÷²»Õý³££¬ËùÒÔÒ»¹²³¢ÊÔ5´ÎÆô¶¯ASRʶ±ðÁ÷³Ì
	{
		LD_AsrStart();			//³õʼ»¯ASR
		LD3320_delay(100);
		if (LD_AsrAddFixed()==0)	//Ìí¼Ó¹Ø¼ü´ÊÓïµ½LD3320оƬÖÐ
		{
			LD_reset();				//LD3320оƬÄÚ²¿³öÏÖ²»Õý³££¬Á¢¼´ÖØÆôLD3320оƬ
			LD3320_delay(50);	//²¢´Ó³õʼ»¯¿ªÊ¼ÖØÐÂASRʶ±ðÁ÷³Ì
			continue;
		}
		LD3320_delay(10);
		if (LD_AsrRun() == 0)
		{
			LD_reset();			 //LD3320оƬÄÚ²¿³öÏÖ²»Õý³££¬Á¢¼´ÖØÆôLD3320оƬ
			LD3320_delay(50);//²¢´Ó³õʼ»¯¿ªÊ¼ÖØÐÂASRʶ±ðÁ÷³Ì
			continue;
		}
		asrflag=1;
		break;						//ASRÁ÷³ÌÆô¶¯³É¹¦£¬Í˳öµ±Ç°forÑ­»·¡£¿ªÊ¼µÈ´ýLD3320ËͳöµÄÖжÏÐźÅ
	}	
	return asrflag;
}

static void LD_reset(void)
{
	LD_RST_H();               //GPIO_SetBits(GPIOB, GPIO_Pin_15)
	LD3320_delay(100);
	LD_RST_L();               //GPIO_ResetBits(GPIOB, GPIO_Pin_15)
	LD3320_delay(100);
	LD_RST_H();               //GPIO_SetBits(GPIOB, GPIO_Pin_15)
	LD3320_delay(100);
	LD_CS_L();                //GPIO_ResetBits(GPIOA, GPIO_Pin_4)
	LD3320_delay(100);
	LD_CS_H();		            //GPIO_SetBits(GPIOA, GPIO_Pin_4)
	LD3320_delay(100);
}

static void LD_AsrStart(void)
{
	LD_Init_ASR();
}

uint8 LD_Check_ASRBusyFlag_b2(void)
{
	uint8 j;
	uint8 flag = 0;
	for (j=0; j<10; j++)
	{
		if (LD_ReadReg(0xb2) == 0x21)
		{
			flag = 1;
			break;
		}
		LD3320_delay(10);		
	}
	return flag;
}
///Öмä²ãend


///¼Ä´æÆ÷²Ù×÷
static uint8 spi_send_byte(uint8 byte)
{
	while (SPI_I2S_GetFlagStatus(LD3320SPI, SPI_I2S_FLAG_TXE) == RESET);
	SPI_I2S_SendData(LD3320SPI,byte);
	while (SPI_I2S_GetFlagStatus(LD3320SPI,SPI_I2S_FLAG_RXNE) == RESET);
	return SPI_I2S_ReceiveData(LD3320SPI);
}

static void LD_WriteReg(uint8 data1,uint8 data2)
{
	LD_CS_L();
	LD_SPIS_L();
	spi_send_byte(0x04);
	spi_send_byte(data1);
	spi_send_byte(data2);
	LD_CS_H();
}

static uint8 LD_ReadReg(uint8 reg_add)
{
	uint8 i;
	LD_CS_L();
	LD_SPIS_L();
	spi_send_byte(0x05);
	spi_send_byte(reg_add);
	i=spi_send_byte(0x00);
	LD_CS_H();
	return(i);
}

static uint8 LD_GetResult(void)
{
	return LD_ReadReg(0xc5);
}

static uint8 LD_AsrRun(void)
{
	LD_WriteReg(0x35, MIC_VOL);
	LD_WriteReg(0x1C, 0x09);
	LD_WriteReg(0xBD, 0x20);
	LD_WriteReg(0x08, 0x01);
	LD3320_delay( 5 );
	LD_WriteReg(0x08, 0x00);
	LD3320_delay( 5);

	if(LD_Check_ASRBusyFlag_b2() == 0)
	{
		return 0;
	}

	LD_WriteReg(0xB2, 0xff);	
	LD_WriteReg(0x37, 0x06);
	LD_WriteReg(0x37, 0x06);
	LD3320_delay(5);
	LD_WriteReg(0x1C, 0x0b);
	LD_WriteReg(0x29, 0x10);
	LD_WriteReg(0xBD, 0x00);   
	return 1;
}

static void ProcessInt(void)
{
	uint8 nAsrResCount=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
}

static void LD_Init_Common(void)
{
	LD_ReadReg(0x06);  
	LD_WriteReg(0x17, 0x35); 
	LD3320_delay(5);
	LD_ReadReg(0x06);  

	LD_WriteReg(0x89, 0x03);  
	LD3320_delay(5);
	LD_WriteReg(0xCF, 0x43);   
	LD3320_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);
	}
	LD3320_delay(5);
	
	LD_WriteReg(0xCD, 0x04);
	LD_WriteReg(0x17, 0x4c); 
	LD3320_delay(1);
	LD_WriteReg(0xB9, 0x00);
	LD_WriteReg(0xCF, 0x4F); 
	LD_WriteReg(0x6F, 0xFF); 
}

static void LD_Init_ASR(void)
{
	nLD_Mode=LD_MODE_ASR_RUN;
	LD_Init_Common();

	LD_WriteReg(0xBD, 0x00);
	LD_WriteReg(0x17, 0x48);	
	LD3320_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); 
	LD3320_delay( 1 );
}
///¼Ä´æÆ÷²Ù×÷ end
/*********************************************END OF FILE**********************/

代码太多了,我就不写出来咯,自行可以去程序里面看。在资料里有单独的nsy6288、MP3、LD3320的一些单一代码,直接修改一下就能移植。有些代码的注释没有修改到,是错误的。看的时候注意一下就好。

6、视频
https://www.bilibili.com/video/BV1Fq4y147Rm/ 哔哩哔哩

7、资料
资料下载

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我就是丰兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值