找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3027|回复: 2
打印 上一主题 下一主题
收起左侧

LD3320的STM32测试源代码

[复制链接]
跳转到指定楼层
楼主
ID:325874 发表于 2018-8-20 02:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是LD3320的测试代码

单片机源程序如下:
  1. #include "LD3320.h"

  2. /************************************************************************************
  3. //        nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  4. //        LD_ASR_NONE:                        表示没有在作ASR识别
  5. //        LD_ASR_RUNING:                表示LD3320正在作ASR识别中
  6. //        LD_ASR_FOUNDOK:                表示一次识别流程结束后,有一个识别结果
  7. //        LD_ASR_FOUNDZERO:        表示一次识别流程结束后,没有识别结果
  8. //        LD_ASR_ERROR:                        表示一次识别流程中LD3320芯片内部出现不正确的状态
  9. *********************************************************************************/
  10. uint8 nAsrStatus = 0;       
  11. uint8 nLD_Mode = LD_MODE_IDLE;//用来记录当前是在进行ASR识别还是在播放MP3
  12. uint8 ucRegVal;

  13. ///用户修改
  14. void LD3320_main(void)
  15. {
  16.         uint8 nAsrRes=0;
  17.         LD3320_init();          
  18.         printf("1、流水灯\r\n");
  19.         printf("2、闪烁\r\n");                                
  20.         printf("3、按键触发\r\n");                
  21.         printf("4、全灭\r\n");                        
  22.         printf("5、状态\r\n");                
  23.         nAsrStatus = LD_ASR_NONE;//初始状态:没有在作ASR

  24.         while(1)
  25.         {
  26.                 switch(nAsrStatus)
  27.                 {
  28.                         case LD_ASR_RUNING:
  29.                         case LD_ASR_ERROR:               
  30.                                         break;
  31.                         case LD_ASR_NONE:
  32.                                         nAsrStatus=LD_ASR_RUNING;
  33.                                         if (RunASR()==0)//启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
  34.                                         {               
  35.                                                 nAsrStatus = LD_ASR_ERROR;
  36.                                         }
  37.                                         break;
  38.                         case LD_ASR_FOUNDOK:
  39.                                          nAsrRes = LD_GetResult( );//一次ASR识别流程结束,去取ASR识别结果                                                                                 
  40.                                          printf("\r\n识别码:%d", nAsrRes);                                        
  41.                                                                
  42.                                          switch(nAsrRes)                                           //对结果执行相关操作,客户修改
  43.                                                 {
  44.                                                         case CODE_LSD:                                        //命令“流水灯”
  45.                                                                 printf(" 流水灯 指令识别成功\r\n");
  46.                                                                                                                          break;
  47.                                                         case CODE_SS:                                                 //命令“闪烁”
  48.                                                                 printf(" 闪烁 指令识别成功\r\n");
  49.                                                                                                                          break;
  50.                                                         case CODE_AJCF:                                        //命令“按键触发”
  51.                                                                 printf(" 按键触发 指令识别成功\r\n");
  52.                                                                                                                         break;
  53.                                                         case CODE_QM:                                                //命令“全灭”
  54.                                                                 printf(" 全灭 指令识别成功\r\n");
  55.                                                                                                                         break;
  56.                                                         case CODE_JT:                                                //命令“状态”
  57.                                                                 printf(" 状态 指令识别成功\r\n");
  58.                                                        
  59.                                                         default:break;
  60.                                                 }       
  61.                                         nAsrStatus = LD_ASR_NONE;
  62.                                         break;
  63.                         case LD_ASR_FOUNDZERO:
  64.                         default:
  65.                                         nAsrStatus = LD_ASR_NONE;
  66.                                         break;
  67.                         }//switch
  68.                 //开发板测试
  69.                 Board_text(nAsrRes );
  70.         }// while
  71. }

  72. static uint8 LD_AsrAddFixed(void)
  73. {
  74.         uint8 k, flag;
  75.         uint8 nAsrAddLength;
  76.         #define DATE_A 5    //数组二维数值
  77.         #define DATE_B 20                //数组一维数值
  78.         //添加关键词,用户修改
  79.         uint8  sRecog[DATE_A][DATE_B] = {
  80.                                  "liu shui deng",\
  81.                                 "shan shuo",\
  82.                                 "an jian chu fa",\
  83.                                 "quan mie",\
  84.                                 "zhuang tai"\
  85.                
  86.                                                                                                                                         };       
  87.         uint8  pCode[DATE_A] = {
  88.                                                                                                                                  CODE_LSD,        \
  89.                                                                                                                                 CODE_SS,        \
  90.                                                                                                                                 CODE_AJCF,\
  91.                                                                                                                                 CODE_QM,        \
  92.                                                                                                                                 CODE_JT                \
  93.                                                                                                                         };        //添加识别码,用户修改
  94.         flag = 1;
  95.         for (k=0; k<DATE_A; k++)
  96.         {                       
  97.                 if(LD_Check_ASRBusyFlag_b2() == 0)
  98.                 {
  99.                         flag = 0;
  100.                         break;
  101.                 }

  102.                 LD_WriteReg(0xc1, pCode[k] );
  103.                 LD_WriteReg(0xc3, 0);
  104.                 LD_WriteReg(0x08, 0x04);
  105.                 LD3320_delay(1);
  106.                 LD_WriteReg(0x08, 0x00);
  107.                 LD3320_delay(1);

  108.                 for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
  109.                 {
  110.                         if (sRecog[k][nAsrAddLength] == 0)
  111.                                 break;
  112.                         LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
  113.                 }
  114.                 LD_WriteReg(0xb9, nAsrAddLength);
  115.                 LD_WriteReg(0xb2, 0xff);
  116.                 LD_WriteReg(0x37, 0x04);
  117.         }         
  118.         return flag;
  119. }

  120. static void Board_text(uint8 Code_Val)
  121. {                                                                                                                                                                         
  122.         switch(Code_Val)  //对结果执行相关操作
  123.         {
  124.                 case CODE_LSD:  //命令“流水灯”
  125.                         Glide_LED();
  126.                 break;
  127.                 case CODE_SS:          //命令“闪烁”
  128.                         Flicker_LED();
  129.                 break;
  130.                 case CODE_AJCF:        //命令“按键触发”
  131.                         Key_LED();
  132.                 break;
  133.                 case CODE_QM:                //命令“全灭”
  134.                         Off_LED();
  135.                 break;
  136.                 case CODE_JT:                //命令“状态”
  137.                         Jt_LED();
  138.                 break;
  139.                 default:break;
  140.         }       
  141. }

  142. static void Delayms(uint16 i)
  143. {
  144.         unsigned char a,b;
  145.         for(;i>0;i--)
  146.                 for(b=4;b>0;b--)
  147.                     for(a=113;a>0;a--);       
  148. }

  149. static void Glide_LED(void)
  150. {
  151.         LED1_ON();
  152.         Delayms(0xfff);
  153.         LED2_ON();
  154.         Delayms(0xfff);
  155.         LED3_ON();
  156.         Delayms(0xfff);
  157.         LED4_ON();
  158.         Delayms(0xfff);
  159.         LED1_OFF();
  160.         Delayms(0xfff);
  161.         LED2_OFF();
  162.         Delayms(0xfff);
  163.         LED3_OFF();
  164.         Delayms(0xfff);
  165.         LED4_OFF();
  166.         Delayms(0xfff);
  167. }

  168. static void Flicker_LED(void)
  169. {
  170.         LED1_ON();
  171.         LED2_ON();
  172.         Delayms(0XFFF);
  173.         LED1_OFF();
  174.         LED2_OFF();
  175.         Delayms(0XFFF);
  176. }

  177. static void Key_LED(void)
  178. {
  179.         LED3_ON();
  180.         Delayms(0XFFF);
  181.         LED3_OFF();
  182.         Delayms(0XFFF);

  183. }

  184. static void Off_LED(void)
  185. {
  186.         LED1_OFF();
  187.         LED2_OFF();
  188.         LED3_OFF();
  189.         LED4_OFF();
  190. }

  191. static void Jt_LED(void)
  192. {
  193.         LED4_ON();
  194.         Delayms(0XFFF);
  195.         LED4_OFF();
  196.         Delayms(0XFFF);
  197. }
  198. ///用户修改 end

  199. ///相关初始化
  200. static void LD3320_init(void)
  201. {
  202.         LD3320_GPIO_Cfg();       
  203.         LD3320_EXTI_Cfg();
  204.         LD3320_SPI_cfg();
  205.         LED_GPIO_cfg();
  206.         LD_reset();
  207. }

  208. static void LD3320_GPIO_Cfg(void)
  209. {       
  210.                 GPIO_InitTypeDef GPIO_InitStructure;
  211.                 RCC_APB2PeriphClockCmd(LD3320RST_GPIO_CLK | LD3320CS_GPIO_CLK,ENABLE);
  212.                 //LD_CS        /RSET
  213.                 GPIO_InitStructure.GPIO_Pin =LD3320CS_PIN;
  214.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  215.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  216.                 GPIO_Init(LD3320CS_GPIO_PORT,&GPIO_InitStructure);
  217.                 GPIO_InitStructure.GPIO_Pin =LD3320RST_PIN;
  218.                 GPIO_Init(LD3320RST_GPIO_PORT,&GPIO_InitStructure);
  219. }

  220. static void LD3320_EXTI_Cfg(void)
  221. {
  222.   EXTI_InitTypeDef EXTI_InitStructure;
  223.         NVIC_InitTypeDef NVIC_InitStructure;
  224.   GPIO_InitTypeDef GPIO_InitStructure;
  225.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);       

  226.         RCC_APB2PeriphClockCmd(LD3320IRQ_GPIO_CLK, ENABLE);
  227.   GPIO_InitStructure.GPIO_Pin =LD3320IRQ_PIN;
  228.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  229.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  230.   GPIO_Init(LD3320IRQ_GPIO_PORT, &GPIO_InitStructure);
  231.         //外部中断线配置
  232.   GPIO_EXTILineConfig(LD3320IRQEXIT_PORTSOURCE, LD3320IRQPINSOURCE);
  233.   EXTI_InitStructure.EXTI_Line = LD3320IRQEXITLINE;
  234.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  235.   EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  236.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  237.   EXTI_Init(&EXTI_InitStructure);
  238.         //中断嵌套配置
  239.   NVIC_InitStructure.NVIC_IRQChannel = LD3320IRQN;
  240.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  241.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  242.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  243.   NVIC_Init(&NVIC_InitStructure);
  244. }

  245. static void LD3320_SPI_cfg(void)
  246. {
  247.         SPI_InitTypeDef  SPI_InitStructure;
  248.         GPIO_InitTypeDef GPIO_InitStructure;
  249.   //spi端口配置
  250.         RCC_APB2PeriphClockCmd(LD3320SPI_CLK,ENABLE);               
  251.   RCC_APB2PeriphClockCmd(LD3320WR_GPIO_CLK | LD3320SPIMISO_GPIO_CLK | LD3320SPIMOSI_GPIO_CLK | LD3320SPISCK_GPIO_CLK,ENABLE);
  252.        
  253.         GPIO_InitStructure.GPIO_Pin = LD3320SPIMISO_PIN;
  254.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  255.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  256.         GPIO_Init(LD3320SPIMISO_GPIO_PORT,&GPIO_InitStructure);
  257.        
  258.         GPIO_InitStructure.GPIO_Pin = LD3320SPIMOSI_PIN;
  259.         GPIO_Init(LD3320SPIMOSI_GPIO_PORT,&GPIO_InitStructure);

  260.         GPIO_InitStructure.GPIO_Pin = LD3320SPISCK_PIN;
  261.         GPIO_Init(LD3320SPISCK_GPIO_PORT,&GPIO_InitStructure);
  262.        
  263.         GPIO_InitStructure.GPIO_Pin = LD3320WR_PIN;                               
  264.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  265.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  266.         GPIO_Init(LD3320WR_GPIO_PORT, &GPIO_InitStructure);
  267.        
  268.         LD_CS_H();
  269.        
  270.         SPI_Cmd(LD3320SPI, DISABLE);

  271.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;           //全双工
  272.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                                                                   //主模式
  273.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                                   //8位
  274.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                                                                           //时钟极性 空闲状态时,SCK保持低电平
  275.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                                                                   //时钟相位 数据采样从第一个时钟边沿开始
  276.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                                                   //软件产生NSS
  277.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //波特率控制 SYSCLK/128
  278.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                                           //数据高位在前
  279.         SPI_InitStructure.SPI_CRCPolynomial = 7;                                                                                                                   //CRC多项式寄存器初始值为7
  280.         SPI_Init(LD3320SPI, &SPI_InitStructure);

  281.         SPI_Cmd(LD3320SPI, ENABLE);
  282. }

  283. static void LED_GPIO_cfg(void)
  284. {       
  285.                 GPIO_InitTypeDef GPIO_InitStructure;
  286.        
  287.                 RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK,ENABLE);
  288.        
  289.                 GPIO_InitStructure.GPIO_Pin = LED1_PIN;
  290.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  291.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  292.                 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
  293.                 GPIO_InitStructure.GPIO_Pin = LED2_PIN;
  294.                 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
  295.                 GPIO_InitStructure.GPIO_Pin = LED3_PIN;
  296.                 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
  297.                 GPIO_InitStructure.GPIO_Pin = LED4_PIN;
  298.                 GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);       
  299.        
  300.                 LED1_OFF();
  301.                 LED2_OFF();
  302.                 LED3_OFF();
  303.                 LED4_OFF();
  304. }
  305. ///相关初始化 end

  306. ///中间层
  307. void EXTI15_10_IRQHandler(void)
  308. {
  309.         if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET )
  310.         {
  311.                 ProcessInt();
  312.                 printf("进入中断12\r\n");       
  313.                 EXTI_ClearFlag(LD3320IRQEXITLINE);
  314.                 EXTI_ClearITPendingBit(LD3320IRQEXITLINE);//清除LINE上的中断标志位  
  315.         }
  316. }

  317. static void LD3320_delay(unsigned long uldata)
  318. {
  319.         unsigned int i  =  0;
  320.         unsigned int j  =  0;
  321.         unsigned int k  =  0;
  322.         for (i=0;i<5;i++)
  323.         {
  324.                 for (j=0;j<uldata;j++)
  325.                 {
  326.                         k = 200;
  327.                         while(k--);
  328.                 }
  329.         }
  330. }

  331. static uint8 RunASR(void)
  332. {
  333.         uint8 i=0;
  334.         uint8 asrflag=0;
  335.         for (i=0; i<5; i++)                //防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  336.         {
  337.                 LD_AsrStart();                        //初始化ASR
  338.                 LD3320_delay(100);
  339.                 if (LD_AsrAddFixed()==0)        //添加关键词语到LD3320芯片中
  340.                 {
  341.                         LD_reset();                                //LD3320芯片内部出现不正常,立即重启LD3320芯片
  342.                         LD3320_delay(50);        //并从初始化开始重新ASR识别流程
  343.                         continue;
  344.                 }
  345.                 LD3320_delay(10);
  346.                 if (LD_AsrRun() == 0)
  347.                 {
  348.                         LD_reset();                         //LD3320芯片内部出现不正常,立即重启LD3320芯片
  349.                         LD3320_delay(50);//并从初始化开始重新ASR识别流程
  350.                         continue;
  351.                 }
  352.                 asrflag=1;
  353.                 break;                                                //ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  354.         }       
  355.         return asrflag;
  356. }

  357. static void LD_reset(void)
  358. {
  359.         LD_RST_H();
  360.         LD3320_delay(100);
  361.         LD_RST_L();
  362.         LD3320_delay(100);
  363.         LD_RST_H();
  364.         LD3320_delay(100);
  365.         LD_CS_L();
  366.         LD3320_delay(100);
  367.         LD_CS_H();               
  368.         LD3320_delay(100);
  369. }

  370. static void LD_AsrStart(void)
  371. {
  372.         LD_Init_ASR();
  373. }

  374. uint8 LD_Check_ASRBusyFlag_b2(void)
  375. {
  376.         uint8 j;
  377.         uint8 flag = 0;
  378.         for (j=0; j<10; j++)
  379.         {
  380.                 if (LD_ReadReg(0xb2) == 0x21)
  381.                 {
  382.                         flag = 1;
  383.                         break;
  384.                 }
  385.                 LD3320_delay(10);               
  386.         }
  387.         return flag;
  388. }
  389. ///中间层end


  390. ///寄存器操作
  391. static uint8 spi_send_byte(uint8 byte)
  392. {
  393.         while (SPI_I2S_GetFlagStatus(LD3320SPI, SPI_I2S_FLAG_TXE) == RESET);
  394.         SPI_I2S_SendData(LD3320SPI,byte);
  395.         while (SPI_I2S_GetFlagStatus(LD3320SPI,SPI_I2S_FLAG_RXNE) == RESET);
  396.         return SPI_I2S_ReceiveData(LD3320SPI);
  397. }

  398. static void LD_WriteReg(uint8 data1,uint8 data2)
  399. {
  400.         LD_CS_L();
  401.         LD_SPIS_L();
  402.         spi_send_byte(0x04);
  403.         spi_send_byte(data1);
  404.         spi_send_byte(data2);
  405.         LD_CS_H();
  406. }

  407. static uint8 LD_ReadReg(uint8 reg_add)
  408. {
  409.         uint8 i;
  410.         LD_CS_L();
  411.         LD_SPIS_L();
  412.         spi_send_byte(0x05);
  413.         spi_send_byte(reg_add);
  414.         i=spi_send_byte(0x00);
  415.         LD_CS_H();
  416.         return(i);
  417. }

  418. static uint8 LD_GetResult(void)
  419. {
  420.         return LD_ReadReg(0xc5);
  421. }

  422. static uint8 LD_AsrRun(void)
  423. {
  424.         LD_WriteReg(0x35, MIC_VOL);
  425.         LD_WriteReg(0x1C, 0x09);
  426.         LD_WriteReg(0xBD, 0x20);
  427.         LD_WriteReg(0x08, 0x01);
  428.         LD3320_delay( 5 );
  429.         LD_WriteReg(0x08, 0x00);
  430.         LD3320_delay( 5);

  431.         if(LD_Check_ASRBusyFlag_b2() == 0)
  432.         {
  433.                 return 0;
  434.         }

  435.         LD_WriteReg(0xB2, 0xff);       
  436.         LD_WriteReg(0x37, 0x06);
  437.         LD_WriteReg(0x37, 0x06);
  438.         LD3320_delay(5);
  439.         LD_WriteReg(0x1C, 0x0b);
  440.         LD_WriteReg(0x29, 0x10);
  441.         LD_WriteReg(0xBD, 0x00);   
  442.         return 1;
  443. }

  444. static void ProcessInt(void)
  445. {
  446.         uint8 nAsrResCount=0;

  447.         ucRegVal = LD_ReadReg(0x2B);

  448. // 语音识别产生的中断
  449. //(有声音输入,不论识别成功或失败都有中断)
  450.         LD_WriteReg(0x29,0) ;
  451.         LD_WriteReg(0x02,0) ;

  452.         if((ucRegVal & 0x10) && LD_ReadReg(0xb2)==0x21 && LD_ReadReg(0xbf)==0x35)               
  453.         {         
  454.                         nAsrResCount = LD_ReadReg(0xba);

  455.                         if(nAsrResCount>0 && nAsrResCount<=4)
  456.                         {
  457.                                 nAsrStatus=LD_ASR_FOUNDOK;                                
  458.                         }
  459.                         else
  460.                         {
  461.                                 nAsrStatus=LD_ASR_FOUNDZERO;
  462.                         }       
  463.         }
  464.         else
  465.         {
  466.                 nAsrStatus=LD_ASR_FOUNDZERO;//执行没有识别
  467.         }

  468.         LD_WriteReg(0x2b,0);
  469.         LD_WriteReg(0x1C,0);//写0:ADC不可用
  470.         LD_WriteReg(0x29,0);
  471.         LD_WriteReg(0x02,0);
  472.         LD_WriteReg(0x2B,0);
  473.         LD_WriteReg(0xBA,0);       
  474.         LD_WriteReg(0xBC,0);       
  475.         LD_WriteReg(0x08,1);//清除FIFO_DATA
  476.         LD_WriteReg(0x08,0);//清除FIFO_DATA后 再次写0
  477. }
  478. ……………………

  479. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
UNV-LD3320 基本识别工程-STM32F103ZET6.rar (306.4 KB, 下载次数: 38)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:325874 发表于 2018-8-20 02:44 | 只看该作者
这是STM32F103ZET6的代码
回复

使用道具 举报

板凳
ID:509983 发表于 2019-4-12 12:30 | 只看该作者
请问stm32和ld3320怎么接线?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表