找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于MSP430单片机的LD3320源代码

[复制链接]
跳转到指定楼层
楼主
ID:504530 发表于 2019-4-4 00:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
直接下载附件吧,兄弟们,程序里面都有,关于MSP430的LD3320代码

单片机源程序如下:
  1. #include "main.h"
  2. uint8   nLD_Mode = LD_MODE_IDLE;                //        用来记录当前是在进行ASR识别还是在播放MP3

  3. unsigned char  ucRegVal;
  4. unsigned char ucHighInt;
  5. unsigned char ucLowInt;

  6. /*****************************************
  7. 函数功能 ;LD3320外部中断初始化P1_6
  8. 入口参数:无
  9. 出口参数:无
  10. ******************************************/
  11. void LD3320_EXTERINT_Init()
  12. {
  13.   P1SEL&=~BIT6;
  14.   P1DIR&=~BIT6;
  15.   P1REN|=BIT6;
  16.   P1OUT|=BIT6;
  17.   P1IES|=BIT6;
  18.   P1IE|=BIT6;
  19.   P1IFG&=~BIT6;
  20. }
  21. /*****************************************
  22. 函数功能 ;LD3320控制端口初始化
  23. 入口参数:无
  24. 出口参数:无
  25. ******************************************/

  26. void LD3320_Port_Init()
  27. {
  28.     P7OUT|=(BIT3+BIT4+BIT5+BIT6+BIT7);
  29.     P7REN|=(BIT3+BIT4+BIT5+BIT6+BIT7);
  30.     P7DIR|=(BIT3+BIT4+BIT5+BIT6+BIT7);
  31.     DIR_LD_CS_OUT;
  32.     DIR_LD_CLK_OUT;
  33.     DIR_LD_DI_OUT;
  34.     DIR_LD_DO_IN;
  35.     DIR_LD_RST_OUT;
  36.     DIR_LD_SPIS_OUT;   
  37. }
  38. /*****************************************
  39. 函数功能 ;LD3320  SPI通信测试
  40. 入口参数:无
  41. 出口参数:无
  42. ******************************************/
  43. void Test_Information()
  44. {
  45.     //测试读写是否正常
  46.         LD_reset();
  47.       LD_ReadReg(0x06);
  48.       LD_WriteReg(0x35, 0x33);
  49.       LD_WriteReg(0x1b, 0x55);
  50.       LD_WriteReg(0xb3, 0xaa);
  51.       nAsrRes=(LD_ReadReg(0x35));
  52.       nAsrRes=(LD_ReadReg(0x1b));
  53.       nAsrRes=(LD_ReadReg(0xb3));
  54.       
  55.       //测试寄存器初始值是否正常
  56.              LD_reset();
  57.       nAsrRes=(LD_ReadReg(0x06));
  58.       nAsrRes=(LD_ReadReg(0x06));
  59.       nAsrRes=(LD_ReadReg(0x35));
  60.       nAsrRes=(LD_ReadReg(0xb3));
  61. }
  62. /*****************************************
  63. 函数功能 ;LD3320写函数
  64. 入口参数:address   LD3320地址
  65.           dataout   LD3320数据
  66. 出口参数:无
  67. ******************************************/
  68. void LD_WriteReg( unsigned char address, unsigned char dataout )
  69.                 {
  70.                             unsigned char i = 0;
  71.                         unsigned char command=0x04;
  72.                         CLR_LD_CS;//打开片选
  73.                          __delay_cycles(500);
  74.                          ///////////////////////写命令
  75.                          for(i=0;i<8;i++)
  76.                          {
  77.                              if ((command & 0x80)>0)
  78.                                  SET_LD_DI;
  79.                              else
  80.                                  CLR_LD_DI;
  81.                              __delay_cycles(500);
  82.                              CLR_LD_CLK;
  83.                              command = (command << 1);  
  84.                               __delay_cycles(500);
  85.                               SET_LD_CLK;
  86.                          }
  87.                          /////////////////////写地址
  88.                           for(i=0;i<8;i++)
  89.                          {
  90.                              if ((address & 0x80) >0)
  91.                                  SET_LD_DI;
  92.                              else
  93.                                  CLR_LD_DI;
  94.                              __delay_cycles(500);
  95.                              CLR_LD_CLK;
  96.                              address = (address << 1);  
  97.                               __delay_cycles(500);
  98.                               SET_LD_CLK;
  99.                          }
  100.                          //////////////////////写数据
  101.                           for(i=0;i<8;i++)
  102.                          {
  103.                              if ((dataout & 0x80) >0)
  104.                                  SET_LD_DI;
  105.                              else
  106.                                  CLR_LD_DI;
  107.                              __delay_cycles(500);
  108.                              CLR_LD_CLK;
  109.                              dataout = (dataout << 1);  
  110.                               __delay_cycles(500);
  111.                               SET_LD_CLK;
  112.                          }
  113.                         
  114.                           __delay_cycles(500);
  115.                      SET_LD_CS;//关闭片选
  116.                         
  117.                 }
  118. /*****************************************
  119. 函数功能 ;LD3320读函数
  120. 入口参数:address   LD3320地址
  121. 出口参数:datain    LD3320读出的收据
  122. ******************************************/
  123. unsigned char LD_ReadReg( unsigned char address )
  124.                 {
  125.                         unsigned char i = 0;
  126.                         unsigned char datain =0 ;
  127.                         unsigned char command=0x05;
  128.                         CLR_LD_CS;//打开片选
  129.                          __delay_cycles(2000);
  130.                         ///////////////////////写命令
  131.                          for(i=0;i<8;i++)
  132.                          {
  133.                              if ((command & 0x80)>0)
  134.                                  SET_LD_DI;
  135.                              else
  136.                                  CLR_LD_DI;
  137.                              __delay_cycles(2000);
  138.                              CLR_LD_CLK;
  139.                              command = (command << 1);  
  140.                               __delay_cycles(2000);
  141.                               SET_LD_CLK;
  142.                          }
  143.                          /////////////////////写地址
  144.                           for(i=0;i<8;i++)
  145.                          {
  146.                              if ((address & 0x80) >0)
  147.                                  SET_LD_DI;
  148.                              else
  149.                                  CLR_LD_DI;
  150.                              __delay_cycles(2000);
  151.                              CLR_LD_CLK;
  152.                              address = (address << 1);  
  153.                               __delay_cycles(2000);
  154.                               SET_LD_CLK;
  155.                               __delay_cycles(2000);
  156.                          }
  157.                          /////////////////////读数据
  158.                          DIR_LD_DO_IN;
  159.                          for(i=0;i<8;i++)
  160.                          {
  161.                              datain = datain << 1;
  162.                              CLR_LD_CLK;
  163.                               if(LD_DO)  datain|=0x01;
  164.                               __delay_cycles(200);
  165.                               SET_LD_CLK;
  166.                               __delay_cycles(200);
  167.                          }
  168.                      __delay_cycles(2000);
  169.                      SET_LD_CS;//关闭片选
  170.                      return datain;
  171.                 }

  172. /*****************************************
  173. 函数功能 ;LD3320复位函数
  174. 入口参数:无
  175. 出口参数:无
  176. ******************************************/
  177. void LD_reset()
  178. {

  179.         
  180.         SET_LD_RST;
  181.         __delay_cycles(200);
  182.         CLR_LD_RST;
  183.         __delay_cycles(200);
  184.         SET_LD_RST;
  185.         __delay_cycles(200);
  186.         
  187.             CLR_LD_CS;
  188.         __delay_cycles(200);
  189.         SET_LD_CS;
  190.         __delay_cycles(200);
  191. }


  192. void LD_Init_Common()
  193. {
  194.         LD_ReadReg(0x06);  
  195.         LD_WriteReg(0x17, 0x35);
  196.         __delay_cycles(200);
  197.         LD_ReadReg(0x06);  

  198.         LD_WriteReg(0x89, 0x03);  
  199.         __delay_cycles(200);
  200.         LD_WriteReg(0xCF, 0x43);   
  201.         __delay_cycles(200);
  202.         LD_WriteReg(0xCB, 0x02);
  203.        
  204.         /*PLL setting*/
  205.         LD_WriteReg(0x11, LD_PLL_11);      
  206.    
  207.         LD_WriteReg(0x1E,0x00);
  208.         LD_WriteReg(0x19, LD_PLL_ASR_19);
  209.         LD_WriteReg(0x1B, LD_PLL_ASR_1B);               
  210.          LD_WriteReg(0x1D, LD_PLL_ASR_1D);
  211.         __delay_cycles(2000);
  212.        
  213.         LD_WriteReg(0xCD, 0x04);
  214.         LD_WriteReg(0x17, 0x4c);
  215.         __delay_cycles(200);
  216.         LD_WriteReg(0xB9, 0x00);
  217.         LD_WriteReg(0xCF, 0x4F);
  218.         LD_WriteReg(0x6F, 0xFF);
  219. }
  220. void LD_Init_ASR()
  221. {
  222.         nLD_Mode=LD_MODE_ASR_RUN;
  223.         LD_Init_Common();

  224.         LD_WriteReg(0xBD, 0x00);
  225.         LD_WriteReg(0x17, 0x48);
  226.         __delay_cycles(200);

  227.         LD_WriteReg(0x3C, 0x80);   
  228.         LD_WriteReg(0x3E, 0x07);
  229.         LD_WriteReg(0x38, 0xff);   
  230.         LD_WriteReg(0x3A, 0x07);
  231.        
  232.         LD_WriteReg(0x40, 0);         
  233.         LD_WriteReg(0x42, 8);
  234.         LD_WriteReg(0x44, 0);   
  235.         LD_WriteReg(0x46, 8);
  236.         __delay_cycles(200);
  237. }

  238. // Return 1: success.
  239. unsigned char LD_Check_ASRBusyFlag_b2()
  240. {
  241.         unsigned char j;
  242.         unsigned char flag = 0;
  243.         for (j=0; j<10; j++)
  244.         {
  245.                 if (LD_ReadReg(0xb2) == 0x21)
  246.                 {
  247.                         flag = 1;
  248.                         break;
  249.                 }
  250.                 __delay_cycles(200);       
  251.         }
  252.         return flag;
  253. }
  254. /************************************************************************
  255. 功能描述:         启动ASR
  256. 入口参数:        none
  257. 返 回 值:         none
  258. 其他说明:        none
  259. **************************************************************************/
  260. void LD_AsrStart()
  261. {
  262.         LD_Init_ASR();
  263. }
  264. // Return 1: success.
  265. unsigned char LD_AsrRun()
  266. {
  267.         LD_WriteReg(0x35, MIC_VOL);
  268.         LD_WriteReg(0x1C, 0x09);
  269.         LD_WriteReg(0xBD, 0x20);
  270.         LD_WriteReg(0x08, 0x01);
  271.         __delay_cycles(20000);       
  272.         LD_WriteReg(0x08, 0x00);
  273.         __delay_cycles(20000);       

  274.         if(LD_Check_ASRBusyFlag_b2() == 0)
  275.         {
  276.                 return 0;
  277.         }

  278.         LD_WriteReg(0xB2, 0xff);       
  279.         LD_WriteReg(0x37, 0x06);
  280.         
  281.         __delay_cycles(20000);       
  282.         LD_WriteReg(0x1C, 0x0b); //配置麦克风做为输入信号
  283.         //LD_WriteReg(0x1C, 0x07); //配置双通道音频信号做为输入信号
  284.         LD_WriteReg(0x29, 0x10);
  285.        
  286.         LD_WriteReg(0xBD, 0x00);
  287.         //EX0=1;
  288.         return 1;
  289. }

  290. /************************************************************************
  291. 功能描述:添加关键词,此处为用户修改部分
  292. 调用函数:
  293. 入口参数:
  294. 返回函数:
  295. **************************************************************************/
  296. // Return 1: success.
  297. //        添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法
  298. unsigned char LD_AsrAddFixed()
  299. {
  300. unsigned char k, flag;
  301.         uint8 nAsrAddLength;
  302.          //uint8 code sRecog[4][20] = {"","kai fa ban yan zheng", "dai ma ce shi","jian cha wan bi"};        /*添加关键词,用户修改*/
  303.          unsigned char  sRecog[4][20] = {"","wo shi", "ce shi cheng gong ","jian yan wan bi"};
  304.      unsigned char  pCode[4] = {0,CODE_KFBYZ, CODE_DMCS, CODE_JCWB};        /*添加识别码,用户修改*/       
  305.         flag = 1;
  306.         for (k=0; k<4; k++)
  307.         {
  308.                        
  309.                 if(LD_Check_ASRBusyFlag_b2() == 0)
  310.                 {
  311.                         flag = 0;
  312.                         break;
  313.                 }
  314.                
  315.                 LD_WriteReg(0xc1, pCode[k] );
  316.                 LD_WriteReg(0xc3, 0 );
  317.                 LD_WriteReg(0x08, 0x04);
  318.                 __delay_cycles(2000);
  319.                 LD_WriteReg(0x08, 0x00);
  320.                 __delay_cycles(2000);

  321.                 for (nAsrAddLength=0; nAsrAddLength<20; nAsrAddLength++)
  322.                 {
  323.                         if (sRecog[k][nAsrAddLength] == 0)
  324.                                 break;
  325.                         LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
  326.                 }
  327.                 LD_WriteReg(0xb9, nAsrAddLength);
  328.                 LD_WriteReg(0xb2, 0xff);
  329.                 LD_WriteReg(0x37, 0x04);
  330.         }
  331.     return flag;
  332. }


  333. /************************************************************************************/
  334. //        RunASR()函数实现了一次完整的ASR语音识别流程
  335. //        LD_Init_ASR() 函数实现了ASR初始化
  336. //        LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
  337. //        LD_AsrRun()        函数启动了一次ASR语音识别流程
  338. //
  339. //        任何一次ASR识别流程,都需要按照这个顺序,从初始化开始进行
  340. /************************************************************************************/
  341. unsigned char RunASR()
  342. {
  343.         unsigned char i=0;
  344.         unsigned char asrflag=0;
  345.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  346.         {
  347.                 LD_AsrStart();
  348.                 __delay_cycles(20000);
  349.                 if (LD_AsrAddFixed()==0)
  350.                 {
  351.                         LD_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  352.                         __delay_cycles(20000);                        //        并从初始化开始重新ASR识别流程
  353.                         continue;
  354.                 }
  355.                 __delay_cycles(20000);
  356.                 if (LD_AsrRun() == 0)
  357.                 {
  358.                         LD_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  359.                         __delay_cycles(20000);                        //        并从初始化开始重新ASR识别流程
  360.                         continue;
  361.                 }
  362.                 asrflag=1;
  363.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  364.         }

  365.         return asrflag;
  366. }

  367. /************************************************************************
  368. 功能描述: 获取识别结构
  369. 调用函数:
  370. 入口参数:
  371. 返回函数:
  372. **************************************************************************/
  373. unsigned char LD_GetResult()
  374. {               
  375.         return LD_ReadReg(0xc5 );
  376. }

  377. void ProcessInt0(void)
  378. {
  379.         uint8 nAsrResCount=0;

  380.         //EX0=0;
  381.         ucRegVal = LD_ReadReg(0x2B);
  382.         LD_WriteReg(0x29,0) ;
  383.         LD_WriteReg(0x02,0) ;
  384.         if((ucRegVal & 0x10) &&
  385.                 LD_ReadReg(0xb2)==0x21 &&
  386.                 LD_ReadReg(0xbf)==0x35)                        /*识别成功*/
  387. ……………………

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

所有资料51hei提供下载:
MSP430 源程序.zip (194.56 KB, 下载次数: 16)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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