你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32驱动LD3320进行语音识别程序+原理图

[复制链接]
STMCU小助手 发布时间:2022-4-24 16:00
一、原理图0 x: \9 W5 \" @% [; ]- D
( {9 t$ D2 A/ R# b( s3 l0 O; w! F8 N
99Ia$W`8_TY4`GM[WZB52.png
9 x; Q+ H- X) @( K
. ^2 U$ s9 T& D- |二、源代码

: P8 r5 J5 }9 M6 ?/ n% pLD3320.c7 ^/ N8 K# a$ c6 Z5 ?9 M7 \
( Y& a) F" I* F' D# D' @
  1. #include "ld3320.h"8 v3 |) l6 ]4 j4 N" B
  2. #include "delay.h"
    & y3 |2 d: d+ F, P% W1 Y
  3. #include "usart.h"        ! \  F3 Q7 N, w. J
  4. #include "string.h"
    - r( O0 r6 g+ S; V0 I$ K
  5. u8 ld3320Data;( t. F8 I2 C- p- L
  6. extern u8 nAsrStatus;1 _7 |. y3 A# ~5 `% _
  7. # b1 Q; j3 d1 _1 h5 O1 Z5 L
  8. unsigned long nMp3StartPos=0;
    , ~% l$ ~9 l+ M# h& g* V0 [
  9. unsigned long nMp3Size=0;+ B+ J. O0 E7 Z7 o
  10. unsigned long nMp3Pos=0;9 b, Z% w0 J6 Q2 k) s3 H
  11. u8 bMp3Play=0;                                                        //        用来记录播放MP3的状态& O" \: |+ B5 B6 F4 M  J, e
  12. u8 nLD_Mode = LD_MODE_IDLE;                //        用来记录当前是在进行ASR识别还是在播放MP3
    ( V9 L# w. a$ X1 j6 R; _) d
  13. u8 ucRegVal;" r5 q) B# c) Y% T( k/ ~2 X
  14. u8 ucHighInt;3 m! d0 X8 ]2 O1 N! k4 y) P1 s
  15. u8 ucLowInt;
    : r2 O+ E$ B. M) v4 Y% z* z) u% _. c/ s
  16. u8 ucStatus;9 C. C4 ^4 x6 `  u& Z% f, Q/ H
  17. u8 ucSPVol=15; // MAX=15 MIN=0                //        Speaker喇叭输出的音量
    . Z" s% I0 \% B+ h' T; y

  18.   L! I2 l* ?7 }
  19. ! ~* ^, l+ e3 u8 P, k0 }

  20. 2 N8 u4 h3 ^- D+ |0 O) O
  21. void ld3320_init()5 ]6 U' y0 q( c8 p; C6 z# J
  22. {3 Z9 r0 L% ^! s" C2 ~1 H
  23.         GPIO_InitTypeDef  GPIO_InitStructure;
    / I; P+ b" `$ ?+ C! u1 G
  24.          EXTI_InitTypeDef EXTI_InitStructure;
    1 l9 i) J' \1 e% s
  25.          NVIC_InitTypeDef NVIC_InitStructure;0 ]$ ?0 @9 b; P0 e- G  z
  26. . l/ J. O/ @% C, ]+ z! F9 t. I8 r
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);         //使能PB,PE端口时钟
    9 F/ t! D/ k0 e
  28.         ) _8 e  U) o# {1 g; J
  29.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);4 ^6 _' ]9 i* p" V9 s8 l. T1 G
  30.         
    1 Z7 i  @' U# p+ B. L; n" i
  31.         3 g5 o4 n- a+ Y) k7 i9 I  X5 W
  32.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;                                 
    % m) G4 c1 ^, c
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  + V3 K- a: \' @$ Q- `
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    * M+ o# ~. R& m8 l1 o1 s
  35.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                        " M) Y# t! G- d: L) F+ n: W
  36.         GPIO_SetBits(GPIOA,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);
    / w& \) y+ V# T" G: K% x
  37.         
    ( t$ ~( ]- I6 C! ~
  38.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 ;                                 
    1 m: M/ \  J- J8 d6 x5 S& O0 m, K* `
  39.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
    3 }" o/ u0 ^: O5 g4 d
  40.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 $ h6 t: i( u* Q) l
  41.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                       
    9 X; m% ]2 t3 m8 _  n7 R
  42.         GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15);+ H3 m* |2 p1 g
  43.                 ) ~. b# d! u. r, @2 j4 {7 s+ b
  44.         $ F' f5 C- h) U+ M) o" }; W
  45.         LD3320_MD=0;  //选择并口2 I2 }" `; Y; z7 n! {7 m4 [
  46.         LD3320_RST=1;        " u9 |% T, F! O8 ^6 y
  47.         LD3320_A0=0;# v9 k! y* Z/ A. k
  48.         & N. m9 p$ f1 {$ H8 S' q4 i9 p
  49.         
    : ]2 t1 C0 `& |) T% P
  50.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11;                                 * s' s, ^6 O9 }
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  
    $ D. \4 J9 M+ X0 ]7 ^, \* x
  52.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    3 L8 r4 k/ B9 X
  53.         GPIO_Init(GPIOB, &GPIO_InitStructure);                2 Q1 w- x- d! S4 J2 K! n
  54. . v, V9 R; c# c
  55.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
    ! U1 k8 ]6 n- y5 s9 d7 y
  56. . B  D& ]3 i/ \9 }6 C2 [; U; C
  57.     // 中断线以及中断初始化配置   下降沿触发" S0 G' o7 i! \, A
  58.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);( h7 H7 ~, v) ^' \5 D
  59. 5 E; I2 t! s" v- Q4 h( t9 |
  60.           EXTI_InitStructure.EXTI_Line=EXTI_Line11;        
    9 n/ ^% j) u7 H: m* Z1 z
  61.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
    ( n/ }+ }9 j  ~" l( }) y% C" o
  62.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    ' P9 ?7 n& t0 _7 K: z5 B) s& V* O
  63.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    * v  h, V( O9 L/ W9 G5 t' W" p  O
  64.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器' q* _. K  U3 k6 O
  65.         
    , X, {6 ^3 V1 E4 v( R
  66.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能外部中断通道
    + y, ]. _; l9 n) P$ h
  67.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级0
    % V5 Q8 I3 }. V& e& }' ~$ ^
  68.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级0
    7 h5 X$ ^8 {4 G8 E
  69.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
    7 G/ H3 K+ W0 v) R  B: q; ?
  70.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器        
    5 g% j8 S2 T. t0 }0 @; G: L0 [8 R
  71. + R: @8 H' _0 V( e) N4 e0 e' P
  72. }
    % u! h  g/ u1 @9 u* Z7 \, s

  73. # ?3 n* R: P1 s# }1 h+ G
  74. //外部中断服务程序
    4 e- f5 C$ e5 m! W4 P
  75. void EXTI15_10_IRQHandler(void)
    + N$ H& K2 H# A$ H# Q1 v
  76. {
    4 x6 _- t# e' R- y! a" ]+ D
  77.         if(EXTI_GetITStatus(EXTI_Line11)!= RESET ) 1 w7 b) q* G4 Y% m
  78.         {
    0 ~2 ~" v; z$ K; j
  79.                 ld3320_process_init();               
    ' [; B  w& o8 g1 V1 n/ K! M
  80.                 EXTI_ClearFlag(EXTI_Line11);- t* R0 l8 k* g/ n8 e
  81.                 EXTI_ClearITPendingBit(EXTI_Line11);//清除LINE上的中断标志位  
    ! H% Z, g- ?' B5 Y* t/ v# F$ v7 G
  82.         }         5 V$ u6 ?1 I. G9 w: A
  83. }
    2 c3 J: k6 d) a& M

  84. ) p. \( B' ~2 ~% g1 ^+ f! o+ d& f

  85. ( V* F0 \& w- r, J
  86. void ld3320_write_reg( unsigned char address, unsigned char dataout )) T7 @- `4 O- [8 F" j
  87. {! F$ }+ K5 |0 Y
  88.         - F. }' g# Q& F: |# f
  89.         ld3320Data=address;5 W" F" x7 r  S+ v
  90.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;& I, J$ @) T5 ^' A# _( t
  91.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
    ; D' [! j9 X- H/ s: ?' X
  92.         delay_us(1);. O( n% z  i0 n7 x
  93.         LD3320_A0  =1;' m& V3 D5 x: U, M' D
  94.         LD3320_CS = 0;( M( H& p. a. Q& k0 {
  95.         LD3320_WR = 0;4 X- S; O2 K4 O1 R* N
  96. 6 Q. w5 B: y, P& r$ Z4 O
  97.         LD3320_WR = 1;
    2 {' O; H1 \! b/ `
  98.         LD3320_CS = 1;
    . t0 E5 W( e- A) A) G& W
  99.         1 ^7 ?/ i% p1 a& u% k% ]  J
  100. 2 B, \" G4 G# G% a  v) r+ U
  101.         ) F# F- h/ n# D8 O
  102.         ld3320Data=dataout;
    % [8 h7 ~$ O0 Y. j
  103.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;
    0 f6 @4 E4 L* Q& X" m% F$ F) z
  104.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;# D( R6 g2 u+ j: w. P
  105.         delay_us(1);
    1 M, `; _2 T' e1 J, M. Q) F) e
  106.         LD3320_A0 = 0;! v8 s  ~: k' o. c
  107.         LD3320_CS = 0;
    ( R  @9 K( L8 b* j
  108.         LD3320_WR = 0;  ~: b) S- k: i

  109.   [2 Y0 M6 w5 r2 w3 e
  110.         LD3320_WR = 1;& I6 d) l* B0 T/ [7 J* G4 Y
  111.         LD3320_CS = 1;
    5 {! }" w* k" u" z
  112. }. p( C7 f! h  p. P
  113. & J7 E& q) y- \
  114. unsigned char ld3320_read_reg( unsigned char address )
    1 O4 d, l  w* u& D4 s1 f
  115. {9 z9 ^# c  r) r' [& H4 _6 X# k
  116.         unsigned char datain;5 B% A( `# I8 J" O% p; q
  117. 0 v7 D$ D+ o6 _3 q" C
  118.         ld3320Data=address;
    ( H" w7 j) N% r0 `3 B5 e( y7 u/ f
  119.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;
    ( V) P! g1 `! T
  120.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
    ) ?5 [8 [: I8 O8 B
  121.         7 L7 f/ j& U0 I# p2 t1 x- x
  122.         LD3320_A0 = 1;
    2 s% J6 W" X! X5 d) g5 ^5 y, e
  123.         delay_us(1);
    + p$ p6 ^7 {2 ?* g0 }3 W7 S
  124.         LD3320_CS = 0;
    ; p1 t" N7 O% y; \& \& H" V7 K
  125.         delay_us(1);- A& H) w% `  q& K( X
  126.         LD3320_WR = 0;
    ; [& j/ Y- `  ?" L8 C4 V& @/ D
  127.         delay_us(1);
    3 L  W% R0 l5 B' E- C' C
  128. 4 b, d( n  e# u5 o: k; y
  129.         LD3320_WR = 1;! p4 z6 Y/ j8 p+ z6 j5 c
  130.         delay_us(1);
    , \  @1 Q, E1 p7 I2 E- P1 q, C
  131.         LD3320_CS = 1;! |+ r  \" z  l9 g; c1 |! J
  132.         delay_us(1);: Z8 I- s, h8 t2 z# h

  133. : ]8 x( m* f+ F1 T
  134.         LD3320_A0 = 0;
    2 b9 {; r; J2 I4 J
  135.         delay_us(1);
    ; k8 b& H1 S9 A
  136.         LD3320_CS = 0;
    / @/ ~8 S: m5 H) a. U5 O
  137.         delay_us(1);
    0 n# j. E  d; {' z+ d( E
  138.         LD3320_RD = 0;
    # e* C$ X! Q5 Y) M
  139.         LD3320_DATA_IN();3 ~9 U1 ~* ^: k; O* T4 }
  140.         delay_us(1);
    * B/ j8 ^; R5 K/ {, I
  141.         3 L! }9 G( u( Q6 z
  142.         bita0=LD3320_D0_R;bita1=LD3320_D1_R;bita2=LD3320_D2_R;bita3=LD3320_D3_R;
    9 ?5 \: _# K/ F: r( Z7 [: U
  143.         bita4=LD3320_D4_R;bita5=LD3320_D5_R; bita6=LD3320_D6_R;bita7=LD3320_D7_R;3 u6 p( h# P# B+ b
  144.         datain= ld3320Data;
    2 r2 ?3 q1 t! ~" V$ Z3 N
  145.         
    9 P3 r0 U" @. ]
  146.         LD3320_DATA_OUT();5 e5 g& M- a" v9 K
  147.         LD3320_RD = 1;
    $ ]. y& I* t; `3 Y
  148.         delay_us(1);8 x+ E8 y* t/ Z2 e" W
  149.         LD3320_CS = 1;1 N" `$ W, M8 @. H! t
  150. ) J+ }. d; {! Y( D' M# c
  151.         return datain;# B- a: k( t* y3 [8 l" ]$ x- d
  152. }# ]  \2 U) t( E# M
  153. * i7 ^2 K, Y- A/ G- }" e- S
  154. . @$ x" U& I! P( t) h& {, ?5 x: W+ Y
  155. void ld3320_reset()
    ( c. o8 E: p3 j% O
  156. {
    " `' o. G8 z  x$ W7 K1 d* m
  157.         LD3320_RST=1;
    ) i3 B+ O- U! h
  158.         delay_ms(1);* t; S6 D" y& c% X. T( \% f5 @
  159.         LD3320_RST=0;
    7 B' g4 x# ?: a  A" W* a
  160.         delay_ms(1);
    % O9 H. Y+ V, J+ }& T; T8 f
  161.         LD3320_RST=1;8 P1 Q* z2 w# h6 R
  162. 1 V3 k) v  Z+ c
  163.         delay_ms(1);9 z' R5 [" k7 z2 s1 a
  164.         LD3320_CS=0;: D" g* W; b* _
  165.         delay_ms(1);
    , O: t4 W( X3 A* S# G" R: {
  166.         LD3320_CS=1;
    ) `3 g1 r9 a# s9 _1 k/ Y
  167.         delay_ms(1);
    # \& L4 M& E( T2 E2 Y3 g
  168. }
    - j) Z/ g2 q- U* {8 _" }
  169. u8 ld3320_check()
    5 A- c8 \( O$ j0 Q3 Y3 r  ]
  170. {% }/ t0 Q1 H) o/ z, p
  171.         u8 a[3];5 D: t$ Y" X: v' Q5 Y
  172.         memset(a,0x00,sizeof(a));- `5 o$ P* [7 E0 n6 }
  173.         ld3320_reset();/ q( @7 }- v' J. H
  174.         delay_ms(1);0 k, n3 |4 u% m" m, s
  175.         ld3320_read_reg(0x06);  3 b' l1 _. z8 P; C9 W! [
  176.         delay_ms(1);
    & l7 i! K+ O$ Z( I
  177.         ld3320_write_reg(0x35, 0x33);  
    1 ?' p$ ?3 n& G6 {! r9 I- y: @
  178.         delay_ms(1);
    + p# |2 e4 S8 X/ y- P3 s
  179.         ld3320_write_reg(0x1b, 0x55);   
      i5 g; `! S6 v. W) ]& I3 |/ i' a# j
  180.         delay_ms(1);  `, W; K3 ^$ ?4 i
  181.         ld3320_write_reg(0xb3, 0xaa);        
    7 V; h0 l5 i6 n# W, P* _# O
  182.         + @" o$ ~; ^" n3 x5 Q
  183.         a[0]=ld3320_read_reg(0x35);4 C' R( o2 c  v$ \% p0 H9 N' M
  184.         delay_ms(5);
    , s$ u! i) P6 ]" o
  185.                
    ; Q* f0 Q/ Q1 X! F1 G
  186.         a[1]=ld3320_read_reg(0x1b);
    . Q+ c8 Q8 L& k; h
  187.         delay_ms(5);! c9 p  U# ?4 ^" g# T
  188.         a[2]=ld3320_read_reg(0xb3);
    9 x* }( F! I6 r0 M7 D' r4 G8 V
  189. ) |: X: O. E3 y  e' G4 D- d+ k
  190.         if(a[0]!=0x33||a[1]!=0x55||a[2]!=0xaa)
    4 a  S8 P8 t8 W8 m% R
  191.                 return 1;
    + ~, m; o# o$ U! h
  192.         return 0;
    ! s1 B5 F# r* y1 J! W" m. a' `$ w7 Q
  193.         
    ) l/ N1 E" v) T: u, y3 H1 j
  194. }1 P" J2 U  _" g, t$ E) s) H/ j- H
  195. ) {% F; Q+ Y9 o* `- l. I7 V& L
  196. * t6 U7 B7 p/ K2 }& I
  197. ! A" i0 @9 @) `3 ~, u( p7 s6 Q
  198. void ld3320_init_common()
    . v& K9 p( w; K4 i
  199. {* h0 g7 k7 p! B  I, c/ I8 V
  200.         bMp3Play = 0;
    ) V% B2 m) B" G
  201. . @, E7 u' d* Z
  202.         ld3320_read_reg(0x06);  
    ; L1 X+ ]% H: |6 }
  203.         ld3320_write_reg(0x17, 0x35);
    / ?* z9 s0 m2 b9 D8 U
  204.         delay_ms(10);
    " I3 _1 I, J. X+ v" `6 S
  205.         ld3320_read_reg(0x06);  . T7 V5 T+ [% f4 Z* A& V9 G( w
  206. ' n' s9 j, }) n, [$ y6 Y$ [- I5 X
  207.         ld3320_write_reg(0x89, 0x03);  
    0 E& m- s4 e* H1 O: x: w# _6 w. ?3 E( B
  208.         delay_ms(5);
    9 j2 O/ ?; P, P) S
  209.         ld3320_write_reg(0xCF, 0x43);   % z7 G7 l4 n4 z- M
  210.         delay_ms(5);
    5 J. w! [  j/ y) d' k: a9 \5 f
  211.         ld3320_write_reg(0xCB, 0x02);
    $ P4 F7 f  V) w+ ^: ]  A3 n
  212.         
    ) R/ a: I) I1 k- v+ M
  213.         /*PLL setting*/
    " \  D) `4 V' H! M& L- M
  214.         ld3320_write_reg(0x11, LD_PLL_11);       1 f8 T. ]4 W' f( {* k2 @4 J
  215.         if (nLD_Mode == LD_MODE_MP3)3 K% q; M9 U6 W* A
  216.         {0 Q( v( q) I  g. \  P
  217.                 ld3320_write_reg(0x1E, 0x00);
    " I9 x) [: P* t% H) p: u- ?4 G9 J
  218.                 ld3320_write_reg(0x19, LD_PLL_MP3_19);   + M+ Q/ P# s, E5 |7 m: C
  219.                 ld3320_write_reg(0x1B, LD_PLL_MP3_1B);   ) ^& s5 D: {3 A  |
  220.                 ld3320_write_reg(0x1D, LD_PLL_MP3_1D);
    - U3 _: O% R3 N9 G
  221.         }
    6 W' V2 _; K' @) }  C" G) g3 }$ c% X
  222.         else
    . t3 N2 R0 e% I# U! z. n
  223.         {+ `& y9 Q" u) I: G/ r2 K0 L$ ?
  224.                 ld3320_write_reg(0x1E,0x00);
    9 M3 J: s9 q0 L8 k7 F
  225.                 ld3320_write_reg(0x19, LD_PLL_ASR_19);   J; E6 _0 W" K# Z! X9 }" i
  226.                 ld3320_write_reg(0x1B, LD_PLL_ASR_1B);               
    6 e$ V  W+ @* o; S: R: Y0 J
  227.             ld3320_write_reg(0x1D, LD_PLL_ASR_1D);
    + F: X9 b8 q- {% ~7 R: @8 q
  228.         }
    + S5 k: z3 `0 k# W8 F* _+ c: D
  229.         delay_ms(10);
    ( w0 w! N5 g' |7 M7 Y& L2 V
  230.         
    " R/ v% r4 [" b+ t
  231.         ld3320_write_reg(0xCD, 0x04);
    , Y( Z& S; Q! _1 k" \3 ]
  232.         ld3320_write_reg(0x17, 0x4c);
    ( r' E  |, y1 f2 {4 j& v
  233.         delay_ms(5);- x4 x% Q% o7 x0 I) M$ P5 P' @9 x
  234.         ld3320_write_reg(0xB9, 0x00);
    - P) {6 M4 u# a& }2 Q
  235.         ld3320_write_reg(0xCF, 0x4F); . q7 h0 u. a- V" {0 \4 n* \
  236.         ld3320_write_reg(0x6F, 0xFF); 3 x9 H# t; j% c
  237. }
    8 k6 q7 `4 X# i  C, l
  238. / [; m( n! X0 }. U
  239. void ld3320_init_mp3()( f  x% Y9 G: m" K) N( i, P- v1 v
  240. {2 S* W" v. m- v8 y4 b1 O
  241.         nLD_Mode = LD_MODE_MP3;
    ) ?: g+ \) D+ y0 p
  242.         ld3320_init_common();7 V! o: H8 F$ z% [7 D! z

  243. % H1 W: d  [6 C/ R& o( I! V$ {
  244.         ld3320_write_reg(0xBD,0x02);0 b, H" N& x! T! u; Y
  245.         ld3320_write_reg(0x17, 0x48);' F5 F( |$ q0 Q8 g2 y
  246.         delay_ms(10);
    , S, `% ?' f( P3 z  d6 ~! a

  247. " M1 K+ P0 s, W+ F
  248.         ld3320_write_reg(0x85, 0x52);
    8 n" B- [5 D. @3 G: L& E
  249.         ld3320_write_reg(0x8F, 0x00);  
    ; }$ o/ M* F& ^( c+ ^. M
  250.         ld3320_write_reg(0x81, 0x00);
    ( X) J" j: u5 h9 x% ?+ g
  251.         ld3320_write_reg(0x83, 0x00);
    " D! W' g+ V& B; q& [% h& m
  252.         ld3320_write_reg(0x8E, 0xff);
    & d3 G7 j) y" n. L6 W' p# e; H( A
  253.         ld3320_write_reg(0x8D, 0xff);
    " b9 O+ S5 U( i$ J
  254.     delay_ms(1);
    ( N* Z0 b8 k7 E3 \- J  r  q& H
  255.         ld3320_write_reg(0x87, 0xff);: {6 Q9 D- f) E" z! h! a) v
  256.         ld3320_write_reg(0x89, 0xff);
    ; X) m. S; U1 L2 ^6 o4 J! T
  257.         delay_ms(1);
    2 M, e; b) i% s& k+ ^5 |
  258.         ld3320_write_reg(0x22, 0x00);    9 W& p. [: H3 N  ~' ~! c
  259.         ld3320_write_reg(0x23, 0x00);
    ! ]+ D9 W8 ?* b+ K
  260.         ld3320_write_reg(0x20, 0xef);    9 d) z2 \; d  S. A3 y3 k
  261.         ld3320_write_reg(0x21, 0x07);
    " A5 l! i( \: F" f& G/ j
  262.         ld3320_write_reg(0x24, 0x77);         
    & w; e% [! H+ M+ p
  263.     ld3320_write_reg(0x25, 0x03);0 n) B0 h( B- b' L$ B1 M$ D6 ?! \
  264.     ld3320_write_reg(0x26, 0xbb);    % O& N. B7 u# I7 p
  265.     ld3320_write_reg(0x27, 0x01); $ g0 E: z% G3 e/ ^0 U+ V: A
  266. }
    0 y5 x" X2 v/ k0 f$ Z' ^

  267.   A) ^1 O- W. n! @7 a  [3 C" D
  268. 3 m3 `' c* ^7 H4 g# N

  269. , I+ {5 a6 g: e
  270. void ld3320_init_asr()2 \7 m$ A8 j* H: r# E2 x, F
  271. {/ x0 G* {9 P- B, Z( Y2 H, L
  272.         nLD_Mode=LD_MODE_ASR_RUN;
    ' J+ ]4 @9 y# f' Y# S
  273.         ld3320_init_common();
    ( a# e5 }* X* m1 ^/ ?- W8 T% l
  274. ) F# ?. `" ]" m6 E3 n7 ^
  275.         ld3320_write_reg(0xBD, 0x00);
    8 p- x/ i4 L& `5 v' Q( R( e
  276.         ld3320_write_reg(0x17, 0x48);2 y- Y  r! `# x
  277.         delay_ms(10);  ?1 m+ r1 g7 H7 D1 n* r. v) f

  278. ' ^+ J# K; t" u  J: Q1 D) d
  279.         ld3320_write_reg(0x3C, 0x80);   
    ' I% x" l# {, J% O. @3 r
  280.         ld3320_write_reg(0x3E, 0x07);- ?! V# y. n# h7 J3 n# R7 V
  281.         ld3320_write_reg(0x38, 0xff);   
    - T" H' K. ^1 H: @3 N* O7 w( e
  282.         ld3320_write_reg(0x3A, 0x07);
    6 R$ i  ]1 b* S5 X& g$ X$ v. B% h# ~
  283.         
    2 `% C7 U! z8 r6 o" x" s$ a
  284.         ld3320_write_reg(0x40, 0);          / ?8 e/ ^4 x. ^- r: l+ }
  285.         ld3320_write_reg(0x42, 8);& d& B* O2 t$ E  }
  286.         ld3320_write_reg(0x44, 0);   
    ' |% q: g7 @5 s) Q
  287.         ld3320_write_reg(0x46, 8); & c6 w) _) H' v# P+ J( s6 W
  288.         delay_ms(10);  n8 a4 M% Z6 Q7 v* o' c2 O
  289. }* |7 I7 |% W- t5 V

  290. $ U3 g4 [9 U# {; T) f5 F
  291. void ld3320_reload_mp3data()& V  Q. E- D* _$ H* g
  292. {" j3 J% u  w6 N- B
  293.         unsigned long nCurMp3Pos;$ j% N+ v- N7 f0 D& O
  294.         u8 val;/ N) ]; Y5 r. j+ i
  295.         u8 k;) J% f1 h; w$ A5 i
  296. 5 R7 E* \2 S/ v! v
  297.         nCurMp3Pos = nMp3StartPos + nMp3Pos;% l% {4 w( m& [. c* x* h
  298. ! P2 ]) M, a) Q- U! Y: F& e
  299.         ucStatus = ld3320_read_reg(0x06);
    $ y# J6 z  n- t1 M  L  W+ `6 C
  300.         while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )
    : n# S$ i8 W1 h" Q6 S
  301.         {; D1 n6 l% Z- f9 d/ L
  302.                 val=0;( y7 Q! E6 G8 l& x' c( g
  303.                 for(k=0;k<8;k++)8 r5 [5 B% U/ J, h2 R( P
  304.                 {9 l2 z. z( E# T* f
  305.                 }* L  f$ _  Q" C9 A" I8 }
  306.                 ld3320_write_reg(0x01,val);9 _1 T- G' r- m! L$ p

  307. 1 ~' E. O: \2 S
  308.                 nMp3Pos++;) @6 G8 v( ?+ S2 ]- O3 H( @
  309. . k# O# P2 @' s1 d) b5 c( L
  310.                 ucStatus = ld3320_read_reg(0x06);' L+ d1 M, B3 m* o
  311.         }; a5 i! I1 M& n: ~
  312. }: b* p: O8 [* A
  313. ; @7 f/ H& u5 N4 x- Z5 N) i  a

  314. ! O# l( D9 O$ a
  315. void ld3320_reload_mp3data_2()
    8 I6 o' J9 ~: [/ _. k
  316. {
    0 ^& y: T/ h" p8 O6 r
  317.         unsigned long nCurMp3Pos;! j& E" u0 a- w( }
  318.         u8 val;
    4 ]8 r; f$ g. c8 e! S5 J/ I. \
  319.         u8 k;$ u+ q" J. p6 u$ F" ^  r
  320. # \! P& o+ [/ B
  321.         nCurMp3Pos = nMp3StartPos + nMp3Pos;
    0 t: k! w! f& @* o- t! ]0 s
  322. . C( v/ }3 s& q8 ?0 L

  323. 2 D9 f. k2 t1 M3 C/ i/ i) p
  324.         //读取音乐文件写入
    - p6 |2 c* H) b: m4 n8 Z4 J
  325.         
    5 K7 f$ n, ?# y- Q
  326.         , O" y" U% [* r1 W: n! A

  327. 7 U3 f7 K5 g9 s' x, f0 v: q1 b, f
  328.         ucStatus = ld3320_read_reg(0x06);. g9 r" n: C& b* ~8 S
  329.         while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )
    $ b+ e! }& c  C1 N
  330.         {, X# y/ @0 L4 ?0 `, g
  331.                 val=0;" l. f0 O3 J3 W& y- Z7 G
  332. ) g/ J+ x- D4 h/ g, ^
  333. . ]; R( r8 V8 N) ~$ m$ S2 j
  334.                 nMp3Pos++;- _' _. [5 p. O% ?4 k: P* d
  335. , t" R0 J# G7 I9 t" w1 z
  336.                 ucStatus = ld3320_read_reg(0x06);" C& S3 Z7 F  w8 P
  337.         }
    , y# k7 ?7 T' R( K1 B
  338. }
    ; ?' U$ x( C; |3 }& E" t1 y

  339. 1 U" V2 p6 n: k7 {. ?/ o  \
  340. 1 w: s, ]) m+ U! f7 C
  341. ) l6 \, M; B5 U6 u! W3 }; s6 h

  342. ) g( T' n) ^$ `9 \: \
  343. void ld3320_process_init()+ e. S! P" a" R$ I! C$ N- F, y/ I
  344. {2 {( R+ b) i/ X0 ~1 q+ k$ \
  345.         u8 nAsrResCount=0;
    7 j9 q7 [/ k" ^) s* D" S1 z* w4 j4 a
  346.         
    3 H# @! b, V" r% A* ]+ u+ M
  347.         ucRegVal = ld3320_read_reg(0x2B);3 U) R" o! d9 N  A! |% W
  348.         if(nLD_Mode == LD_MODE_ASR_RUN)
    2 t- T- d( H: M  _( a* L# F
  349.         {
    . ]) j' ]/ ]# A- Y- T8 u7 e
  350.                 // 语音识别产生的中断
    $ t1 k7 J) P- l" A
  351.                 // (有声音输入,不论识别成功或失败都有中断)0 a' d  C9 ~. x
  352.                 ld3320_write_reg(0x29,0) ;
    # t& y3 e. I; r) P( P
  353.                 ld3320_write_reg(0x02,0) ;
    ; A0 z3 |* M9 s) H
  354.                 if((ucRegVal & 0x10) &&" N; T+ C( m% W2 d6 S
  355.                         ld3320_read_reg(0xb2)==0x21 && ; Z$ [' A. _* c8 q  Z# k( O* F
  356.                         ld3320_read_reg(0xbf)==0x35)
    7 u- a* o7 ]- I8 i1 K( U( e. V( w" r2 J
  357.                 {1 T8 g! B3 R& b  n9 g3 V
  358.                         nAsrResCount = ld3320_read_reg(0xba);8 L3 F9 d, k, l' G
  359.                         if(nAsrResCount>0 && nAsrResCount<=4)
    $ O% T9 g( ^7 {8 s/ o
  360.                         {- y6 S# ^% [3 D9 Y! x# S
  361.                                 nAsrStatus=LD_ASR_FOUNDOK;
    - q9 O- K7 {( h# m: A5 U
  362.                         }' T' g% S- v5 x- |, ~4 A
  363.                         else
    ( o6 D$ K) I3 H/ Z2 t/ N. ?
  364.                     {' }3 N& _. s6 Y( ~# c+ c& K
  365.                                 nAsrStatus=LD_ASR_FOUNDZERO;2 I6 r& T. \" p
  366.                         }        
    9 s7 P/ U3 O' C  z
  367.                 }0 D" O  {) B! a& J/ b1 X" b$ E  v
  368.                 else
    * K1 Y4 M9 F' e) B% b, c' b
  369.                 {9 R" W3 D9 o- G& J% N
  370.                         nAsrStatus=LD_ASR_FOUNDZERO;) `+ y8 O5 d! h/ e  S! x. X" t
  371.                 }
      I% k6 a+ B5 s8 e' Q/ @
  372.                         / c( H, I1 q5 E
  373.                 ld3320_write_reg(0x2b, 0);
      m+ ?8 t+ P: Q8 z  j" H. w
  374.             ld3320_write_reg(0x1C,0);
    % |* n# M" L+ j& t
  375.                 return;
    & U: z+ f' K& ^" x, y, C8 d
  376.         }
    1 ~1 `+ E  V3 v5 k2 P- a
  377.         ; W: w! t7 H; g' E. I8 B- |
  378.         // 声音播放产生的中断,有三种:
    . S7 ]9 {6 `( n
  379.         // A. 声音数据已全部播放完。
    ) ?0 D/ N4 v+ F7 A, U5 ?
  380.         // B. 声音数据已发送完毕。
    * v) R  N4 p  d/ H/ W6 r( w
  381.         // C. 声音数据暂时将要用完,需要放入新的数据。        6 l) C7 d+ d3 s& v
  382.         ucHighInt = ld3320_read_reg(0x29);
    2 T) t/ F* ?3 ~- u
  383.         ucLowInt=ld3320_read_reg(0x02);
    . `- |( n1 U* }8 u* X2 R1 k$ }
  384.         ld3320_write_reg(0x29,0) ;
    : S% o) ~, g2 D; w
  385.         ld3320_write_reg(0x02,0) ;$ g: `( o7 Q! w
  386.     if(ld3320_read_reg(0xBA)&CAUSE_MP3_SONG_END)
    & {# l% E- S# U8 I$ R
  387.     {! K% c4 x7 N- }+ @' ^: D; `
  388.         // A. 声音数据已全部播放完。% k0 t) Q# N0 z$ _. n7 k

  389.   v7 c! f9 d/ R
  390.                 ld3320_write_reg(0x2B,  0);* `4 S/ g0 K: w( q
  391.               ld3320_write_reg(0xBA, 0);        
    4 s7 m& w& n0 f  t; D6 X9 P
  392.                 ld3320_write_reg(0xBC,0x0);        
    , _& K4 H' |5 D& V
  393.                 bMp3Play=0;                                        // 声音数据全部播放完后,修改bMp3Play的变量" I  z  m5 S* w7 }  S
  394.                 ld3320_write_reg(0x08,1);1 q+ w9 Q, P; g) {" o' n
  395.                 delay_ms(5);  t; A" N- b! \. h0 F' Y7 C
  396.               ld3320_write_reg(0x08,0);
    ) W4 c: g( s7 `, W' i, ]
  397.                 ld3320_write_reg(0x33, 0);
    8 s) I+ ~3 d3 i, f
  398. ! z) ?: F2 y: H
  399.                 return ;& i- l# Z/ D- i6 y+ b% L3 A7 e
  400.      }- n! K( b7 K' r: N/ K: w
  401. / _. I; V: D+ M; w' w0 x
  402.          if(nMp3Pos>=nMp3Size)" F, c3 i- T) @* D$ S( F% V( k
  403.         {
    % k% ?7 g& S% m$ f% V
  404.         // B. 声音数据已发送完毕。
    : ?3 c! s$ \# T2 Z9 g
  405. * o9 O9 E$ v6 z" P' A
  406.                 ld3320_write_reg(0xBC, 0x01);
    8 L; E0 [% i$ k4 x9 h  [
  407.                 ld3320_write_reg(0x29, 0x10);1 R1 _% s9 i; C. E7 p0 \5 }4 @
  408. //                bMp3Play=0;                                //        此时,只是主控MCU把所有MP3数据发送到LD3320芯片内,但是还没有把送入的数据全部播放完毕
    2 Z9 v  N  `5 S
  409.                 return;        
    ) D2 k$ n+ ^  n
  410.         }
    ) T+ Q6 z/ N" S. m  `

  411. ( E, ]5 @+ n* \) @% @# B
  412.         // C. 声音数据暂时将要用完,需要放入新的数据。        
      j% a# b; L0 O; M5 R( W' w) m

  413. : A" z: E# ?0 U
  414.         ld3320_reload_mp3data_2();
    ' ^0 l7 C4 u/ I; _8 ^
  415.                
    ( K% `! l5 R. C/ z8 Z- i9 Z
  416.         ld3320_write_reg(0x29,ucHighInt); / ^3 A( {6 N3 n+ W0 p
  417.         ld3320_write_reg(0x02,ucLowInt) ;+ l0 h, @; l8 q5 y" ~
  418. }, |' \! o# K1 k# S
  419. void ld3320_play()
    $ d' ?( E9 B3 x$ w4 P* Z. ?
  420. {
    # J6 d& s# n+ p3 u4 T
  421.         nMp3Pos=0;
    1 g- m+ B3 D8 K1 Q6 h& b
  422.         bMp3Play=1;
    " F9 N% I  D$ P6 z

  423. 9 Q! p$ h! ^3 Q7 N4 v& `, C
  424.         if (nMp3Pos >=  nMp3Size)
    ' v% u: H% Z* v* ^* s* k) F
  425.                 return ; ! K- F3 B, C4 h% R1 R. Q, B& [

  426. $ y( M/ A5 I6 d
  427.         ld3320_reload_mp3data();- K/ F" C/ M0 `( b+ U
  428. ! ]' f6 E- j( Q, G5 ?! e1 m& y
  429.     ld3320_write_reg(0xBA, 0x00);
    4 X+ ^* j. b* w2 ~+ K
  430.         ld3320_write_reg(0x17, 0x48);
    , {: \6 F' n* L& J2 U/ M* U# o
  431.         ld3320_write_reg(0x33, 0x01);
    5 N/ F" {$ n" n% {6 t
  432.         ld3320_write_reg(0x29, 0x04);
    ; N8 c9 b6 X& Y3 f! c. N7 V2 v
  433.         ) w5 }" e6 f" u6 @
  434.         ld3320_write_reg(0x02, 0x01); 2 ]1 V5 F( v8 z& J8 v% [( C
  435.         ld3320_write_reg(0x85, 0x5A);7 G1 ?/ s/ K- j. M
  436. }8 ^! P8 B; v6 Q: n4 d% M4 N
  437. 2 [+ z9 y$ F( K5 y9 o
  438. void ld3320_adjust_volume(u8 val)0 e  Q; E" ?$ _1 C/ Z* _
  439. {
    7 V; y/ `% h2 P4 `
  440.         ucSPVol = val;
    % l0 H9 s2 G5 m, ]
  441.         val = ((15-val)&0x0f) << 2;( h. r, n% A$ |* ]
  442.         ld3320_write_reg(0x8E, val | 0xc3); ; T" o# g; G1 W- o7 a1 j5 i
  443.         ld3320_write_reg(0x87, 0x78); $ Y/ ^& D0 E) d( S1 p+ _
  444. }8 ]4 x; f$ k6 |* {' B4 i+ s
  445. // Return 1: success.
    6 n2 `. j' T5 c# |4 z3 @6 M
  446. u8 ld3320_check_asrbusyflag_b2()
    ' X0 |& D2 k9 q2 `
  447. {% g1 e" T( b3 c, o# W3 r
  448.         u8 j;
    9 r( e2 s: r! h+ m1 i$ Y; O
  449.         u8 flag = 0;. T' d, |5 w. E/ r
  450.         for (j=0; j<10; j++)7 L* Z$ M4 a5 ]. Z; ^9 n% Y1 `' f- X
  451.         {% ~% |) G% L3 L6 J. i
  452.                 if (ld3320_read_reg(0xb2) == 0x21)$ E& g: U- a' d5 U  ?. b8 z. ~
  453.                 {
      P+ j4 G7 P+ `( z6 b
  454.                         flag = 1;  `* A+ \. b( p/ w
  455.                         break;- z, G' s& J& l2 T
  456.                 }
    3 l: Y. K/ @$ ^- }$ M+ @
  457.                 delay_ms(10);                : X1 O& e$ J; ?& l  v
  458.         }
    + _! ]8 T0 c5 @& N2 M1 b
  459.         return flag;
    7 V, P& }: z4 |* d
  460. }
    ) S* G0 q8 `5 T
  461. 9 p7 i& a$ \- _
  462. void LD_AsrStart()7 A8 n  R2 k7 }6 K% J0 L! R
  463. {" U9 U. d: t  `, |
  464.         ld3320_init_asr();/ k+ l" Y4 P/ I5 c/ V  ?4 J2 c3 K
  465. }
    / y- @! E9 j0 F  B1 Q9 s- q- A

  466. & r- O* v: B) z5 [
  467. // Return 1: success.
      u8 b) @3 n" d& \3 W0 `% `, r
  468. u8 ld3320_asrun()6 K% \1 h9 t8 d  v  X3 c
  469. {
    ) s- @3 v+ }6 }
  470.         ld3320_write_reg(0x35, MIC_VOL);# s  x! Z, t' `6 A
  471.         ld3320_write_reg(0x1C, 0x09);0 o% f! g, d% v$ W; `" t
  472.         ld3320_write_reg(0xBD, 0x20);" {8 q+ I! a/ q
  473.         ld3320_write_reg(0x08, 0x01);
    9 ^8 B: S+ [- Y1 h/ E
  474.         delay_ms( 1 );
    9 f) k. H/ T2 c+ J& [# x5 O
  475.         ld3320_write_reg(0x08, 0x00);
    2 ]. M7 b  \" Z2 }0 A) {
  476.         delay_ms( 1 );" a1 G$ k. O4 h: R  \
  477. $ r0 Q2 L" V! s$ X6 e  K5 h
  478.         if(ld3320_check_asrbusyflag_b2() == 0)+ N& T% V1 R4 E  W$ q
  479.         {
    8 O8 Q, L" l8 ^: _! t) ^
  480.                 return 0;3 o: G, V; T9 v2 T% ~5 M& D7 i
  481.         }$ N7 p9 y' t! B4 o3 F/ u

  482. 6 G0 {9 E+ N- q
  483.         ld3320_write_reg(0xB2, 0xff);        
    . q2 J( D/ c! c
  484.         ld3320_write_reg(0x37, 0x06);; g4 @1 O) f8 Y, N# F7 t
  485.         delay_ms( 10 );) d; a1 Z. f8 F/ n
  486.         ld3320_write_reg(0x1C, 0x0b);
    ( d7 m3 I1 {& K
  487.         ld3320_write_reg(0x29, 0x10);
    ; k8 `% g9 a( q* v( s1 `% ]' J: X
  488.         4 s: c, t6 Q0 e' e" T8 b
  489.         ld3320_write_reg(0xBD, 0x00);: b. z% B4 s; a  s( |1 D6 Y
  490.         return 1;5 G6 o/ t5 X& H/ i- u/ w8 l' Q9 A% C
  491. }, H3 [; u" N' Y( p* {
  492. - x) D- h& M3 c% Z. o9 I
  493. // Return 1: success.  b( `: S7 E( Y& S* h  S+ S5 ]
  494. //        添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法
    7 @' l! ~" M. U" `" l) E' ~
  495. u8 ld3320_asr_addFixed()
    " R# [% \" Y% Z( Y( G
  496. {
    8 M. U! g: d; H1 t9 \
  497.         u8 k, flag;0 h4 e8 }$ Y& y, N- m: _8 X" ]! Z9 }+ h
  498.         u8 nAsrAddLength;2 ^: D% ], l/ R) Z
  499.         const char sRecog[24][30] = {"xiao hui hui",
    7 [; M6 I9 v, g1 m" u' e  I. o" I
  500.                                                                 "ni you xi fu mei",+ ~% x4 ?" Y- f1 u0 D3 v8 y$ P
  501.                                                                 "jiang ge gu shi",$ K: A2 F  n0 h' ~* m( l. S# i* z
  502.                                                                 "ni shi bu shi dan teng",: j% ?) t6 q) k* U
  503.                                                                 "ni ban ben hao duo shao",
    , A) H" \: D2 D5 G0 M
  504.                                                                 "jin tian duo shao hao",+ M) {5 _, b0 v! g
  505.                                                                 "jin tian ji hao le",/ P- G: u, w: {4 v+ ^- N
  506.                                                                 "xian zai ji dian le",
    7 K8 [3 B! e+ M# f, m) ]0 W
  507.                                                                 "jin nian ji sui le",& t( J8 R- y9 G) t" G" o
  508.                                                                 "ni sheng wa le mei",
    / H+ H5 X$ z+ g
  509.                                                                 "da kai ji dian qi yi",
    / X7 f- j, e3 `* p" J% z( X/ ^
  510.                                                                 "da kai ji dian qi er",
    8 G+ |2 i; p! ^6 A% R# R
  511.                                                                 "guan bi ji dian qi yi",- V; F( h! P" b- G5 m
  512.                                                                 "guan bi ji dian qi er",5 k$ x8 i9 l3 }0 {7 u; V
  513.                                                                 "da kai suo you ji dian qi"," _7 `  F/ {2 z. [8 k/ W9 {6 G
  514.                                                                 "guan bi suo you ji dian qi",
    & c6 ^, Y4 e  D7 T  ~- ]! B
  515.                                                                 "tiao gao yin liang",% K7 k0 U! _$ v1 n% L/ z
  516.                                                                 "zeng jia tin liang",& l1 _- O9 Q, G7 |' d8 A
  517.                                                                 "tiao xiao yin liang",2 s+ h  v* e) U' F3 O
  518.                                                                 "jiang di yin lliang",+ r6 \6 j( _8 O
  519.                                                                 "tiao gao yu su",8 w. p, z; k8 k7 i$ j4 W; g# f
  520.                                                                 "zeng jia yu su",+ U1 N. S2 R/ g6 G
  521.                                                                 "tiao xiao yu su",  ?: x3 V$ `% x$ m. A
  522.                                                                 "jiang di yu su",
    : V: I4 ~: U. N' P& ]. ^7 W* V
  523.                                                                 };4 z) ~4 {, ^/ ]6 y
  524.         const Order pCode[24] = {
    - ~6 _. o4 V3 ]
  525.                                                         name,: R9 K$ F  H& V. L( _& n% ~. H
  526.                                                         wife,
    8 t' G: v! q+ `. P
  527.                                                         speakStore,! }% d( J/ k4 a! N- c8 P
  528.                                                         eggPain,
    + R0 |; R3 W, R" \
  529.                                                         visionNum,+ x1 e, _9 ~- ^& s
  530.                                                         todayDate,+ X0 Y1 i- H' ~- t. F
  531.                                                         whyToday,% k4 Z  n1 p, k  E1 S3 n! Z
  532.                                                         whatTime,  N$ x  f6 ~* V- d
  533.                                                         howOld,# o3 d' ?$ V. {! G5 a  |
  534.                                                         haveChild,) F, l3 a2 ^9 ~6 s' i$ C; ^# {7 e
  535.                                                         openRelayOne,! L1 X9 V9 M* v* m
  536.                                                         openRelayTwo,
    - U. N  s5 @; M2 p) v2 j
  537.                                                         closeRelayOne,. M; {" W1 M. N
  538.                                                         closeRelayTwo,8 w/ h5 R  N$ Q3 E
  539.                                                         openRelay,
    1 k& Z2 z9 g+ A9 B3 A: y' f. U
  540.                                                         closeRelay,0 r5 C9 I/ r& @& z
  541.                                                         upVolume,
    - x9 v6 d8 M) O
  542.                                                         upVolume,
    8 \& L; }* i3 o0 `6 e# |  N
  543.                                                         downVolume,; R% L; |& x, b9 [
  544.                                                         downVolume,6 g3 ~' v+ O0 A
  545.                                                         upSpeed,
    $ a" n1 G4 T0 m# z  D2 u
  546.                                                         upSpeed,4 E$ c) U- J6 r4 c5 f5 v* s; e( B2 Q
  547.                                                         downSpeed,
    7 k" |- u8 H& t9 [/ X. b9 x( e
  548.                                                         downSpeed,
    8 R; F, i* u9 e& J( J
  549.                                                         };, ~+ n8 ^5 z/ g; ]7 V, N
  550.                
    / e/ ^( q! L# H
  551.         flag = 1;# M2 k9 `! h0 [% F, ^% W5 m
  552.         for (k=0; k<24; k++): w, z8 M1 |  ~6 M  u
  553.         {
    . g' k0 ?" n- B" s" [! j& W
  554.                         
    . U$ r0 s8 y) L* w5 @8 ?# J0 w9 f% q9 j
  555.                 if(ld3320_check_asrbusyflag_b2() == 0). I5 a! }6 ?2 K
  556.                 {
    6 K- g- t7 ?4 D6 Q$ S  C. G
  557.                         flag = 0;7 }& q8 i9 Q; \7 e
  558.                         break;) T: h3 ~: @( a9 l+ I
  559.                 }- r' ^. _& z2 d) N0 F" \; @
  560.                
      M: A( i, A. y6 L
  561.                 ld3320_write_reg(0xc1, pCode[k] );6 d5 ?1 m; d8 y' F
  562.                 ld3320_write_reg(0xc3, 0 );* l7 \1 X" H; O; _/ N
  563.                 ld3320_write_reg(0x08, 0x04);3 N  T+ {: Y1 D# W( U% U
  564.                 delay_ms(1);
    6 s0 v) v6 H; y% k3 c
  565.                 ld3320_write_reg(0x08, 0x00);
    ' m7 t: P/ G: D2 d
  566.                 delay_ms(1);
    8 v4 V" N1 f8 |% t0 O

  567. & ~& b+ `3 _2 i4 T6 e
  568.                 for (nAsrAddLength=0; nAsrAddLength<30; nAsrAddLength++)& K" _$ @1 \$ F8 k9 d0 R' }, u
  569.                 {
    - N" e7 E" a9 `5 \5 v
  570.                         if (sRecog[k][nAsrAddLength] == 0)7 |6 M" Z; M4 {, }1 p. X
  571.                                 break;
    + H* n$ _8 o! y/ n/ \
  572.                         ld3320_write_reg(0x5, sRecog[k][nAsrAddLength]);
    9 K! f3 u& h1 b1 q/ @& |
  573.                 }. j6 K# D" q7 Y/ @) v* @
  574.                 ld3320_write_reg(0xb9, nAsrAddLength);
    . w' f5 B1 o! L7 F; i; f
  575.                 ld3320_write_reg(0xb2, 0xff);
    ) ~' B" z2 C: k7 t% J# X9 C
  576.                 ld3320_write_reg(0x37, 0x04);7 z% T: q- Q' u1 a
  577.         }7 E. Z. b7 Y2 q" Z  q0 Y8 B( e
  578.     return flag;2 T& T7 `9 o, H
  579. }! Q" E( i3 f0 A& Y+ d3 r  I

  580. : w. U. L3 R$ o- w9 w5 e; e
  581. - S- ^- d, t3 n+ k
  582. u8 ld3320_get_result()
    6 r/ X8 E: W2 u1 M" U( Q5 U$ g" ]4 j
  583. {
    0 q. J! Z4 U' n: q8 U
  584.         return ld3320_read_reg(0xc5 );7 a) n& `2 v5 Z7 ^3 f6 c# T
  585. }, p% L) h- j/ l5 s% I& d
  586. 6 B1 m1 V3 S+ i: ~' S% N0 E, F
  587. /************************************************************************************/
    5 }$ B* G$ [, k! ~5 [' S; y3 I
  588. //        RunASR()函数实现了一次完整的ASR语音识别流程
    # E5 c& R. c5 Y: z) j9 W. T
  589. //        LD_AsrStart() 函数实现了ASR初始化
    / g! K( `" E9 y% E7 s  u; }1 ]5 k" d
  590. //        LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中( P$ u# ^1 Q: S/ w% D0 s/ k
  591. //        LD_AsrRun()        函数启动了一次ASR语音识别流程
    8 b: X( m; h5 |- |. |$ l& Y
  592. //
    " Z" v4 Q, l, M$ k' a8 E2 J
  593. //        任何一次ASR识别流程,都需要按照这个顺序,从初始化开始进行
    7 T4 b6 G( i. W; @" ~* I5 p
  594. /************************************************************************************/
    3 \! u4 {: _6 `1 ~
  595. * {# \5 k+ R( E; a$ H1 e2 I+ M, P
  596. u8 ld3320_run_asr()- r  \2 R5 d8 r/ E
  597. {# M) @) _% O) \$ i% ^: j
  598.         u8 i=0;
    * F8 |# q" X3 v  ?# j
  599.         u8 asrflag=0;9 A1 ^! V8 g9 B  ~/ j* \8 n
  600.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程  ^5 d2 a2 w& J, g1 L
  601.         {
    9 g3 Y5 z5 |( }8 J' W$ Z
  602.                 LD_AsrStart();
      ~% g5 g% F  i+ y' x5 O+ g' u/ ?1 w
  603.                 delay_ms(10);1 i5 m' }; ?7 H. @/ z2 v( K& t
  604.                 if (ld3320_asr_addFixed()==0)4 z, q# Y2 E8 p1 @" Q
  605.                 {
    & S1 i3 E4 n5 _3 v$ C
  606.                         ld3320_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片9 S" A" M# D  y% Y3 q
  607.                         delay_ms(100);                        //        并从初始化开始重新ASR识别流程" G( }# C9 u- J4 v$ D; F
  608.                         continue;+ K, z3 H1 |$ z/ j+ x7 A! A% I
  609.                 }
    " M' k" O- f7 T4 E$ s
  610.                 delay_ms(300);
    6 f; \1 J) {: Q# C; \
  611.                 if (ld3320_asrun() == 0)
    # o/ W. i5 t; f4 r% k6 r
  612.                 {
    ; m9 P: k% y: t# b3 H& z$ C! }' \
  613.                         ld3320_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片5 g+ u* x+ o( Z' ~
  614.                         delay_ms(100);                        //        并从初始化开始重新ASR识别流程
    - D( y+ @% \& ]& l7 d+ y& [) H
  615.                         continue;
    % g6 o6 |; M2 o( s6 s2 x' ]
  616.                 }
      A) D4 g7 b4 `3 c4 m  C

  617. 0 p" a6 |6 g6 Z3 j5 @* l" I
  618.                 asrflag=1;. {" q# D) c6 J5 \. c' e$ c/ U5 ^& |
  619.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
    $ v: W6 K9 }- g, d* B2 l- l2 A
  620.         }
    : _- n* o9 J' t4 |
  621. ; \3 ?2 `! {  ]& D7 s2 L+ p8 P
  622.         return asrflag;6 v+ O3 P9 o/ O% u
  623. }
    # |9 w" a+ p6 ^9 c2 |% V+ k
  624. 3 {! e# Z  z0 S7 F! |
复制代码
% |7 W5 T, T; G' |1 g$ x/ @
LD3320.h' }& K. U) p$ ~8 n  ?

5 @9 @0 h7 p4 f" K
  1. #ifndef __LD3320_H 6 X& A) s( O9 l: Z* J
  2. #define __LD3320_H
    5 D# _3 @: D1 Z0 U; |, K# L+ S! a- ~
  3. #include "sys.h"
    . p) l; A/ Z, x; f8 d

  4. ' Y3 ?( E* S6 ~# q; `7 l8 R2 U
  5. typedef struct' K! c& c$ v5 m' y% r* g2 g0 s
  6. {6 P. ]0 l7 s/ T, D8 N; a+ t0 A
  7.     unsigned char  b0:1;
    . x5 Y1 m- n( U0 J- h: W
  8.     unsigned char  b1:1; 9 q3 z: b; D" p! ~2 n
  9.     unsigned char  b2:1; 6 L5 f+ C% _. D2 U3 Z  K
  10.     unsigned char  b3:1; " p" Z1 V$ M0 H9 X- s8 m, F1 L
  11.     unsigned char  b4:1;/ h4 w1 q* k) d' B- O" ?
  12.     unsigned char  b5:1;, X. l. W( D! E# L$ x+ N
  13.     unsigned char  b6:1;
    . e- R; E1 Y6 \; {
  14.     unsigned char  b7:1;$ @) z' c5 ~' S: S/ N
  15. } BIT8;
    % \% v, z# f) j
  16. 7 q3 I: L' w1 S% e
  17. extern u8 ld3320Data;
    ; g; a* o  B! o( N
  18. #define     bita0               (((BIT8*) & ld3320Data) -> b0)
    . N$ `& f- O; d7 g2 J
  19. #define     bita1               (((BIT8*) & ld3320Data) -> b1)
    7 N' `, D( {; }5 ~: F+ R
  20. #define     bita2               (((BIT8*) & ld3320Data) -> b2)
    1 w8 r' H1 F, `) L5 J+ o
  21. #define     bita3               (((BIT8*) & ld3320Data) -> b3): d* U# |/ l9 X" d/ I
  22. #define     bita4               (((BIT8*) & ld3320Data) -> b4)
    4 W5 D; p0 h% G2 `9 ^; f6 T* S7 _
  23. #define     bita5               (((BIT8*) & ld3320Data) -> b5)8 T  j# _% J! t1 v
  24. #define     bita6               (((BIT8*) & ld3320Data) -> b6)# I- e8 s. F/ i5 `
  25. #define     bita7               (((BIT8*) & ld3320Data) -> b7)/ ?4 o- i) _$ T4 }
  26. 9 P* U* g% F8 P
  27. 7 ?. Z: V2 K( `$ N

  28. ( J0 h  t% w$ e0 }
  29. * w$ U% ]5 X2 P" {
  30. #define LD3320_A0   PBout(15), f: t4 Z, o& q1 {0 @+ O- f0 I2 J0 t
  31. #define LD3320_RD   PBout(14)
    ) D* @- R: Y* T) [4 }6 c
  32. #define LD3320_WR   PAout(12)
    , U# }9 ?  A3 K( u1 [4 M8 p) g/ A7 A+ O# j
  33. #define LD3320_CS   PAout(11)! e6 a2 t8 a  _4 m# Q
  34. #define LD3320_RST  PBout(10)$ R! _) u/ R! H
  35. #define LD3320_MD   PBout(13)
    1 e" l0 a8 d+ c2 g7 i4 f
  36.                 1 |* H( R9 f$ r
  37. #define LD3320_D0 PBout(5)# E: [& _+ {! |: ^" d  v  _6 g- Z
  38. #define LD3320_D1 PBout(4)# J) j; W$ \% ]3 [) X1 f. p7 {
  39. #define LD3320_D2 PBout(3)5 x1 m! q3 Z/ H
  40. #define LD3320_D3 PAout(15)
    ! R' u. l* G2 R7 n
  41. #define LD3320_D4 PBout(9)
    % P" {3 C8 i- Y5 f* ~
  42. #define LD3320_D5 PBout(8)
    # D& \$ x/ u* k
  43. #define LD3320_D6 PBout(7). F; ?3 X7 ^% A- k8 k' [5 [2 p
  44. #define LD3320_D7 PBout(6)% r) B% x, X- w: V: s0 C9 q

  45. + a6 i. ]3 @9 u. ]
  46. #define LD3320_D0_R PBin(5)
    . J2 D, \  v, i. S4 d
  47. #define LD3320_D1_R PBin(4)% z2 P* D& A# B' R7 M: o6 I8 A  o
  48. #define LD3320_D2_R PBin(3)+ Q+ k4 ]" W( m" z0 O
  49. #define LD3320_D3_R PAin(15)
    0 b; i4 u. l3 S# `( Y
  50. #define LD3320_D4_R PBin(9)
    9 O8 F* E4 {! H3 W
  51. #define LD3320_D5_R PBin(8)7 ?; \$ A; f2 I" i, F2 s, j
  52. #define LD3320_D6_R PBin(7). R2 j  J1 z9 e7 x! s* ]
  53. #define LD3320_D7_R PBin(6)6 |! l3 d# i9 d  n

  54. ' b" W: r) C) x5 W
  55. , [# {7 k1 e( A6 A6 j% f
  56. #define LD3320_DATA_IN()  {GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=(u32)8<<28;GPIOB->CRL&=0X00000FFF;GPIOB->CRL|=0X88888000;GPIOB->CRH&=0XFFFFFF00;GPIOB->CRH|=0X00000088;}
    ' P3 B- B' E! D. e$ g
  57. #define LD3320_DATA_OUT() {GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=(u32)3<<28;GPIOB->CRL&=0X00000FFF;GPIOB->CRL|=0X33333000;GPIOB->CRH&=0XFFFFFF00;GPIOB->CRH|=0X00000033;}9 n2 D% W2 w( T$ H- e
  58. 6 ^) x2 \' Q% ^6 Q5 ?1 ]& {7 v! N& o
  59.   h$ r+ d" e) K* ?( E1 F
  60. #define LD3320_DATA_WRITE(x) {ld3320Data = x;LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;}3 M4 O9 H0 V! O  W; g
  61. #define LD3320_DATA_READ(x)  {bita0=LD3320_D0_R;bita1=LD3320_D1_R;bita2=LD3320_D2_R;bita3=LD3320_D3_R;bita4=LD3320_D4_R;bita5=LD3320_D5_R; bita6=LD3320_D6_R;bita7=LD3320_D7_R;x= ld3320Data;}
    ! O1 {1 b7 [: k' J. L
  62. ) {1 L; G$ w7 ^3 ]
  63.         9 Q1 S; J9 a9 T( E0 w, E- I
  64.         
    0 n& y) U. {& D! i( d5 P
  65. //        以下三个状态定义用来记录程序是在运行ASR识别还是在运行MP3播放
    1 P* u- j, m" I8 i3 l
  66. #define LD_MODE_IDLE                0x00
    & V; J5 y" f3 T- O% J6 I8 B% d
  67. #define LD_MODE_ASR_RUN                0x08
    / U/ V( X3 K" ]2 [  j% j! l$ D9 H2 ~" g
  68. #define LD_MODE_MP3                         0x40  j  Y- a. l* Z
  69. 3 R# C  ~6 Y  V

  70. ' D, J. q& A/ T$ U' d! S6 ^
  71. //        以下五个状态定义用来记录程序是在运行ASR识别过程中的哪个状态' `6 Y/ O, y+ J4 |: p
  72. #define LD_ASR_NONE                                0x00        //        表示没有在作ASR识别- W" O( B) J8 X
  73. #define LD_ASR_RUNING                        0x01        //        表示LD3320正在作ASR识别中( u# A% I. G% Y+ W: m
  74. #define LD_ASR_FOUNDOK                        0x10        //        表示一次识别流程结束后,有一个识别结果
    6 ?) g) I% a5 y  V4 S& g2 O" |5 p
  75. #define LD_ASR_FOUNDZERO                 0x11        //        表示一次识别流程结束后,没有识别结果" c0 h: z' w" d5 {  {! `
  76. #define LD_ASR_ERROR                         0x31        //        表示一次识别流程中LD3320芯片内部出现不正确的状态& m, ^+ ?& C; W6 }+ D& u9 E

  77. % ?9 x" r! }! N% O: @! }
  78. & ~$ t3 r$ N: b% I$ \2 {' ?6 O: C
  79. #define CLK_IN                       8        /* user need modify this value according to clock in *// `* e1 d) X; r  O' e) X
  80. #define LD_PLL_11                        (u8)((CLK_IN/2.0)-1)
    9 S5 c2 [% O9 _3 U3 B% O$ I* v
  81. #define LD_PLL_MP3_19                0x0f3 }9 P6 X0 x9 y6 P3 q
  82. #define LD_PLL_MP3_1B                0x187 ]! k  ?& Y& U$ W9 H2 q8 c. m
  83. #define LD_PLL_MP3_1D           (u8)(((90.0*((LD_PLL_11)+1))/(CLK_IN))-1); S) u; A( X+ p; c1 P  X
  84. + ]6 N5 P7 X# f  j6 `2 v$ Z
  85. #define LD_PLL_ASR_19                 (u8)(CLK_IN*32.0/(LD_PLL_11+1) - 0.51)6 O8 X- b8 k. J
  86. #define LD_PLL_ASR_1B                 0x48- T* s' t7 O3 t
  87. #define LD_PLL_ASR_1D                 0x1f
    ! k" I, }. B# H, S

  88. : h! Q6 i5 l1 L) W0 \3 W0 L
  89. // LD chip fixed values.5 D# e! E7 }7 Q8 X; X
  90. #define        RESUM_OF_MUSIC               0x01- I, ~- K7 M: P) W6 B0 f$ m* }
  91. #define        CAUSE_MP3_SONG_END           0x20
      ?0 B3 k( K0 A; x
  92. % f) W: x; ~3 t+ u" f
  93. #define        MASK_INT_SYNC                                0x10/ a/ S9 a. @* e* N4 R9 l1 `
  94. #define        MASK_INT_FIFO                                0x04: Y: f2 Y3 [# {) ]# U  y
  95. #define               MASK_AFIFO_INT                                0x01# w6 s% @3 \8 \
  96. #define        MASK_FIFO_STATUS_AFULL                0x08        8 ^( D' ~  L' Z! q/ p
  97.         
    , z( {1 i) |- K1 @
  98.         
    ! v0 N3 Q  P7 o* T1 a- ~2 B- r: d
  99.         # j9 b6 y9 D' ?. A
  100. typedef enum" z$ i' F' E! m4 T7 g# i$ T3 Y
  101. {% v* i- J. L8 @4 L7 h6 P9 l
  102.         name=1,  //小灰灰
      P3 _6 W2 I: f. O" z/ T2 L5 \
  103.         wife=2,  //你有媳妇没
    & a' X8 g# L. P, |7 E9 L, ]( G
  104.         speakStore=3,//讲个故事, k! F. g; ]( S) n# k$ f
  105.         eggPain=4,  //你最近是不是蛋疼
    3 F3 s3 ]$ _7 ?( `2 P
  106.         visionNum=5, //你版本号是多少
    : J# g3 X2 y1 o2 V! w
  107.         todayDate=6,//今天多少号
    % W4 o6 W) I$ u& G
  108.         whyToday=6, //今天几号了
    * v/ w: }' u) N. L9 X
  109.         whatTime=7,  //现在几点了
    - x, a. D0 H& n9 m
  110.         howOld=8,    //今年几岁了% }( w. m$ ?+ i
  111.         haveChild=9, //你生娃了没
    ! m3 V$ P2 v, W0 n& u1 ]
  112.         openRelayOne=10, //打开继电器一5 u" ]1 z0 I! Z1 H/ R4 m/ X9 c6 |$ e
  113.         openRelayTwo=11,  //打开继电器二
      A9 L0 `" L( j$ y) b
  114.         closeRelayOne=12, //关闭继电器一
    9 y. O0 Z0 n/ Q
  115.         closeRelayTwo=13, //关闭继电器二. c3 ^5 C8 n- L  l# q" q
  116.         openRelay=14,     //打开所有继电器
    7 q; l1 l" t: \0 T; V2 _. p( ]; X9 C
  117.         closeRelay=15,    //关闭所有继电器  z' u& c/ K9 w$ B4 A
  118.         upVolume=17,   //调高音量, \' j$ ~. f# j% ?% j8 p
  119.         downVolume=18, //降低音量
    : I( m' u- C& U3 C
  120.         upSpeed=19,                //提高语速& [& J0 {$ q5 v  `
  121.         downSpeed=20,      //降低语速
    ' K; |$ r# D  j( Y# X
  122. }Order;
    & R0 n4 p, K+ z  i2 o% ?4 p, F) ]* t
  123.         9 l' C+ }0 K6 @9 V' d7 t
  124.         9 {* H+ t& r& [$ s( _  b4 w2 Z
  125.         
    ( b: q, j" h) ]# B' E, L
  126.         
    ; j) u; J8 E& J* }" a
  127.         
    " l+ }5 f9 m! L6 I! m8 T7 u8 m
  128. extern unsigned long nMp3StartPos;/ m5 D9 e  B: I' I* c/ \) k! Q6 V
  129. extern unsigned long nMp3Size;
    , v' \) j$ M0 G3 D$ T
  130. extern unsigned long nMp3Pos;) r0 n' X2 K0 \. h1 J2 h* A
  131. extern u8 bMp3Play;                                                        //        用来记录播放MP3的状态
    6 Z9 [0 z* E$ ~9 I9 u1 d# u9 q* g! T
  132. extern u8 nLD_Mode;                //        用来记录当前是在进行ASR识别还是在播放MP39 s( I* p9 b0 Z/ H
  133. extern u8 ucRegVal;* X- b# D  A& F
  134. extern u8 ucHighInt;
    ( P4 s: q8 V& i9 V" W" v- M
  135. extern u8 ucLowInt;6 l, w- J6 n1 w$ }& N* p
  136. extern u8 ucStatus;
    ( ~! Z, s' q# D# w  @9 d4 I$ j
  137. extern u8 ucSPVol; // MAX=15 MIN=0                //        Speaker喇叭输出的音量
    9 p, H7 w2 |8 G$ q/ v7 M( |8 G
  138. #define MIC_VOL 0x55        ! C" C/ n) ^% a" S! N' j
  139.         1 q, R  h. J9 c2 y9 d% U+ G1 }
  140.                 ( L3 B0 C# k5 C1 l6 l$ o5 J( N6 p
  141. u8 ld3320_check(void);        
    - i+ G6 z; }6 i& d) e
  142. void ld3320_init(void);        " c4 E% i1 I8 b5 J
  143. void ld3320_process_init(void);        
    3 y* X; s* a8 a
  144. void ld3320_reset(void);
    8 |# Z3 |! I$ x2 W& a& ^7 q  A
  145. void ld3320_init_common(void);
    + R) W. ], b% P) |4 J. ^6 A( `: B
  146. void ld3320_init_mp3(void);' {! w' S: q3 b3 M1 M5 N0 d
  147. void ld3320_init_asr(void);
    # n* v1 ^! f( |. E& ?/ e
  148. void ld3320_reload_mp3data(void);
      R* i2 A) n3 j& J& x8 l
  149. void ld3320_reload_mp3data_2(void);  j0 w9 g% ]+ f/ a: ]5 m1 |
  150. void ld3320_play(void);& V* K! F/ F8 y& m: q5 v
  151. void ld3320_adjust_volume(u8 val);- R  _0 T/ l4 h1 f7 G2 W7 x6 ?
  152. u8 ld3320_check_asrbusyflag_b2(void);0 W2 P  Q/ I: U1 e! f
  153. void LD_AsrStart(void);
    . ~% |9 W% f( H2 z; o! j, a+ N
  154. u8 ld3320_asrun(void);
    , E) q8 N4 i$ y9 f
  155. u8 ld3320_asr_addFixed(void);& L8 l- ]3 g" U& @+ v9 @# Z
  156. u8 ld3320_get_result(void);0 p6 Z- e# d. i5 Q
  157. u8 ld3320_run_asr(void);9 l: m) t2 X8 P7 l
  158.         4 R% K8 _. F7 r/ I$ T" U/ f
  159. #endif
复制代码
/ \8 o$ e; v* T, ~' E
freq.c- l& w) @- j+ A& `& W, ^, s

. U0 s0 U. O& Z" ^( X+ Q
  1. #include "freq.h"
    : O. V: s  `/ E( [5 `% V
  2. , |+ g  [! ~+ k7 S6 J9 w  c

  3. ' |& v0 @: L& w7 j' s& [# ^9 o+ e, e, p
  4. void ld3320_freq_init(void)
    * r' l4 q# u5 `$ f( J
  5. {: w0 k/ o( R& `0 x5 y0 s

  6. ; ^$ N" [7 N) w2 l) v/ e
  7.         GPIO_InitTypeDef  GPIO_InitStructure;. F5 p& j* |  {' Q) `* L3 }
  8. 5 k  g+ `9 m# m- n' W/ r8 V
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);         //使能PB,PE端口时钟
    1 H! i; ?  f$ C0 [  |( e) F- v
  10. 9 d& k1 w2 k3 O

  11. % b- ]5 f, M$ }* b
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    9 E0 ?  Q1 t& {, c+ ~' S
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;$ w+ V1 `) R( t* `0 |. u
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      b6 l  e" k2 ?$ T
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);        
    ( B0 R  }# u% l# E# G
  16.         GPIO_SetBits(GPIOA,GPIO_Pin_8);1 T' ?7 X" A, _( O6 i+ g) {
  17.         , Q1 U, z; v. W2 s3 |
  18.         RCC_MCOConfig(RCC_MCO_HSE); //RCC_MCO_NoClock --- 无时钟输出 : o0 {1 w: a+ B4 e& B, E" a
  19.                                                                 //RCC_MCO_SYSCLK --- 输出系统时钟(SysCLK)
    ! U9 R# ^: q3 T+ U( G8 z. F! \1 r* q
  20.                                                                 //RCC_MCO_HSI --- 输出内部高速8MHz的RC振荡器的时钟(HSI) ' W2 ~; r  q- d" |4 I
  21.                                                                 //RCC_MCO_HSE --- 输出高速外部时钟信号(HSE)
    % I) E, {  i- k" R+ U% t
  22.                                                                 //RCC_MCO_PLLCLK_Div2 --- 输出PLL倍频后的二分频时钟(PLLCLK/2)               
      W% E0 x  l2 {
  23. }
    . E( ^/ E0 {1 J& |% [0 j: }# @9 y
复制代码

$ p& s& z5 o( Y) Tfreq.h
5 i& Q3 h$ G3 g& }5 s' ]9 ?
' p- g, J0 `2 o) |- S% v
  1. #ifndef __FREQ_H% d" ^( j9 N6 P1 H0 i6 S+ E
  2. #define __FREQ_H % H! c$ h) c: R" I4 T2 }. h  V$ I9 V) j
  3. #include "sys.h"
    3 d$ Q& z& o/ C) r, g( Q* ?2 U2 w
  4. ; `, V* s& t3 L' z8 q* ~/ o7 c. [

  5. , ?# e* u/ J4 S- s/ w
  6. void ld3320_freq_init(void);        $ Q' x# V7 r7 ^* o1 `
  7. 1 k3 K, a! a& W' _6 I* c' x! @
  8.                                                      
    % z1 n$ j5 l6 l
  9. #endif
复制代码

8 ^& d( e6 k$ gmain.c
8 g) _1 q! s6 V. k
8 A6 q5 v) s* ~3 S
  1. #include "sys.h"
    ) x" T* ]! b( g" ?: m  R/ ~1 o5 q: U
  2. #include "delay.h"
    2 w, `0 {! r+ F  o/ t- f* j% p* u; b
  3. #include "usart.h"
    $ Q  H8 J- r8 g7 Z
  4. #include "led.h"
    - R' f3 @- U" T) F/ a+ j4 X
  5. #include "ld3320.h"
    ; B# P& S  ?- [2 i
  6. #include "freq.h"6 o. ~7 H  u2 f" Y6 ?. l# e) k
  7. #include "malloc.h"        
    - B3 y% ?% F3 o" Z1 M0 H6 l
  8. 6 p/ ~' h, a2 V
  9. % U6 P6 g! Y$ @% a$ A& t3 v# W5 {
  10. u8 nAsrStatus=0;        , G% j+ b' B8 h# ~2 B3 d' j
  11. extern u8 bMp3Play;                                                        //        用来记录播放MP3的状态
    # ~# _  u. z. S

  12. + ?" {0 A! d4 ?) L$ Y
  13. u8 voiceSpeed=5,voiceVolume=10;. |- z6 _9 Z  i4 ^! B

  14. 9 z8 ?8 Q! B% h5 B! S
  15. int main(void)
      B- j! x9 f2 K; ?' o4 g, m
  16. {        ; W% B9 ^+ b0 h$ s1 j; i7 t9 ]
  17.         u8  nAsrRes;! z2 y( H9 ?5 f% M+ k7 H
  18.         u16 i;' ]0 y( _5 ]) ]( M8 F& w
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    % B3 y$ ^  @  I6 o( U  W6 y
  20.         uart_init(115200);$ c9 m1 r$ v0 g7 f0 Z) M
  21.         % R3 E/ f, V7 D/ B4 A- q
  22.         delay_init();        
    ( g% U9 h1 e: p' K" p! s  y* m
  23.         ld3320_freq_init();
    1 K9 J: B0 k) x0 d, `
  24.         led_init();        
    * s8 E( N0 k% ^
  25.         mem_init();                                //初始化内存池5 m7 p# F3 y( M, [1 |3 C" P$ Z
  26.         ld3320_init();
    , _2 T1 x' q; @: [6 A
  27.         delay_ms(1000);) K3 ?% p4 v. R$ ?7 x
  28.         ld3320_reset();3 L/ n+ @- O' e  e3 h! a6 d: @$ C
  29.         while(ld3320_check())
    & l' i6 w# p" |' f& Q" A- ^7 |
  30.         {
    " Y3 R- F8 s$ v8 m7 b
  31.                 printf("LD3320 Error!!\r\n");6 B2 x; U. K5 d  c/ y
  32.                 turn_r_led();
    4 C5 D* F8 t8 C0 ]
  33.                 delay_ms(500);. L% ?8 k  @# @  E5 a
  34.         }        3 B; L+ m: z6 ^, a' `; P7 }
  35.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR1 X6 _) |, c2 {
  36.                
    4 @- K. z; z8 |4 }4 [2 p* N
  37.         while(1)
    - n! n% l7 c$ v3 Y0 J
  38.         {        / d1 R! u3 {. s7 {9 @: e3 I
  39.                 if (bMp3Play!=0)                        //        如果还在播放MP3中,则等待,直到MP3播放完毕 即bMp3Play==0
    / c# j* G1 g+ _5 ]* v0 \+ f
  40.                         continue;                                //        bMp3Play 是定义的一个全局变量用来记录MP3播放的状态,不是LD3320芯片内部的寄存器1 d% p6 s- \8 p, ?! i4 a+ J
  41.                 switch(nAsrStatus)
    . R' u/ G* R, `2 _% [6 f
  42.                 {3 \9 g4 q5 k9 [# w/ Y% [
  43.                         case LD_ASR_RUNING:        break;
    - R: ~2 f" I7 {+ b4 N" ?' A8 t
  44.                         case LD_ASR_ERROR:        break;- S' U  ~. z- T0 \+ F( n- ~6 L1 C
  45.                                 
    5 n5 X$ g8 ~* U' @
  46.                         case LD_ASR_NONE:
    - ^( t% l  z6 }+ L" Y9 H$ }$ e
  47.                         {        - ?. j$ S8 J7 p' u
  48.                                 nAsrStatus=LD_ASR_RUNING;. y: e$ Y, [8 K( t, \
  49.                                 if (ld3320_run_asr()==0)        " m( n; U! K" ^5 V
  50.                                 {
    ) \" L# p; K$ n1 T( R' V' j' y
  51.                                         nAsrStatus = LD_ASR_ERROR;0 h. M8 \. q# f7 x* W
  52.                                 }" ~  n& P& g0 v5 `  `* `- F' b
  53.                                 
    5 f: }  M" d/ s. @; P/ [. s
  54.                         }break;5 ~# g! u8 ]+ u% D) J
  55.                         case LD_ASR_FOUNDOK:* E+ j0 V# @7 s$ R4 z6 P
  56.                         {
    ; S1 i' t# l  R/ x: t, B
  57.                                 nAsrRes = ld3320_get_result();
    & w+ e/ r% w! c6 D6 P# b; `1 w
  58.                                 printf("nAsrRes=%d\r\n",nAsrRes);                                
    , X( \$ B0 Q' W6 d- {
  59.                                 switch(nAsrRes)
    1 h& M9 d7 y8 o7 n
  60.                                 {1 n- m& v: j# v- L1 B( v# e1 j
  61.                                         case name:( B) j+ C0 [1 z  m
  62.                                         {           1 E; G- M. i) g$ b" h( F1 ^
  63.                                                 printf("小灰灰\r\n");        
    - L3 i5 C* _0 e3 K7 J7 @
  64.                                         }break;
    # W7 W& g8 D5 I3 g: u7 r
  65.                                         case wife:   
    % J+ l- E3 Y/ o' A- W
  66.                                         {
    0 q' Z$ m+ b& s& b; w7 U
  67.                                                 printf("你有媳妇没\r\n");9 A3 u# [$ F" I, H+ ~2 t
  68.                                         }break;( p( y. h6 w2 z' |) i; k  L# E
  69.                                         case speakStore: . ~1 f8 @; X+ g
  70.                                         {                        
    2 T, N1 ~8 ]0 @6 ^' W
  71.                                                 printf("讲个故事\r\n");
    * G( W& f; o7 a6 H( X( \2 h
  72.                                         }break;. H3 R6 n, q, d7 c/ W
  73.                                         case eggPain:   
    . r% b7 g& l" I- z  A; u& [
  74.                                         {                                                
    & \- h- Q* C. z: G+ w9 f; r
  75.                                                 printf("你最近是不是蛋疼\r\n");. M+ Y1 x: H6 o; T
  76.                                         }break;
    8 U, C# ?+ b2 h4 V; W1 B5 M
  77.                                         case visionNum:   ; K& r& T2 {5 K( y
  78.                                         {                                                # q: v, U* }, b  p$ {3 T5 d
  79.                                                 printf("你版本号是多少\r\n");$ z5 I2 ^/ E& `! A% U% d+ I
  80.                                         }break;
    ) R; v6 \. @" g+ c  k: e
  81.                                         case todayDate:
    1 y% {9 J9 R( ^* |
  82.                                         {                                       
    , v9 O( g! s/ w5 o+ y
  83.                                                 printf("今天多少号\r\n");5 G5 o5 l* f! m- l  b2 B+ L$ L
  84.                                         }break;
    $ @: f5 T/ ^' y- c6 ]) R
  85.                                         case whatTime:  
    $ W3 s, f6 I' y, ?, J- ~
  86.                                         {                                                - O# u/ Z$ D0 ~! K& J7 ?. k) w
  87.                                                 printf("现在几点了\r\n");                                          v4 Y& e$ \$ M
  88.                                         }break;
    3 v2 [+ P+ p; F. I/ u/ F% v
  89.                                         case howOld:        ' \( O8 D2 @4 g( R; c$ f
  90.                                         {                                                
    ; e  |) i- ~6 l+ s& `0 s
  91.                                                 printf("今年几岁了\r\n");
    & c: V+ L2 o; l; }* N* r6 T
  92.                                         }break;
    . K! r  i+ O+ N+ v' m3 q9 A% ~2 ]
  93.                                         case haveChild:  
    8 E; v  T. y) Z; t; I  L5 s
  94.                                         {                                        1 ]6 e+ X6 p, e" U2 A" ?
  95.                                                 printf("你生娃了没\r\n");  u! O; r6 K$ D. c9 F8 j
  96.                                         }break;
    4 d3 z5 P- b% c9 u, V+ E& a! C
  97.                                         case openRelayOne: ; v( Y1 i7 j- q0 }4 k7 H; I
  98.                                         {                                       
    + T1 p9 |( ^% J6 ^9 k4 [
  99.                                                 printf("打开继电器一\r\n");
    ) b* @* B- C- F
  100.                                         }break;  D$ p- ]* r9 Y9 E: q
  101.                                         case openRelayTwo:2 I" ], {9 \0 {$ n
  102.                                         {                                                % D! ?0 U; D5 w# A! g/ N9 \
  103.                                                 printf("打开继电器二\r\n");) D; Z" g( E5 A, H  e
  104.                                         }break;) q3 ?; b9 N6 s
  105.                                         case closeRelayOne: 0 ?+ c/ S8 o. J# [, R. S/ O
  106.                                         {                                                ; J: J2 I3 W/ _- f, z4 O
  107.                                                 printf("关闭继电器一\r\n");+ i8 f( M  ~, U4 {% B0 J4 R! j
  108.                                         }break;1 `, ~  d* [$ k- J/ f5 I
  109.                                         case closeRelayTwo:
    ! Z1 m0 @4 S1 ^, A+ z/ e. t2 b
  110.                                         {                                                
    $ i* x6 W4 X  v  |8 ]' T. K
  111.                                                 printf("关闭继电器二\r\n");2 d# m( D, m2 m9 r- s& g
  112.                                         }break;' a) c# g0 T3 A' m, Z9 K
  113.                                         case openRelay:    9 n' j( K/ e+ \) S$ A5 g0 K
  114.                                         {                                        " P; B! J) W* {$ a0 T4 R
  115.                                                 printf("打开所有继电器\r\n");
    . R- E: C$ Q1 F. o$ k& p$ j
  116.                                         }break;
    0 ^- u; s6 J  y; m- A
  117.                                         case closeRelay:  8 b% J9 P4 x, T" X& v" t- G+ F
  118.                                         {                                                
    * D4 f$ a* c0 C7 O
  119.                                                 printf("关闭所有继电器\r\n");
    4 i7 u. R% ^! b! G5 f2 E
  120.                                         }break;        
    6 {' l" O% y* h8 {+ K2 ?9 }
  121.                                         case upVolume:   + F8 ?$ i/ ~  l' h: h/ J. K" c- K8 z
  122.                                         {                                                0 _- R: u, `. H4 E( i, H8 T
  123.                                                 printf("调高音量\r\n");
    $ z- F0 V% K2 T2 c, P/ |5 @
  124.                                         }break;        " E+ Y4 e3 }4 P; S/ G
  125.                                         case downVolume:   ]0 l  y: k8 a. ?6 W
  126.                                         {    + K# l8 {* C- A" o6 n( O
  127.                                                 printf("降低音量\r\n");- h! C: B) |; |! d+ W' i" b
  128.                                         }break;        
    " `: \7 ^( U# `* u
  129.                                         case upSpeed:0 `' A; E) d0 o/ a
  130.                                         {                                        # \& h) j$ H+ H& r1 m6 y1 ]
  131.                                                 printf("提高语速\r\n");
    ' k7 n) r# `1 A9 T
  132.                                         }break;        
    8 ]& v' |- ?: ^2 _3 U2 N
  133.                                         case downSpeed:  
    ! l/ h+ j7 e/ Q. p4 D3 q
  134.                                         {                                        $ Q* c# V6 J- |3 Z- ]: m( H0 k
  135.                                                 printf("降低语速\r\n");
    3 q5 L/ r9 l% N4 k' ]3 l
  136.                                                 
    + J/ l$ u) u/ P( c6 R, X$ [
  137.                                         }break;                                        / R4 z( A- v" k9 o, j
  138.                                 }7 _# L/ d3 |, I& D. ?4 r0 ^
  139.                                 nAsrStatus = LD_ASR_NONE;  I6 o8 o& X* t. G
  140.                                 - E# C# W2 o* G% M
  141.                         }break;
    ( b* B% J  |2 Z; a) O; r+ N) A
  142.                         case LD_ASR_FOUNDZERO:
    ( Z: Y0 n4 o* m: K5 x- L! M! O" y4 `
  143.                         default:
    ( l" x0 U9 O+ a7 h
  144.                         {- q3 t; X  I3 x" s0 Z
  145.                                 nAsrStatus = LD_ASR_NONE;
    ) {6 H% V# g" U* h8 L8 Y
  146.                                 
    8 D1 l5 n8 l/ E4 t/ u/ q
  147.                         }break;% @+ n! {* E" }! s% K7 c
  148.                 }
    + a: [3 ]# X6 Y
  149.                 delay_us(2);6 {1 }' j* @5 e
  150.                 i++;
    ! j, @. F( p3 f! z
  151.                 if(i>=60000)
    3 q+ r9 N# v8 m" _
  152.                 {$ u% W- Q# ?7 |9 _, D- V$ n
  153.                         i=0;
    $ V7 }& h: L5 k; r5 v
  154.                         turn_g_led();/ l; x8 p. q' A7 D
  155.                 }
    # T0 R: C; w; C3 ?9 [5 R! U2 P- I; v( r
  156.         }( s8 B7 a" c. ?( c/ t0 T
  157. }
    ' f% X1 e: K7 Z9 |
  158. . v2 P! w. c. ?) a+ U0 F
  159. $ P$ H" x$ _. C) }! }7 i% |
复制代码

" w+ H$ a% I0 T8 ?! d
收藏 评论0 发布时间:2022-4-24 16:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版