這是LD3320的測試代碼
單片機源程序如下:
- #include "LD3320.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;
- ///用戶修改
- void LD3320_main(void)
- {
- uint8 nAsrRes=0;
- LD3320_init();
- printf("1、流水燈\r\n");
- printf("2、閃爍\r\n");
- printf("3、按鍵觸發\r\n");
- printf("4、全滅\r\n");
- printf("5、狀態\r\n");
- nAsrStatus = LD_ASR_NONE;//初始狀態:沒有在作ASR
- while(1)
- {
- switch(nAsrStatus)
- {
- case LD_ASR_RUNING:
- case LD_ASR_ERROR:
- break;
- case LD_ASR_NONE:
- nAsrStatus=LD_ASR_RUNING;
- if (RunASR()==0)//啟動一次ASR識別流程:ASR初始化,ASR添加關鍵詞語,啟動ASR運算
- {
- nAsrStatus = LD_ASR_ERROR;
- }
- break;
- case LD_ASR_FOUNDOK:
- nAsrRes = LD_GetResult( );//一次ASR識別流程結束,去取ASR識別結果
- printf("\r\n識別碼:%d", nAsrRes);
-
- switch(nAsrRes) //對結果執行相關操作,客戶修改
- {
- case CODE_LSD: //命令“流水燈”
- printf(" 流水燈 指令識別成功\r\n");
- break;
- case CODE_SS: //命令“閃爍”
- printf(" 閃爍 指令識別成功\r\n");
- break;
- case CODE_AJCF: //命令“按鍵觸發”
- printf(" 按鍵觸發 指令識別成功\r\n");
- break;
- case CODE_QM: //命令“全滅”
- printf(" 全滅 指令識別成功\r\n");
- break;
- case CODE_JT: //命令“狀態”
- printf(" 狀態 指令識別成功\r\n");
-
- default:break;
- }
- nAsrStatus = LD_ASR_NONE;
- break;
- case LD_ASR_FOUNDZERO:
- default:
- nAsrStatus = LD_ASR_NONE;
- break;
- }//switch
- //開發板測試
- Board_text(nAsrRes );
- }// while
- }
- static uint8 LD_AsrAddFixed(void)
- {
- uint8 k, flag;
- uint8 nAsrAddLength;
- #define DATE_A 5 //數組二維數值
- #define DATE_B 20 //數組一維數值
- //添加關鍵詞,用戶修改
- uint8 sRecog[DATE_A][DATE_B] = {
- "liu shui deng",\
- "shan shuo",\
- "an jian chu fa",\
- "quan mie",\
- "zhuang tai"\
-
- };
- uint8 pCode[DATE_A] = {
- CODE_LSD, \
- CODE_SS, \
- CODE_AJCF,\
- CODE_QM, \
- CODE_JT \
- }; //添加識別碼,用戶修改
- 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;
- }
- static void Board_text(uint8 Code_Val)
- {
- switch(Code_Val) //對結果執行相關操作
- {
- case CODE_LSD: //命令“流水燈”
- Glide_LED();
- break;
- case CODE_SS: //命令“閃爍”
- Flicker_LED();
- break;
- case CODE_AJCF: //命令“按鍵觸發”
- Key_LED();
- break;
- case CODE_QM: //命令“全滅”
- Off_LED();
- break;
- case CODE_JT: //命令“狀態”
- Jt_LED();
- break;
- default:break;
- }
- }
- static void Delayms(uint16 i)
- {
- unsigned char a,b;
- for(;i>0;i--)
- for(b=4;b>0;b--)
- for(a=113;a>0;a--);
- }
- static void Glide_LED(void)
- {
- LED1_ON();
- Delayms(0xfff);
- LED2_ON();
- Delayms(0xfff);
- LED3_ON();
- Delayms(0xfff);
- LED4_ON();
- Delayms(0xfff);
- LED1_OFF();
- Delayms(0xfff);
- LED2_OFF();
- Delayms(0xfff);
- LED3_OFF();
- Delayms(0xfff);
- LED4_OFF();
- Delayms(0xfff);
- }
- static void Flicker_LED(void)
- {
- LED1_ON();
- LED2_ON();
- Delayms(0XFFF);
- LED1_OFF();
- LED2_OFF();
- Delayms(0XFFF);
- }
- static void Key_LED(void)
- {
- LED3_ON();
- Delayms(0XFFF);
- LED3_OFF();
- Delayms(0XFFF);
- }
- static void Off_LED(void)
- {
- LED1_OFF();
- LED2_OFF();
- LED3_OFF();
- LED4_OFF();
- }
- static void Jt_LED(void)
- {
- LED4_ON();
- Delayms(0XFFF);
- LED4_OFF();
- Delayms(0XFFF);
- }
- ///用戶修改 end
- ///相關初始化
- static void LD3320_init(void)
- {
- LD3320_GPIO_Cfg();
- LD3320_EXTI_Cfg();
- LD3320_SPI_cfg();
- LED_GPIO_cfg();
- LD_reset();
- }
- static void LD3320_GPIO_Cfg(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(LD3320RST_GPIO_CLK | LD3320CS_GPIO_CLK,ENABLE);
- //LD_CS /RSET
- GPIO_InitStructure.GPIO_Pin =LD3320CS_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(LD3320CS_GPIO_PORT,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin =LD3320RST_PIN;
- GPIO_Init(LD3320RST_GPIO_PORT,&GPIO_InitStructure);
- }
- 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 = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- 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);
- }
- static void LED_GPIO_cfg(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = LED1_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LED2_PIN;
- GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LED3_PIN;
- GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LED4_PIN;
- GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);
-
- LED1_OFF();
- LED2_OFF();
- LED3_OFF();
- LED4_OFF();
- }
- ///相關初始化 end
- ///中間層
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET )
- {
- ProcessInt();
- printf("進入中斷12\r\n");
- 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();
- LD3320_delay(100);
- LD_RST_L();
- LD3320_delay(100);
- LD_RST_H();
- LD3320_delay(100);
- LD_CS_L();
- LD3320_delay(100);
- LD_CS_H();
- 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
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
UNV-LD3320 基本識別工程-STM32F103ZET6.rar
(306.4 KB, 下載次數: 38)
2018-8-20 17:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|