久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1148|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

LD3320 MSP430驅(qū)動(dòng)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:690570 發(fā)表于 2020-3-1 00:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include "main.h"
  2. uint8   nLD_Mode = LD_MODE_IDLE;                //        用來(lái)記錄當(dāng)前是在進(jìn)行ASR識(shí)別還是在播放MP3

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

  6. /*****************************************
  7. 函數(shù)功能 ;LD3320外部中斷初始化P1_6
  8. 入口參數(shù):無(wú)
  9. 出口參數(shù):無(wú)
  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. 函數(shù)功能 ;LD3320控制端口初始化
  23. 入口參數(shù):無(wú)
  24. 出口參數(shù):無(wú)
  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. 函數(shù)功能 ;LD3320  SPI通信測(cè)試
  40. 入口參數(shù):無(wú)
  41. 出口參數(shù):無(wú)
  42. ******************************************/
  43. void Test_Information()
  44. {
  45.     //測(cè)試讀寫(xiě)是否正常
  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.       //測(cè)試寄存器初始值是否正常
  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. 函數(shù)功能 ;LD3320寫(xiě)函數(shù)
  64. 入口參數(shù):address   LD3320地址
  65.           dataout   LD3320數(shù)據(jù)
  66. 出口參數(shù):無(wú)
  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;//打開(kāi)片選
  73.                          __delay_cycles(500);
  74.                          ///////////////////////寫(xiě)命令
  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.                          /////////////////////寫(xiě)地址
  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.                          //////////////////////寫(xiě)數(shù)據(jù)
  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;//關(guān)閉片選
  116.                         
  117.                 }
  118. /*****************************************
  119. 函數(shù)功能 ;LD3320讀函數(shù)
  120. 入口參數(shù):address   LD3320地址
  121. 出口參數(shù):datain    LD3320讀出的收據(jù)
  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;//打開(kāi)片選
  129.                          __delay_cycles(2000);
  130.                         ///////////////////////寫(xiě)命令
  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.                          /////////////////////寫(xiě)地址
  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.                          /////////////////////讀數(shù)據(jù)
  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;//關(guān)閉片選
  170.                      return datain;
  171.                 }

  172. /*****************************************
  173. 函數(shù)功能 ;LD3320復(fù)位函數(shù)
  174. 入口參數(shù):無(wú)
  175. 出口參數(shù):無(wú)
  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. 功能描述:         啟動(dòng)ASR
  256. 入口參數(shù):        none
  257. 返 回 值:         none
  258. 其他說(shuō)明:        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); //配置麥克風(fēng)做為輸入信號(hào)
  283.         //LD_WriteReg(0x1C, 0x07); //配置雙通道音頻信號(hào)做為輸入信號(hào)
  284.         LD_WriteReg(0x29, 0x10);
  285.        
  286.         LD_WriteReg(0xBD, 0x00);
  287.         //EX0=1;
  288.         return 1;
  289. }

  290. /************************************************************************
  291. 功能描述:添加關(guān)鍵詞,此處為用戶修改部分
  292. 調(diào)用函數(shù):
  293. 入口參數(shù):
  294. 返回函數(shù):
  295. **************************************************************************/
  296. // Return 1: success.
  297. //        添加識(shí)別關(guān)鍵詞語(yǔ),開(kāi)發(fā)者可以學(xué)習(xí)"語(yǔ)音識(shí)別芯片LD3320高階秘籍.pdf"中關(guān)于垃圾詞語(yǔ)吸收錯(cuò)誤的用法
  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"};        /*添加關(guān)鍵詞,用戶修改*/
  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};        /*添加識(shí)別碼,用戶修改*/       
  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()函數(shù)實(shí)現(xiàn)了一次完整的ASR語(yǔ)音識(shí)別流程
  335. //        LD_Init_ASR() 函數(shù)實(shí)現(xiàn)了ASR初始化
  336. //        LD_AsrAddFixed() 函數(shù)實(shí)現(xiàn)了添加關(guān)鍵詞語(yǔ)到LD3320芯片中
  337. //        LD_AsrRun()        函數(shù)啟動(dòng)了一次ASR語(yǔ)音識(shí)別流程
  338. //
  339. //        任何一次ASR識(shí)別流程,都需要按照這個(gè)順序,從初始化開(kāi)始進(jìn)行
  340. /************************************************************************************/
  341. unsigned char RunASR()
  342. {
  343.         unsigned char i=0;
  344.         unsigned char asrflag=0;
  345.         for (i=0; i<5; i++)                        //        防止由于硬件原因?qū)е翷D3320芯片工作不正常,所以一共嘗試5次啟動(dòng)ASR識(shí)別流程
  346.         {
  347.                 LD_AsrStart();
  348.                 __delay_cycles(20000);
  349.                 if (LD_AsrAddFixed()==0)
  350.                 {
  351.                         LD_reset();                        //        LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
  352.                         __delay_cycles(20000);                        //        并從初始化開(kāi)始重新ASR識(shí)別流程
  353.                         continue;
  354.                 }
  355.                 __delay_cycles(20000);
  356.                 if (LD_AsrRun() == 0)
  357.                 {
  358.                         LD_reset();                        //        LD3320芯片內(nèi)部出現(xiàn)不正常,立即重啟LD3320芯片
  359.                         __delay_cycles(20000);                        //        并從初始化開(kāi)始重新ASR識(shí)別流程
  360.                         continue;
  361.                 }
  362.                 asrflag=1;
  363.                 break;                                        //        ASR流程啟動(dòng)成功,退出當(dāng)前for循環(huán)。開(kāi)始等待LD3320送出的中斷信號(hào)
  364.         }

  365.         return asrflag;
  366. }

  367. /************************************************************************
  368. 功能描述: 獲取識(shí)別結(jié)構(gòu)
  369. 調(diào)用函數(shù):
  370. 入口參數(shù):
  371. 返回函數(shù):
  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)                        /*識(shí)別成功*/
  387.         {       
  388.                 nAsrResCount = LD_ReadReg(0xba);
  389.                 if(nAsrResCount>0 && nAsrResCount<=4)
  390.                 {
  391.                         nAsrStatus=LD_ASR_FOUNDOK;
  392.                 }
  393.                 else
  394.             {
  395.                         nAsrStatus=LD_ASR_FOUNDZERO;
  396.                 }       
  397.         }                                                                                                                         /*沒(méi)有識(shí)別結(jié)果*/
  398.         else
  399.         {         
  400.                 nAsrStatus=LD_ASR_FOUNDZERO;
  401.         }
  402.                
  403.   LD_WriteReg(0x2b, 0);
  404.   LD_WriteReg(0x1C,0);/*寫(xiě)0:ADC不可用*/

  405.         LD_WriteReg(0x29,0) ;
  406.         LD_WriteReg(0x02,0) ;
  407.         LD_WriteReg(0x2B,  0);
  408.         LD_WriteReg(0xBA, 0);       
  409.         LD_WriteReg(0xBC,0);       
  410.         LD_WriteReg(0x08,1);         /*清除FIFO_DATA*/
  411.         LD_WriteReg(0x08,0);        /*清除FIFO_DATA后 再次寫(xiě)0*/


  412.         //EX0=1;

  413. }

  414. void Init_CLK(void)
  415. {
  416.   WDTCTL     = WDTPW + WDTHOLD                            ; // 關(guān)看門(mén)狗
  417.   P5SEL     |= 0x0C                                       ; // 端口功能選擇振蕩器
  418.   UCSCTL6   &= ~XT2OFF                                    ; // 振蕩器使能
  419.   // UCSCTL6   |= XCAP_3                                     ; // 設(shè)置內(nèi)部負(fù)載電容
  420.   UCSCTL3   |= SELREF_2                                   ; // FLLref = REFO
  421.   UCSCTL4   |= SELA_2                                     ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
  422.   do
  423.   {
  424.     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 錯(cuò)誤標(biāo)志                                                         
  425.     SFRIFG1 &= ~OFIFG                                     ;
  426.   }while(SFRIFG1&OFIFG)                                   ; // 檢測(cè)振蕩器錯(cuò)誤標(biāo)志
  427.   UCSCTL6   |= XT2DRIVE0 + XT2DRIVE1                      ; // XT2 驅(qū)動(dòng)模式 24~32MHz                                            
  428.   UCSCTL4   |= SELS_5 + SELM_5                            ; // SMCLK = MCLK = XT2   
  429. }
復(fù)制代碼


MSP430 源程序.zip

194.56 KB, 下載次數(shù): 4, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 韩国欧洲一级毛片 | wwwww在线观看| 亚洲a视频 | 午夜激情网| 成人国产在线观看 | 亚洲自拍偷拍免费视频 | 亚洲精品免费在线 | 91精品国产综合久久久久久丝袜 | 欧美色偷拍| 国产国拍亚洲精品av | 亚洲欧美中文日韩在线v日本 | 久久午夜电影 | 日本精品一区二区 | 亚洲欧美在线免费观看 | 亚洲精品福利在线 | 国产精品乱码一区二区三区 | 97视频久久 | 日本中文字幕一区 | 欧美vide| 日韩一区二区免费视频 | 青青草社区 | 欧美二区乱c黑人 | av日韩高清 | 91精品国产综合久久婷婷香蕉 | 日韩在线精品视频 | 日韩欧美网 | 欧美不卡网站 | 91n成人| 射久久 | 久久人爽 | 久久1区 | 国产一区二区三区精品久久久 | 国产午夜精品一区二区三区四区 | 国产毛片毛片 | 日韩三 | 欧美影院久久 | 日本一区二区高清不卡 | 亚洲成人av在线播放 | 一区二区免费在线观看 | 在线视频中文字幕 | 亚洲激情在线观看 |