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

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

[复制链接]
STMCU小助手 发布时间:2022-4-24 16:00
一、原理图
" C: y8 z2 U! h- |% B- O3 d0 {; \4 m+ ^
99Ia$W`8_TY4`GM[WZB52.png 4 X0 A# [7 R& h& c  R: \, d! N
) P3 v. L: u6 ~6 ]3 P; t) K7 i
二、源代码
, `( O; B/ d; u' B
LD3320.c
5 O$ C% y: o. Q% `# n' Q2 m
* f* y( u# h, G5 T" e8 \
  1. #include "ld3320.h"# I- P& G: N! ^
  2. #include "delay.h"
    ! k6 h7 A1 [) {5 I6 g' K
  3. #include "usart.h"        
    7 Q# q4 ^/ b5 j9 V9 G+ ?
  4. #include "string.h"4 ?1 a1 U  _8 g) Q
  5. u8 ld3320Data;
    - Q% U. l. i$ N, n" E0 A+ `
  6. extern u8 nAsrStatus;
    3 a( j# ^3 h% Q/ f& H

  7. 7 z; b6 Z, o0 I7 g' d
  8. unsigned long nMp3StartPos=0;( H. Q3 X6 y: B
  9. unsigned long nMp3Size=0;% ^; B6 o& g( L$ O3 ~) n; i
  10. unsigned long nMp3Pos=0;
    , G" |# }# `8 w  A1 F, l
  11. u8 bMp3Play=0;                                                        //        用来记录播放MP3的状态* b9 @: o! I+ L4 V: v( q
  12. u8 nLD_Mode = LD_MODE_IDLE;                //        用来记录当前是在进行ASR识别还是在播放MP3
    9 J- ^) }1 f! |1 F% ?7 l9 v
  13. u8 ucRegVal;2 q, m* ]+ N2 w! d" S, k
  14. u8 ucHighInt;
    . I4 a2 Y# ?% j- ]% a, C% M* X
  15. u8 ucLowInt;
    & u* R3 d9 j' a5 z
  16. u8 ucStatus;1 ]% h$ W# l8 c: ]
  17. u8 ucSPVol=15; // MAX=15 MIN=0                //        Speaker喇叭输出的音量8 s+ p9 J% l0 Q; c

  18. 9 X( W' B% K# W* c* a' U1 h

  19. , Z& `. h: U5 F4 o) c
  20. . m$ P8 A) X9 j; a5 I
  21. void ld3320_init()
    , `5 `, E0 |6 Q9 @- c) v
  22. {
    8 X/ [6 R# P( T1 A+ p
  23.         GPIO_InitTypeDef  GPIO_InitStructure;
    # a* G2 S5 C. @' r+ L& T& p; Y
  24.          EXTI_InitTypeDef EXTI_InitStructure;
    5 }0 N% w. g/ S" s" o: d5 I6 f5 n
  25.          NVIC_InitTypeDef NVIC_InitStructure;$ A, d8 |# e3 C' J

  26. / s6 o2 i' v+ \8 @
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);         //使能PB,PE端口时钟
    $ Z* M0 d( _6 s9 W  Z2 ?7 C
  28.         
    9 E' F  K+ {/ [8 |
  29.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);) B0 E; @5 ^0 s
  30.         
    1 |0 c/ L6 W" s. G2 s
  31.         8 ?# h* D8 B( g, H9 E: S1 J5 t
  32.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;                                 
    4 w8 i5 _) [3 P6 x+ C* A* b
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  9 S9 a% m9 t8 p) @# A
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 % @" L- ^" I; A0 U
  35.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                        ! Z1 ^7 c" @# B0 r
  36.         GPIO_SetBits(GPIOA,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);
    6 [- ?5 f, d, ^) F
  37.         
    8 i  j! u4 V2 [, D2 P- [( A! S0 \
  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 ;                                 0 u% d* M$ o0 n$ C& a7 M7 t" e
  39.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  6 l& O3 r0 Y, `6 u9 Q9 w1 i
  40.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    4 [0 s2 t7 R' u' d
  41.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                       
    $ _9 E$ b) q" q' \. v( l- Z! `2 g
  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);
    # s# A/ C( P2 s, G8 q
  43.                
    5 p8 H/ N# b7 H. r, L8 G, M
  44.         9 |3 o8 G$ D6 }8 n1 Q% o; D
  45.         LD3320_MD=0;  //选择并口
    ) o6 T2 e2 K3 \! c! V: `
  46.         LD3320_RST=1;        4 e! z& q& K" i  J
  47.         LD3320_A0=0;
    7 C! l4 r1 c' T5 q" M
  48.         7 R; @2 f/ L3 T& P
  49.         . ]# T1 c$ x) \) O7 e% U" {/ W
  50.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11;                                 
    9 K* Q8 M+ F6 L. D) s4 f' c0 L; B* W4 u
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  7 ^* i+ Y! t1 H2 G( _
  52.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    $ d1 w  ~0 t6 n
  53.         GPIO_Init(GPIOB, &GPIO_InitStructure);                , p/ _% F" G" ]7 k

  54. ' K0 R  [. y8 }3 Q
  55.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
    - D, T" o7 M4 c; _5 }) G2 L
  56. 2 s9 T$ c5 s# G% j1 L' G; ~( J, M
  57.     // 中断线以及中断初始化配置   下降沿触发/ z+ G2 N% L3 [$ Q9 w9 L% y# W
  58.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);  Z& w, x( v+ v2 b7 W* k! y

  59. 3 U5 I8 Z1 s& u. m( H
  60.           EXTI_InitStructure.EXTI_Line=EXTI_Line11;        5 ~- |8 ]2 j0 D- G; y
  61.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
    ) A/ a  `% v, D$ q8 x- j/ h
  62.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;7 B8 p# z: j8 q1 a" R/ g  F' H' }
  63.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    / Y3 s6 r! j$ _
  64.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器9 x4 v' c5 j1 m$ w9 f9 Q, g
  65.         
    : J4 E7 E' Y' g% Z7 b, U
  66.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能外部中断通道
    # w" Q# q6 w8 \+ W7 m$ s
  67.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级0
    9 c- S7 C+ Z1 A# m) i2 S
  68.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级0 1 L8 D# ~2 H: }# a. n
  69.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道: p2 E/ j% S% n' u% N/ L/ }; @" U
  70.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器        
    9 P  j4 |; f3 F& ^% q& `4 n

  71. ( Z7 b8 C# v1 c, w* F8 c" `: T: l
  72. }
    - W( ~9 X' Z: ~% k
  73. ; ?0 T4 j) R& f# Y
  74. //外部中断服务程序- u3 ]8 G9 j/ i' f6 y! i/ S+ a/ `& ~
  75. void EXTI15_10_IRQHandler(void)
    2 n) W3 _2 I( S; V
  76. {! d% C# M# G# v( ~) Q6 _
  77.         if(EXTI_GetITStatus(EXTI_Line11)!= RESET )
    , i" h% Q. Y# Z7 @  q2 d( N; }
  78.         {% V9 X9 ~& k( _7 ~3 l5 m/ c$ q
  79.                 ld3320_process_init();               
    , k% T! x, V( i# M
  80.                 EXTI_ClearFlag(EXTI_Line11);+ D3 B2 K1 A1 e; a. x7 i
  81.                 EXTI_ClearITPendingBit(EXTI_Line11);//清除LINE上的中断标志位  
    1 h, ]% D  C# H- Z$ q
  82.         }         
    . O7 X0 Y1 Y1 }' L6 J" o9 y$ c7 ~
  83. }
    7 ^+ v! h4 Q2 t/ j# Y7 U
  84. * @& \% N0 f8 z" e# ~; I4 u$ l1 m

  85. / Q3 E. W2 v7 ]$ V) f  ?4 V+ V
  86. void ld3320_write_reg( unsigned char address, unsigned char dataout )* D, v* r) m, I! v! G3 _
  87. {$ L# c, c% i/ o# X, h- L0 w5 C0 K
  88.         
    & g2 E1 m) W8 |* n% N
  89.         ld3320Data=address;
    ' H' c8 N1 X6 f/ V5 B! g- }
  90.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;) ?$ P, R, i  C6 v+ u& M: X  F
  91.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
    - M! O" d* z. i3 S' w& a1 z
  92.         delay_us(1);
    2 S0 ]" d5 k9 k( e; V
  93.         LD3320_A0  =1;( N- n. K, D1 E4 `2 c
  94.         LD3320_CS = 0;5 P4 Y* o( V4 i
  95.         LD3320_WR = 0;* ]7 X9 u$ f, N. M) i
  96. 8 ]( U; J9 j  z% ?9 i
  97.         LD3320_WR = 1;. y  L  p! f9 f& O
  98.         LD3320_CS = 1;
    0 q4 n9 G0 E$ x; `! k
  99.         $ J% Y( l( e. _# X0 E; _0 F

  100. & N4 d9 b5 m# ^: k
  101.         ( ?8 R7 e$ \6 [6 y; u- b
  102.         ld3320Data=dataout;
    + Q! y1 R9 r, O) o, r$ j/ U
  103.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;
    5 ?4 S, a9 E/ U
  104.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;7 K  h+ ~0 ~2 v& a8 W
  105.         delay_us(1);8 x5 G3 }; }& s& k, L: [
  106.         LD3320_A0 = 0;- Z6 Q3 Z6 z$ m0 @
  107.         LD3320_CS = 0;+ x: c. d+ J7 w& Q  W* X4 a
  108.         LD3320_WR = 0;
    6 ~: L9 L9 A1 l, {! M

  109. " X, R4 U( L3 M  `
  110.         LD3320_WR = 1;& \# [" Z# I2 G2 X
  111.         LD3320_CS = 1;
    , Q0 H1 @- }0 Q3 q# X" w
  112. }
    & \; B2 k7 h0 z4 W

  113. 3 x6 V( v: p  |4 ~7 j3 Y" @
  114. unsigned char ld3320_read_reg( unsigned char address )
    " q8 ]6 {& A, B( i9 O8 {0 j2 [
  115. {9 Z& x2 \( v. @+ [
  116.         unsigned char datain;0 l, @. F0 B. Y7 y2 |# I

  117. 9 Q) L5 J3 [1 d0 z* {1 f
  118.         ld3320Data=address;5 I+ T' M5 H8 I; R! ^( w
  119.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;. u& t1 _! {) _  \4 d
  120.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
    ) t7 ?; f0 o! {0 E$ K% Y; Z
  121.         
    $ R; C% H1 ~8 p1 e
  122.         LD3320_A0 = 1;
    & V( Z. `0 O4 S2 y; ]% A: U3 T
  123.         delay_us(1);+ l# u4 r' t- T
  124.         LD3320_CS = 0;6 t% ^) Y! O+ G. n( ]2 K) s7 P
  125.         delay_us(1);( |5 z! ~0 \" r. j8 u( J' [
  126.         LD3320_WR = 0;1 U1 m! v- k# h+ t" A: o. i) h& f
  127.         delay_us(1);( X( }6 J# G2 X) E# N) d: }# u* \
  128. & ]7 v! l! f& Q; L$ ~: }' ?
  129.         LD3320_WR = 1;% ]8 T4 f+ D  U  w
  130.         delay_us(1);" \0 A( ?1 z* }4 R  c( b7 ~; g3 w
  131.         LD3320_CS = 1;
    7 }3 V7 \1 u, C/ S7 A! a
  132.         delay_us(1);
    6 E+ b3 r: x' x* i& k

  133. + C7 o9 P5 e4 t0 _) ]
  134.         LD3320_A0 = 0;
    ; s* Z. l$ n8 F" j0 K" p/ E
  135.         delay_us(1);( j7 m' |; H7 f2 {" K
  136.         LD3320_CS = 0;, g0 V4 S/ K0 I* b  V, g
  137.         delay_us(1);+ v- D  W5 T# ^5 O* Y, w
  138.         LD3320_RD = 0;) d; M! ~) z, m' s0 j
  139.         LD3320_DATA_IN();; g- d) q/ G2 a8 U7 l
  140.         delay_us(1);
    9 h# d& g$ ^: |' v8 `& @% x
  141.         
    ! @+ h9 P: s6 i# [) O$ Z
  142.         bita0=LD3320_D0_R;bita1=LD3320_D1_R;bita2=LD3320_D2_R;bita3=LD3320_D3_R;- ]1 P; E  s. s6 r- ]3 o# @& l5 a" ]- A
  143.         bita4=LD3320_D4_R;bita5=LD3320_D5_R; bita6=LD3320_D6_R;bita7=LD3320_D7_R;1 z) v3 T( ^" c- I$ [) _5 I1 w0 a
  144.         datain= ld3320Data;% P7 g/ R, b8 \0 d4 i3 O. C2 G
  145.         0 ]$ ^- r! y# ^: w
  146.         LD3320_DATA_OUT();
    ; P+ o6 P  M( a9 g( I
  147.         LD3320_RD = 1;/ B1 d9 ~5 K  J: q& n7 V
  148.         delay_us(1);
    1 N, j# g7 [* S( r! u
  149.         LD3320_CS = 1;
    + ^6 Z2 {, l9 E3 E; Q

  150. / \# |$ J0 f/ t0 I+ l
  151.         return datain;- u* i3 y( g. E' l' T, y  G
  152. }
    , N  O$ l& f: |7 I

  153. $ \2 L+ h' r# k$ z% X

  154. * U' J! N  _( a1 j# B8 a
  155. void ld3320_reset()# i' U# I. ]  x% R7 f! I7 o7 q
  156. {) g+ f* L" X3 Y
  157.         LD3320_RST=1;
    9 U6 a" Q8 y" h
  158.         delay_ms(1);
    8 l4 \) x* P1 g% B& a9 P5 z: c" c% _* R
  159.         LD3320_RST=0;
    + L" t) g- [. H: r) i& s
  160.         delay_ms(1);
    ! G3 a8 J! g! ?3 G* ]
  161.         LD3320_RST=1;
      j$ q1 z0 m3 `

  162. 7 {; N. N+ R' O8 O* O
  163.         delay_ms(1);
    # ~% `$ K8 W% ]6 L
  164.         LD3320_CS=0;* B8 ?) N) y4 M& A7 O) p
  165.         delay_ms(1);3 _2 x% t% i* Q. {
  166.         LD3320_CS=1;
      s2 @. S5 L7 ^2 K( n0 U
  167.         delay_ms(1);
    : P; Y0 u: R3 l% Y9 U
  168. }
    8 A4 W7 F) d/ b7 g- u
  169. u8 ld3320_check()( }+ T+ q7 \1 G; ~. }
  170. {/ M; `& @8 D( R
  171.         u8 a[3];
    5 P7 W& V0 l! K% h7 o5 W7 K
  172.         memset(a,0x00,sizeof(a));+ P) u5 i! T; W* ]
  173.         ld3320_reset();
    ' d2 \% f5 Q% ~/ K
  174.         delay_ms(1);
    ! h' D" I$ O9 g" N/ t" c8 ~
  175.         ld3320_read_reg(0x06);    {6 R, J7 t9 `0 Q8 y2 p
  176.         delay_ms(1);
    $ t4 I2 T0 \5 }  m$ q
  177.         ld3320_write_reg(0x35, 0x33);  
    ! F) ]6 \& P3 m4 u: |
  178.         delay_ms(1);* @* t/ v* j" Q3 F: @1 w( q  G
  179.         ld3320_write_reg(0x1b, 0x55);   
    7 _# f; l# N9 _0 ~# k9 E# ^' D1 S
  180.         delay_ms(1);' D5 z: K& K5 q% i
  181.         ld3320_write_reg(0xb3, 0xaa);        ( R' D- F) x2 z- }: P
  182.         
    % x# f7 f& D3 ^, v+ G% J( K  S6 @
  183.         a[0]=ld3320_read_reg(0x35);# z+ a8 C  _) p8 t( y
  184.         delay_ms(5);8 b$ [. e- l6 m0 b
  185.                 ) |. B+ j3 J0 v
  186.         a[1]=ld3320_read_reg(0x1b);
    * H; D; k, z6 J( N: ?4 v  K* I/ W
  187.         delay_ms(5);. o0 k$ N4 w" V9 P" @; T' i+ [3 C
  188.         a[2]=ld3320_read_reg(0xb3);
    * C, B9 Q! P$ T6 N; @  ^1 P" j
  189. " \& w: w. |: {9 I
  190.         if(a[0]!=0x33||a[1]!=0x55||a[2]!=0xaa)0 b. _5 g, L2 K, M/ ^! E
  191.                 return 1;
      d2 K, K6 g# X6 x! Y$ E
  192.         return 0;6 d" H6 @0 Q& a# r9 _
  193.         " q! G- K4 ^, ]2 B" h
  194. }
    5 M) Y0 c# L- ?. w$ B

  195. ! S6 K# i1 N& @7 `4 A$ M5 H! J
  196. % J4 H" B7 Z/ B8 ?* z! l  L; v
  197. " ?  d* K: n5 Q8 G
  198. void ld3320_init_common()% D% H9 X# u* c2 T
  199. {
    4 e+ `6 L' @; U* T% N: J* g
  200.         bMp3Play = 0;
    ( ]4 R' E  j, F) g( K
  201. 3 e2 ~# g# [! z; m1 B7 ]
  202.         ld3320_read_reg(0x06);  4 ]3 \3 D6 L2 p
  203.         ld3320_write_reg(0x17, 0x35); ! @* T: ]5 O: \  T( K
  204.         delay_ms(10);
    " W& W) e+ D2 F" ^3 J% k- q
  205.         ld3320_read_reg(0x06);  # g' [# m& i+ e+ k

  206. " m+ A% R5 a- I2 t4 n0 x
  207.         ld3320_write_reg(0x89, 0x03);  
    ' @$ V$ ]  C" `: C4 l0 F1 l" N$ t
  208.         delay_ms(5);
    # |2 c$ K; Y3 Y+ z" c  }
  209.         ld3320_write_reg(0xCF, 0x43);   
    3 S  G/ ?  @  x% Z2 Z1 p
  210.         delay_ms(5);$ D# d/ `; N5 w2 `! e% g6 u
  211.         ld3320_write_reg(0xCB, 0x02);
    % C6 B' s$ v% Q0 e& G6 }
  212.         4 v0 Q8 \' D: [& a3 @
  213.         /*PLL setting*/0 l% \* U" M9 o2 U: J6 U6 M
  214.         ld3320_write_reg(0x11, LD_PLL_11);       * L, j, d+ ]8 C: L# Q
  215.         if (nLD_Mode == LD_MODE_MP3); a8 _4 P8 F6 a! {8 M# H1 F+ T
  216.         {. m: W: r7 D! i5 U1 a
  217.                 ld3320_write_reg(0x1E, 0x00); 3 }$ P2 E8 m$ ^& v8 N* Y- |7 _
  218.                 ld3320_write_reg(0x19, LD_PLL_MP3_19);   / w& T; s( Z  s2 ?  l4 H
  219.                 ld3320_write_reg(0x1B, LD_PLL_MP3_1B);   ) I- L% \' ^0 v: ]; G, d' Z- o
  220.                 ld3320_write_reg(0x1D, LD_PLL_MP3_1D);
    + d1 ?' i* f9 }9 j
  221.         }
      u6 N' q% S4 B
  222.         else
    ) o) N3 ^4 V# C# |! k; ?. `: z) A
  223.         {4 ?8 i+ m0 O8 z+ x$ B
  224.                 ld3320_write_reg(0x1E,0x00);2 E( Z5 H: Q9 ?. k
  225.                 ld3320_write_reg(0x19, LD_PLL_ASR_19);
    7 D9 S9 t) Z6 S8 t3 n
  226.                 ld3320_write_reg(0x1B, LD_PLL_ASR_1B);                : A% e7 ?* \( O) R. p8 ~+ q
  227.             ld3320_write_reg(0x1D, LD_PLL_ASR_1D);" \( Q. P3 s  a
  228.         }
    - z8 ~  r& u: Y
  229.         delay_ms(10);
    " V4 i. u, h" }* M/ P" w
  230.         7 p  i. ^; I/ m2 D* t) |. Y$ n
  231.         ld3320_write_reg(0xCD, 0x04);
    % j5 i9 k+ ?) O4 l1 `
  232.         ld3320_write_reg(0x17, 0x4c); + R( K/ L) H% s* @% F8 ^% }  ~; i# q) |. ~
  233.         delay_ms(5);
    - f7 Q4 P6 w+ Z' @7 r
  234.         ld3320_write_reg(0xB9, 0x00);
    & X' X1 I( E/ w( \. c; m
  235.         ld3320_write_reg(0xCF, 0x4F);
    ) r! |* `7 [+ I  j  J6 ~* i- Y
  236.         ld3320_write_reg(0x6F, 0xFF);   f6 D( l6 B$ p# s7 N+ [
  237. }( q2 B5 J% {" E, b
  238. : g: f$ j* e0 l' m, Z& Y# l
  239. void ld3320_init_mp3()6 q2 N. w" V9 n# [" I
  240. {
    ) Q# w9 Z6 B3 s, q7 ?' |/ v
  241.         nLD_Mode = LD_MODE_MP3;
    ! s: L4 J& N" M  B. J( m
  242.         ld3320_init_common();
    % r/ W. P# e: w' A
  243. 1 j1 ?* e) E0 m. \6 T5 c" z. k
  244.         ld3320_write_reg(0xBD,0x02);
    ! G$ t/ }* A5 k
  245.         ld3320_write_reg(0x17, 0x48);
    ; J4 a* h' C) K+ k$ \! x/ Y3 L
  246.         delay_ms(10);, x' o! E+ {; m+ l$ S2 E( [
  247.   I. m4 `2 v; t& n5 B
  248.         ld3320_write_reg(0x85, 0x52);
      h, ~2 A. ?  f- d8 e! j
  249.         ld3320_write_reg(0x8F, 0x00);  : j( k0 b1 y* U8 y' s4 D* s, B
  250.         ld3320_write_reg(0x81, 0x00);
    : z- V" a9 Q0 ^) ]/ M# E
  251.         ld3320_write_reg(0x83, 0x00);3 |2 T+ `3 t$ k4 O) u
  252.         ld3320_write_reg(0x8E, 0xff);+ x7 [7 ]% \0 N' g% o5 v+ P
  253.         ld3320_write_reg(0x8D, 0xff);
    $ T" _* _9 C7 f: `' G3 _
  254.     delay_ms(1);5 f4 v. ]0 \: c" E+ H5 {
  255.         ld3320_write_reg(0x87, 0xff);3 l* n" N; A4 z8 R- m' u
  256.         ld3320_write_reg(0x89, 0xff);
    / x! J6 G9 b, H+ n+ M  T" N
  257.         delay_ms(1);5 j3 k. L) i. z# e
  258.         ld3320_write_reg(0x22, 0x00);   
    5 I2 e' L7 M9 w7 ?+ b1 P
  259.         ld3320_write_reg(0x23, 0x00);
    1 e8 N" L; {; O  Z# ?: T5 I( V( I
  260.         ld3320_write_reg(0x20, 0xef);    ' v1 g3 l3 p6 g: n
  261.         ld3320_write_reg(0x21, 0x07);
    ) G0 s- N& ~  ~( i& o: v; }: L
  262.         ld3320_write_reg(0x24, 0x77);          6 ]6 G3 ^' F! G
  263.     ld3320_write_reg(0x25, 0x03);
    * u4 e( T0 {" d* e" _5 u/ C
  264.     ld3320_write_reg(0x26, 0xbb);    " u" m* v) q" ~9 {, S( `
  265.     ld3320_write_reg(0x27, 0x01);
    . C, T. \% e* Q& {5 w
  266. }
    / v% M" p0 V) T( J

  267. # x7 `/ X6 ]% n' e  Z! p5 O

  268. 6 N; {+ I/ e# K

  269. , m# @9 _6 R2 B
  270. void ld3320_init_asr()
    7 C- S9 E4 P7 v# h/ J0 B6 Y
  271. {
    / H' R2 Q. P/ O7 I6 T9 l; }
  272.         nLD_Mode=LD_MODE_ASR_RUN;: ]4 \# ^* }" o1 n% t* Y3 e
  273.         ld3320_init_common();
    ! U# K" a& A& a5 d* k4 t4 ?5 b

  274. 8 M( z  u: F3 _* _' _
  275.         ld3320_write_reg(0xBD, 0x00);( C9 e2 X6 @4 e- b% p, l) `0 P: I
  276.         ld3320_write_reg(0x17, 0x48);6 c# c9 {8 i, v6 f1 u
  277.         delay_ms(10);
    % H" D4 e9 r& w8 v
  278. 1 Q9 B/ T* n- F, @% S5 M! z7 y' p
  279.         ld3320_write_reg(0x3C, 0x80);    4 ?. n- v( A' k% J% Z! q
  280.         ld3320_write_reg(0x3E, 0x07);0 P3 J1 O- _4 [6 W, B, @, P2 H
  281.         ld3320_write_reg(0x38, 0xff);    / {" _; h( ^2 W8 K  e# A2 v
  282.         ld3320_write_reg(0x3A, 0x07);0 r+ i- J) u  m% X1 h# G
  283.         
    $ \  g* c0 x. i9 b: {! Q+ s
  284.         ld3320_write_reg(0x40, 0);          / _+ r& d" T/ ]' w. R  H( i
  285.         ld3320_write_reg(0x42, 8);# [* }2 t) F+ n6 G" s2 U$ Y; t. p
  286.         ld3320_write_reg(0x44, 0);    , p  H, i7 h; j4 I$ |  c
  287.         ld3320_write_reg(0x46, 8); ' C: \$ C& \/ L! L/ e5 _
  288.         delay_ms(10);2 J2 f( m! i$ G" H8 G1 I5 d
  289. }/ {% c) s, B# F; y- u% B* L0 |0 b

  290. 4 I  E% n& E: ?( p
  291. void ld3320_reload_mp3data(). e0 P8 d! Q; S3 I$ R
  292. {, m1 }, Q9 {: x4 p% A7 {
  293.         unsigned long nCurMp3Pos;7 h5 A/ V+ u& V: I' i8 F6 J
  294.         u8 val;
    / t! M' h- Q7 v1 a
  295.         u8 k;
    6 w, x# S5 b1 n' z/ O
  296. 4 x4 }" W! F4 Q; ^! H8 b0 ?) D  F
  297.         nCurMp3Pos = nMp3StartPos + nMp3Pos;% W5 A; K4 C7 y3 Y9 o' K

  298. 1 E$ F- E4 q5 @( W$ ?5 @
  299.         ucStatus = ld3320_read_reg(0x06);
    & i- c4 v  k3 w
  300.         while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )- R1 L9 g/ |2 k+ X  b0 e
  301.         {
    ; u$ F+ q7 f! J
  302.                 val=0;1 C1 I0 P+ Q' x& b1 w) R: z0 A
  303.                 for(k=0;k<8;k++). {4 \" J2 n6 a8 o, F3 m5 K! ]
  304.                 {
    ; @( e, n, E. u8 |7 L4 p
  305.                 }% ]& X4 {* N8 b7 \# z  L- h. A
  306.                 ld3320_write_reg(0x01,val);
    & w( |. {1 e8 I" [/ g
  307. ' O: }3 \: ?6 N2 I, w- y
  308.                 nMp3Pos++;
    - b& S* f2 h/ I' K! l0 ?4 q$ M
  309. 2 c1 w+ D- T7 G; S
  310.                 ucStatus = ld3320_read_reg(0x06);
    3 }9 u# w! s/ ~0 d
  311.         }* C! C$ R3 r1 }6 L/ F/ r7 H
  312. }
    , ~5 g4 N! o2 Z$ u' }. I0 s& e9 e

  313. 7 s, m* e4 q( ~) p
  314. ! ]; c' q& U/ S  F
  315. void ld3320_reload_mp3data_2()
    * g1 U7 n5 ^2 a. K& e
  316. {
    : x3 A& e% e  B1 R
  317.         unsigned long nCurMp3Pos;
    0 T6 ?/ U. V  o, r  p$ R
  318.         u8 val;
      P# i: m: }0 |! \! G( I/ }
  319.         u8 k;
    ; M$ Y/ b, E3 J# T, O

  320. 5 H3 i: ^( j' c
  321.         nCurMp3Pos = nMp3StartPos + nMp3Pos;
    0 u7 D, M' J0 P0 A& t, w. |+ c5 y- z

  322. + I" x* b  {* n" h

  323. & @1 F* [" N- V
  324.         //读取音乐文件写入
    ! E/ |$ T3 W* k+ h& d" o: p0 l% c
  325.         7 p/ U5 {4 E* P: e# u4 t
  326.         
    ; P3 @( m% d0 u5 `
  327. 1 t9 g  ]- D7 Y0 W! M) S. c
  328.         ucStatus = ld3320_read_reg(0x06);% d! |) _9 X2 K4 x, e. ^( Y  b0 ]. E
  329.         while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )! y- \0 w5 K& r9 R
  330.         {8 N7 e: J  A4 Q
  331.                 val=0;% w+ x4 i. E8 A0 t0 [( _- v: @

  332. 9 m1 b+ e2 T/ u4 z
  333. ' O4 N% G4 D! T' J6 N
  334.                 nMp3Pos++;
    1 O( O. `. {0 q, N* E$ u

  335. ; V  d* ]5 V# d8 n7 v2 S
  336.                 ucStatus = ld3320_read_reg(0x06);
    . [( n( e* L, C3 M+ w
  337.         }. t9 A" o3 V- e& q; S: n& `
  338. }! G( i5 @5 R! X! s# I2 e

  339. : b! S6 F* _- E$ G* L; S) W2 K
  340. 3 H! P: ~: C2 A5 }- O- _" {

  341. ) e  _2 ~1 `& B. R( X
  342. ' L% b. J0 j- D
  343. void ld3320_process_init()
    & x* q6 P6 ?: R6 t6 ?
  344. {; }! @, V. P2 o  q1 B( [
  345.         u8 nAsrResCount=0;
    8 m8 I6 q/ F. X3 A
  346.         " T$ s8 z. B/ g7 _1 s
  347.         ucRegVal = ld3320_read_reg(0x2B);, Y1 f6 @9 ^5 `* h1 _
  348.         if(nLD_Mode == LD_MODE_ASR_RUN)
    4 R  M$ }4 r/ @& Q. U5 l
  349.         {
    / o# R4 a+ ~" }' k3 d3 m, I
  350.                 // 语音识别产生的中断+ g; U1 l! I/ l0 z6 y2 A5 Z
  351.                 // (有声音输入,不论识别成功或失败都有中断)$ Z& H5 c9 h; M1 u2 N2 J
  352.                 ld3320_write_reg(0x29,0) ;4 Z3 u. h0 q- t7 R
  353.                 ld3320_write_reg(0x02,0) ;
    ) R& d& L' ]. l# X
  354.                 if((ucRegVal & 0x10) &&. L, m: O6 g7 u: ^
  355.                         ld3320_read_reg(0xb2)==0x21 && 9 K; I0 N& [1 O& p7 R7 C
  356.                         ld3320_read_reg(0xbf)==0x35)
    6 }, `) A  c) x; A3 y
  357.                 {; V- `0 _, l3 n- E4 k: N
  358.                         nAsrResCount = ld3320_read_reg(0xba);
    9 j3 h4 p0 c5 O! }
  359.                         if(nAsrResCount>0 && nAsrResCount<=4)
    " ^+ M4 d7 T' h" ]- R1 n
  360.                         {3 b: k, ]9 S' t8 z' i
  361.                                 nAsrStatus=LD_ASR_FOUNDOK;/ m, ]8 ?+ ^) d7 |# G9 A+ [
  362.                         }0 Q1 O1 m9 w  z1 D
  363.                         else
    6 l+ }$ m) s3 e, k% N/ y/ q7 }* Z
  364.                     {
    7 ]( o, J! N* R/ g9 y2 X& O
  365.                                 nAsrStatus=LD_ASR_FOUNDZERO;
    & t% [' c2 B! @! Y( P  i: f' j- i
  366.                         }        
    4 ~0 R7 J- ^$ G
  367.                 }+ ~; d8 y: S( U4 y0 B
  368.                 else& f$ j+ n: f3 m/ ]( G9 W+ K
  369.                 {
    3 q6 C4 ^+ J/ p; N& ?
  370.                         nAsrStatus=LD_ASR_FOUNDZERO;" V( \7 S) P: k8 U( v4 Q6 w' C
  371.                 }& ^% w: w( f# k3 \, o. Q
  372.                         
      S' O5 U% H6 V; O0 K+ K
  373.                 ld3320_write_reg(0x2b, 0);% z" v% R! f# b
  374.             ld3320_write_reg(0x1C,0);
    ) n7 W4 |8 i0 i7 T/ u8 ]
  375.                 return;
    + P4 O8 U6 j$ n4 ?* N  Q
  376.         }& Q4 ]5 _- Y1 A9 e4 g
  377.         8 z' k* @4 K8 l3 `7 U8 I1 P* F- }0 j
  378.         // 声音播放产生的中断,有三种:; Q0 e: H' {# b) P0 V, s* `
  379.         // A. 声音数据已全部播放完。
    - x5 F5 {& V# u) K) o
  380.         // B. 声音数据已发送完毕。' H9 |& K2 z/ f5 p* [# r+ x9 s
  381.         // C. 声音数据暂时将要用完,需要放入新的数据。        ; }' q% V: r* A' G% [& @' G( n
  382.         ucHighInt = ld3320_read_reg(0x29); 1 y; C6 Q; r* j4 b9 K) T9 v
  383.         ucLowInt=ld3320_read_reg(0x02);
    7 h) N. }8 f# A0 m0 Y* `
  384.         ld3320_write_reg(0x29,0) ;$ H0 T) {1 A& V- d
  385.         ld3320_write_reg(0x02,0) ;
    ! ]. D% Y+ I  N( N/ U
  386.     if(ld3320_read_reg(0xBA)&CAUSE_MP3_SONG_END)
    ; Z* j4 F& o. h
  387.     {5 N2 g+ o: W6 i
  388.         // A. 声音数据已全部播放完。
    4 {# d5 _0 }7 R7 O

  389. . P( {( B+ k5 ^0 b% g3 D
  390.                 ld3320_write_reg(0x2B,  0);
    / Q# v" b& @( K  [! ^$ A
  391.               ld3320_write_reg(0xBA, 0);        
    4 i& q% m7 J4 ^9 t2 Q% _1 H" s
  392.                 ld3320_write_reg(0xBC,0x0);        
    , R) g* E/ S$ _' a( R4 Y, v
  393.                 bMp3Play=0;                                        // 声音数据全部播放完后,修改bMp3Play的变量% [! v' w4 V' e$ z/ X
  394.                 ld3320_write_reg(0x08,1);1 s5 J& c4 g& O6 g+ t2 m" n
  395.                 delay_ms(5);& Q* e4 s8 o: T5 K
  396.               ld3320_write_reg(0x08,0);
    ( b& e0 ~1 A' F0 x5 Y1 l4 H
  397.                 ld3320_write_reg(0x33, 0);8 k6 Y' P  `' m
  398. ! O5 m, m6 I; ]
  399.                 return ;! p; }/ i2 D! i
  400.      }" p' H% N: W5 n+ N$ P
  401. 7 u; m: G3 l/ }! d: L* j
  402.          if(nMp3Pos>=nMp3Size)( [3 g  O# k2 X( I
  403.         {4 w- ~  `5 v8 A# O1 X" H# K
  404.         // B. 声音数据已发送完毕。- d! _' ~6 C" _0 g* b
  405. 3 D7 r% P) c7 N# |4 E4 u! ~
  406.                 ld3320_write_reg(0xBC, 0x01);
    7 s" l+ K( C" }! a* |1 y& [
  407.                 ld3320_write_reg(0x29, 0x10);
    - q0 h% t! w4 `) G( u
  408. //                bMp3Play=0;                                //        此时,只是主控MCU把所有MP3数据发送到LD3320芯片内,但是还没有把送入的数据全部播放完毕$ `) P9 i: B$ ]; l% \
  409.                 return;        
    . x4 [. r8 m0 b2 u7 `3 _% p& W
  410.         }
    , O  a% `8 l% q! M

  411. 4 M% \" ^% Y+ C2 L3 Y, W4 G
  412.         // C. 声音数据暂时将要用完,需要放入新的数据。        # S  O& T9 k# i$ t% H2 a7 n- S8 x

  413. 1 ]$ b& G0 W& @* a
  414.         ld3320_reload_mp3data_2();
    , Y, o' g* r( t( W0 t
  415.                
    / g3 `+ V8 _, p# L
  416.         ld3320_write_reg(0x29,ucHighInt);
    0 f6 o& t. Q4 Y$ m, z$ m
  417.         ld3320_write_reg(0x02,ucLowInt) ;
    0 x# w# X( g+ x# {; P
  418. }
    ( E$ g' ]7 S% ?& E
  419. void ld3320_play(): e2 u) j' F: ^3 k' X
  420. {- n- o6 q. u" |8 z' F3 _0 k
  421.         nMp3Pos=0;+ f( C# i. Z/ ~, ]2 r
  422.         bMp3Play=1;
    - Y+ `# D8 _9 j/ s& y0 L
  423. & `5 M6 e# M: M( D! ?) ~
  424.         if (nMp3Pos >=  nMp3Size)
    $ [8 l! R" }! Z4 F# r; \
  425.                 return ; ) U$ r2 S8 E$ }  ^: U
  426. # E' y4 z8 J0 {
  427.         ld3320_reload_mp3data();
    6 J' q0 S; v+ k1 W! {

  428. # I3 Z2 Z5 F$ y$ j/ L. s
  429.     ld3320_write_reg(0xBA, 0x00);
    6 k4 m$ N: x% f
  430.         ld3320_write_reg(0x17, 0x48);0 {' B* Y5 Q& `: E6 j
  431.         ld3320_write_reg(0x33, 0x01);
    8 @( F* a) d/ d7 \* _
  432.         ld3320_write_reg(0x29, 0x04);
    , O2 W: @4 ]* O9 r
  433.         $ t* @% P5 x% W2 e
  434.         ld3320_write_reg(0x02, 0x01);
    8 y3 o  Z) b: Y3 ^/ Y
  435.         ld3320_write_reg(0x85, 0x5A);# q: K" L' c- w; V
  436. }
    ' G+ o4 t+ d: K% n5 N" u2 p& A

  437. . s; d1 C9 L* _4 }+ _% l- y$ ?  z/ _
  438. void ld3320_adjust_volume(u8 val)$ z: R1 A8 N, N6 L1 l3 f
  439. {( F' S+ }- Y5 P% U& A
  440.         ucSPVol = val;- x9 t9 k  |  g& J* R+ g% A
  441.         val = ((15-val)&0x0f) << 2;
    3 P  j' }6 {! c! @6 L  q+ c
  442.         ld3320_write_reg(0x8E, val | 0xc3); 0 g, ?+ m  Z" \" X
  443.         ld3320_write_reg(0x87, 0x78); * y1 P* |0 J5 x/ |4 O
  444. }0 _. V* h/ e- `! }5 O& Y$ ?! R
  445. // Return 1: success.
    9 d: T5 c% Z! |. d: S* x
  446. u8 ld3320_check_asrbusyflag_b2()* M1 \8 v2 Z5 Q. A9 R0 e
  447. {& I- S0 `& I6 K5 {4 F5 E+ c
  448.         u8 j;
    1 C# W4 b; S# ?
  449.         u8 flag = 0;8 [& V$ {; P- T4 [
  450.         for (j=0; j<10; j++)( a- M( G& O1 c! ^$ W+ \2 l
  451.         {
    9 t1 ]3 J  e0 g1 G  b; D
  452.                 if (ld3320_read_reg(0xb2) == 0x21)% A4 v% N1 a8 p4 E! L6 q6 C
  453.                 {
    3 S; G& q  u  c- U9 d+ \( z
  454.                         flag = 1;
    # O0 A4 s! w" c  d& @( u1 c
  455.                         break;
    / d- D, u( p* H: H4 q) j+ X
  456.                 }
    2 ~/ W$ K. J: E/ v+ _
  457.                 delay_ms(10);                8 i3 j# _- E/ z/ s1 n
  458.         }3 u9 |/ W. ?8 _, b7 I$ x
  459.         return flag;9 |. x7 r$ [3 y: d+ B! S
  460. }
    + ?$ w% w+ r( h5 J6 U

  461. 2 L5 A, c) q1 k0 h1 O5 d
  462. void LD_AsrStart()
    3 q8 ]& F  q$ {2 T
  463. {( _) Z  c- T# B% g0 V: k
  464.         ld3320_init_asr();
    * D. C, t" l0 R3 C; E: `
  465. }) O& K4 @: q6 K2 N

  466. 6 ?9 M- Y  b& e% J
  467. // Return 1: success.
    7 n$ o( F. \6 K* b' M/ h' q
  468. u8 ld3320_asrun()& _; q& x8 m- n" }! N9 H* D
  469. {
    4 g( J2 T' a# o6 g9 a
  470.         ld3320_write_reg(0x35, MIC_VOL);
    ! [+ [2 H& {. k. `- ?+ L
  471.         ld3320_write_reg(0x1C, 0x09);6 K/ q7 N; M7 _7 p/ B
  472.         ld3320_write_reg(0xBD, 0x20);4 o: s; }+ `' a( M5 ^# G) R# x1 ~
  473.         ld3320_write_reg(0x08, 0x01);
    2 s7 y/ S# w  ]
  474.         delay_ms( 1 );
    + e) B0 S# Y- z1 G% i# o
  475.         ld3320_write_reg(0x08, 0x00);
    + d3 k3 h, ?+ B5 J9 R  w# b
  476.         delay_ms( 1 );+ A* f' n6 y& N& L; V  T# r  {

  477. ( |  X) c2 X6 K9 j) q: j; O
  478.         if(ld3320_check_asrbusyflag_b2() == 0)& x3 |$ w  Z( D0 u
  479.         {( R8 S; k9 Y, p/ p9 t
  480.                 return 0;9 h1 a$ I/ A6 L( k
  481.         }( u, n$ ~) z: h  C3 w

  482. 4 R, f# F. Y' \' G
  483.         ld3320_write_reg(0xB2, 0xff);        
    9 p8 o1 h" J6 J$ f2 B
  484.         ld3320_write_reg(0x37, 0x06);$ K3 v2 L. z: F/ a9 G
  485.         delay_ms( 10 );& X; u4 }. ^6 o- R# a# G0 G' X9 D8 {7 S
  486.         ld3320_write_reg(0x1C, 0x0b);0 z" o) t5 b, a; s& _" T  F4 k
  487.         ld3320_write_reg(0x29, 0x10);
    * H. @& r1 [8 C) J* M  H; L
  488.         4 f7 q7 y8 s/ c$ y+ s
  489.         ld3320_write_reg(0xBD, 0x00);
    - F8 D3 B$ C, g+ \( _/ J9 ?
  490.         return 1;
    4 }0 y% H6 G4 ~3 w! n/ {' r! {: \- `
  491. }" x5 l* z' E- \  K
  492. : h% [8 ?( e, D. }
  493. // Return 1: success.; h, M9 D9 A! E' \/ R$ W* Q
  494. //        添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法
    7 T% Y: R- [5 j& ]9 e5 Q* b
  495. u8 ld3320_asr_addFixed(): j8 e8 G. A- q7 U' p) X. Y
  496. {3 ^0 \# L' |! h9 c" w
  497.         u8 k, flag;' Q: H: p3 L; ?8 V, d% t& I) ~
  498.         u8 nAsrAddLength;
    ) a' x  |2 H4 e! b4 K3 ^
  499.         const char sRecog[24][30] = {"xiao hui hui",3 D- Q: E  B' Q+ ~( Y% r: }
  500.                                                                 "ni you xi fu mei",& J* v' U4 s% R4 `3 u: _, a% V
  501.                                                                 "jiang ge gu shi",  _) C, O! c% m3 u. N% t6 @- Z
  502.                                                                 "ni shi bu shi dan teng",
    3 x8 u) p, o$ [0 `( P
  503.                                                                 "ni ban ben hao duo shao",
    $ ?$ H, |. a  i$ G1 {* o. y& i
  504.                                                                 "jin tian duo shao hao",0 d4 _+ H7 e2 ?1 J5 B
  505.                                                                 "jin tian ji hao le"," p8 e, E7 S4 F% W1 k
  506.                                                                 "xian zai ji dian le",' f- _$ C/ u9 R- Z. F- _  X
  507.                                                                 "jin nian ji sui le",% v; p4 Y$ s3 p) H
  508.                                                                 "ni sheng wa le mei",
    1 E4 p! f, ?5 c: V/ I
  509.                                                                 "da kai ji dian qi yi",
    ( k$ o  ?( a9 u: s8 I9 Y
  510.                                                                 "da kai ji dian qi er",
    ' i- u8 h; |5 q, \0 R  J
  511.                                                                 "guan bi ji dian qi yi",0 r. A' P( _( T9 @; b' s1 C
  512.                                                                 "guan bi ji dian qi er",
    ' ]/ T  j9 D6 q9 k
  513.                                                                 "da kai suo you ji dian qi",
    , [8 R/ H- y+ t5 ?+ }
  514.                                                                 "guan bi suo you ji dian qi"," D9 e$ _1 x7 ?. y8 f( K
  515.                                                                 "tiao gao yin liang",
    % G9 o" q. M, G% l. X
  516.                                                                 "zeng jia tin liang",( X# `- f& F& a+ `$ `
  517.                                                                 "tiao xiao yin liang",
    ) J( d# y- L- c9 n( k
  518.                                                                 "jiang di yin lliang",
    1 r: P0 P- _) _# `9 i4 r. N; _
  519.                                                                 "tiao gao yu su",
      R5 V5 ~" m  r2 Y
  520.                                                                 "zeng jia yu su",
    $ c/ U. _3 U: ^0 C
  521.                                                                 "tiao xiao yu su",
    2 l; P/ ~: y' D- a  C2 z1 Q
  522.                                                                 "jiang di yu su",
    7 h, J& `/ }/ Q
  523.                                                                 };, ~1 Q% u4 M. a' _9 o# v, ?
  524.         const Order pCode[24] = {
    % G& G+ ]4 k- {' d; q& q( L* k
  525.                                                         name,5 {1 I/ Q. ], i7 r* {' X2 d
  526.                                                         wife,
    9 }+ t+ z0 ^1 s" N' U
  527.                                                         speakStore,
    , t, z4 a6 y. ]
  528.                                                         eggPain,
      o. B2 ?  J- q" ?2 m% l8 ]
  529.                                                         visionNum,
    ' U1 F2 C6 z/ T' J
  530.                                                         todayDate,- M- n# `+ [4 r: f6 J7 U
  531.                                                         whyToday,; I# _9 z: ?( }! k; e! y# X: m  N
  532.                                                         whatTime," _# a& g) k9 Q8 u# Q
  533.                                                         howOld,) @( p5 f/ e$ g& J2 M  k
  534.                                                         haveChild,
    + [1 \" W; F3 P
  535.                                                         openRelayOne,  I( f  \  Y& \: s
  536.                                                         openRelayTwo,) z# p- @9 T0 Y/ o( F' n/ h
  537.                                                         closeRelayOne,6 k( X' l5 p% z- K: a3 }
  538.                                                         closeRelayTwo,
    ) H3 S8 E+ I- \
  539.                                                         openRelay,
    ! H. j0 H" l; r9 V# V
  540.                                                         closeRelay,# S8 Q4 o6 \( ~" w
  541.                                                         upVolume,0 t' i5 L. `- F) I. M
  542.                                                         upVolume,6 E% ^' V. C# O5 g$ d: s1 Q3 C" F
  543.                                                         downVolume,! g% W- D& c( y% I( H
  544.                                                         downVolume,1 h; M$ O; i3 ~- \  `' _0 e$ i
  545.                                                         upSpeed,
    % T: |  Z9 h* l2 W5 n9 C& C
  546.                                                         upSpeed,
    0 w3 `) e. @+ f* v
  547.                                                         downSpeed,
    % z0 {5 X" o) P. o* k* `& H) k
  548.                                                         downSpeed,
    6 C  t; s; O, A) b$ e7 n7 z5 Z8 p
  549.                                                         };
    : m; q' s+ J7 p- X6 C
  550.                
    ( G* U$ V. u! p- c, A
  551.         flag = 1;
    2 z/ I4 x+ [8 E8 b  x
  552.         for (k=0; k<24; k++)2 S2 n6 n6 p- }" ?" v
  553.         {  |) u6 K9 i8 `% x, ^
  554.                         
    . X# b) @: m( q9 Q( `! U7 a8 Z
  555.                 if(ld3320_check_asrbusyflag_b2() == 0)5 e2 j$ Q& v. g! I- D. p
  556.                 {
    - `/ B& w, J+ O* |% f/ |% ^, p: t
  557.                         flag = 0;( f' k' I; f8 g1 d0 \. l4 }3 [
  558.                         break;
    % R3 }3 V6 }/ E. E! s  w, `
  559.                 }
    - a6 q8 U0 i3 j8 k* C
  560.                
    6 c/ N5 w8 U" A0 X, s% X4 T4 t
  561.                 ld3320_write_reg(0xc1, pCode[k] );: G$ m, R3 K0 ]- B3 ]' W7 I; [4 N
  562.                 ld3320_write_reg(0xc3, 0 );
    2 q# d" J1 [" W: `" A0 e
  563.                 ld3320_write_reg(0x08, 0x04);
    / s1 o% \- ~) l! X7 Y
  564.                 delay_ms(1);3 ~' V2 o% p  W( `1 A& W: y4 R9 n
  565.                 ld3320_write_reg(0x08, 0x00);+ p. n# J$ A5 r
  566.                 delay_ms(1);" D. ~1 H* A  Q# j+ v+ x

  567. $ c% Y; W9 G2 w( j0 z
  568.                 for (nAsrAddLength=0; nAsrAddLength<30; nAsrAddLength++)
    + W5 X- m* Q& H& m) M5 Z7 O- \2 a- }
  569.                 {5 A( s% n4 h9 B# j) L6 @3 v/ R
  570.                         if (sRecog[k][nAsrAddLength] == 0)3 p' s0 Y3 f. Y4 t
  571.                                 break;
    # [$ f3 S: D8 y
  572.                         ld3320_write_reg(0x5, sRecog[k][nAsrAddLength]);
    0 U+ P& B: R/ S, N
  573.                 }
    ( K: N8 s2 i# v- g
  574.                 ld3320_write_reg(0xb9, nAsrAddLength);
    - d) X7 Q9 E$ u
  575.                 ld3320_write_reg(0xb2, 0xff);
    # W) }% p, v+ i$ @
  576.                 ld3320_write_reg(0x37, 0x04);
    * K1 m% p" o1 h
  577.         }
    6 ]) _  X9 Z$ z
  578.     return flag;) S0 A% d' u( f
  579. }# c& |/ b' W+ D" _- U/ f) D

  580. * S1 Z6 x) ], |6 }' \( x6 E5 T8 h7 _

  581. 7 B! G8 ^8 C9 `& f  x
  582. u8 ld3320_get_result(), H6 R! D% k, c, k* V+ R% h
  583. {- F# F% A8 l5 Q8 _) l
  584.         return ld3320_read_reg(0xc5 );
    5 U7 K7 l0 f. h' s  H# P
  585. }
    7 Q( `: ~6 a. G
  586. ) \% o% G. T) c
  587. /************************************************************************************/6 R( _, E6 B( {4 g: s- c
  588. //        RunASR()函数实现了一次完整的ASR语音识别流程
    ! N7 k& k: t7 f  I5 b3 v* R
  589. //        LD_AsrStart() 函数实现了ASR初始化
    * o# }, @  E0 L" A" j: A, A- s
  590. //        LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
    # ], u8 e; B/ j5 y0 E4 C2 F# J
  591. //        LD_AsrRun()        函数启动了一次ASR语音识别流程. ~$ ?: T* c! B0 C  M2 v
  592. //
    7 i2 ~7 S; N8 c3 [
  593. //        任何一次ASR识别流程,都需要按照这个顺序,从初始化开始进行
    ) `$ a1 Q" n2 ?  [: g0 A
  594. /************************************************************************************/
    0 i; G2 m# [; G) l9 _

  595. - x9 Z5 B1 b* {3 n6 i& k1 ~
  596. u8 ld3320_run_asr(). r' T3 Y5 R9 F: Q" N( Y
  597. {, A9 v$ I! b7 R  n
  598.         u8 i=0;) h; x1 ]& x' s" M6 T+ H
  599.         u8 asrflag=0;8 _! a; K  j: ]2 n7 l/ z  a3 c
  600.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程! }/ e/ w9 d# Q. M
  601.         {0 t# O6 v- W+ k
  602.                 LD_AsrStart();( M) {4 L6 \& l6 l4 N7 `
  603.                 delay_ms(10);
    , X% A. f3 S+ b3 G' C
  604.                 if (ld3320_asr_addFixed()==0)
    % U  ]- ?% H* d/ k% V. s4 w8 u
  605.                 {
    " J: `. C! ]# L$ R* e
  606.                         ld3320_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片! \% q% Q  [" M% i7 f; j. L
  607.                         delay_ms(100);                        //        并从初始化开始重新ASR识别流程
    # y1 S2 v$ G8 Z2 U
  608.                         continue;
    ! D& O. q( I6 z; H
  609.                 }
    8 y# M- K: L, L0 a/ \3 O& Q
  610.                 delay_ms(300);
    " B/ T6 t( V. e5 F$ }1 l% U
  611.                 if (ld3320_asrun() == 0)/ T, }5 s; E/ G7 m; O
  612.                 {3 h& U0 L4 {7 S' v
  613.                         ld3320_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片2 S( V, w4 Z3 Z5 i$ z7 Y8 N1 i
  614.                         delay_ms(100);                        //        并从初始化开始重新ASR识别流程
    / ?! }: [7 w& x- Y
  615.                         continue;' M" o$ d6 s' C; x" z' O8 H
  616.                 }
    6 o8 ]3 x8 F* A+ \

  617. # O1 Y1 s7 N0 G) o
  618.                 asrflag=1;
    7 E$ a' n# W2 G! K8 E0 X8 H6 @9 r
  619.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
    # m# D3 L5 r" S* ^  P9 x$ A
  620.         }
    8 J2 n7 J& Z5 U5 K2 H1 ~
  621.   y# Y9 c+ K2 M4 T  ?
  622.         return asrflag;
    8 L# y3 e3 ~* I( f
  623. }; f( P0 z7 J5 M5 o2 `8 S
  624. " e* A0 T2 l7 j3 A- b3 ~- n
复制代码
- V) _& w# y/ P3 C
LD3320.h: `! Y; {* w: f( y' f1 R

& ^4 ]* U; ]- k; A5 ^
  1. #ifndef __LD3320_H
    - l* b" q8 {: Z& M  p
  2. #define __LD3320_H 3 @6 B" M6 w1 g3 r' h
  3. #include "sys.h"$ D! ~4 g+ |6 D; H0 V+ {6 t, V9 _
  4. ; s& t7 l! D, ~8 I
  5. typedef struct
    6 p8 Q8 r% {, r* I9 d# c4 T# T
  6. {% U8 h$ m9 {% ^/ u& ~& F
  7.     unsigned char  b0:1; ) X$ Y4 B+ q3 x
  8.     unsigned char  b1:1; / d( f/ @( _/ U6 q1 K9 E
  9.     unsigned char  b2:1; 2 s5 ]+ b3 O" W$ ?
  10.     unsigned char  b3:1;
    9 i1 t- [9 _4 b
  11.     unsigned char  b4:1;
    # e3 {1 b- ]* L' u: a& _
  12.     unsigned char  b5:1;4 z! i3 U3 ?6 R9 L. t0 |
  13.     unsigned char  b6:1;3 E$ g; h( u: V( {/ l# c! _
  14.     unsigned char  b7:1;4 S9 M/ z/ r# X3 b
  15. } BIT8;
    , q5 J. q9 J4 x9 ^! j

  16. ! F/ P$ G  o; n0 X: g& ?
  17. extern u8 ld3320Data;2 }# I8 Z5 g% ?; M. B) s
  18. #define     bita0               (((BIT8*) & ld3320Data) -> b0)
    4 {" O- F: f  O# C
  19. #define     bita1               (((BIT8*) & ld3320Data) -> b1)7 x0 h, O7 `) S5 z
  20. #define     bita2               (((BIT8*) & ld3320Data) -> b2)( {5 g6 X. y- F. M1 u
  21. #define     bita3               (((BIT8*) & ld3320Data) -> b3)% Y# w+ t  z' C
  22. #define     bita4               (((BIT8*) & ld3320Data) -> b4)9 H+ m. l- p: G$ ^9 i) k
  23. #define     bita5               (((BIT8*) & ld3320Data) -> b5)
    ; Z) `- V' i$ ?( ?5 [9 Q* s
  24. #define     bita6               (((BIT8*) & ld3320Data) -> b6)
    3 K7 Q, J" s4 ?7 ~
  25. #define     bita7               (((BIT8*) & ld3320Data) -> b7)
    - S' c3 v6 f3 ?  d  Q$ I

  26.   d4 p0 U) y% T/ E. C6 @8 m+ N
  27. ( m% A* f! u$ C* u- T) k% D
  28. 8 m1 @3 `7 G$ K: V( P

  29. 2 T6 D( B! M; h
  30. #define LD3320_A0   PBout(15)$ v: C# R; D* K' p" t8 \6 L
  31. #define LD3320_RD   PBout(14)$ p/ _+ [, m! P% ]  E3 f* n
  32. #define LD3320_WR   PAout(12)
    4 E$ W' H6 o, W
  33. #define LD3320_CS   PAout(11)
    . L( Q- S2 n) g: _2 p
  34. #define LD3320_RST  PBout(10)5 ]* }! d; `) x4 O% X, U8 W4 G% T
  35. #define LD3320_MD   PBout(13)  F7 I5 _# u1 P' ~6 d* I
  36.                 1 L# l% A: @/ B  p
  37. #define LD3320_D0 PBout(5)
    - c4 |( `, o; {5 \3 ]0 _$ k
  38. #define LD3320_D1 PBout(4)
    ( Q6 c  N* A4 ~- r# l" a
  39. #define LD3320_D2 PBout(3)
      G/ [0 _7 E2 ~3 \
  40. #define LD3320_D3 PAout(15)
      e. i2 Q$ F/ s
  41. #define LD3320_D4 PBout(9)1 g0 T5 Z! T8 }
  42. #define LD3320_D5 PBout(8)" u1 r4 e, I( y0 n# m6 b. {
  43. #define LD3320_D6 PBout(7)3 O6 c) @: Y1 Z# P. n& }; F3 A
  44. #define LD3320_D7 PBout(6)
    . O3 F( O# L( p7 ?, o
  45. 2 ]6 X$ O& G7 E$ Z6 z
  46. #define LD3320_D0_R PBin(5)% r/ _- Q) K# U1 E2 b, d+ \5 _
  47. #define LD3320_D1_R PBin(4)/ z; B3 {  b2 W6 E1 p& r& N2 S5 a
  48. #define LD3320_D2_R PBin(3)
    6 {4 m  L) H+ ?& k3 v* X
  49. #define LD3320_D3_R PAin(15)
    8 b8 r3 N2 a3 B% t& W# n  N
  50. #define LD3320_D4_R PBin(9)
    # ^4 `, l) }) d% c# _' i; r
  51. #define LD3320_D5_R PBin(8)
    2 J! C+ Z+ q, Q  W7 q
  52. #define LD3320_D6_R PBin(7)
    / W7 Y2 }4 k/ U- }1 N  y9 l) [
  53. #define LD3320_D7_R PBin(6)
    5 D! K* n* R3 \
  54. * i$ s& K, {6 m" X' B5 |/ Y
  55. $ v4 t# d' \/ D5 L$ V/ i8 X
  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;}5 }! x3 N5 I1 F
  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;}! M- r5 b3 R; ^* D" e+ U
  58. 3 J2 Q. A3 B& f/ X

  59. 4 f5 W. O9 t/ n
  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;}+ U: ?: ?3 ~4 k9 n. E5 n+ r
  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;}
    ( |6 a8 k8 f% P8 j+ \$ Y8 I4 {

  62. 6 ?0 K) K7 w) V& v" y6 z
  63.         
    3 E. j# z) _/ D* p' ?8 c1 P
  64.         # W3 H9 \) l  Y
  65. //        以下三个状态定义用来记录程序是在运行ASR识别还是在运行MP3播放
    : N( w2 ~7 L% ?" G
  66. #define LD_MODE_IDLE                0x00
    , Q0 L* }8 I5 q8 M. \8 G- k) K
  67. #define LD_MODE_ASR_RUN                0x08
    ) W8 b% O' w. n0 i# ~6 P& P: e- S: @
  68. #define LD_MODE_MP3                         0x40
    . g, e1 q0 c3 }3 M! w) r
  69. ; L7 {3 M  j/ X& B, z$ M+ U

  70. ) V$ x4 n+ ~' ?4 g: O3 H& _
  71. //        以下五个状态定义用来记录程序是在运行ASR识别过程中的哪个状态1 n+ B5 B" Z& G
  72. #define LD_ASR_NONE                                0x00        //        表示没有在作ASR识别
    . c+ `, x, p, x. p! z) @
  73. #define LD_ASR_RUNING                        0x01        //        表示LD3320正在作ASR识别中2 p. D' p; |$ z2 D5 Q# Y, m$ S
  74. #define LD_ASR_FOUNDOK                        0x10        //        表示一次识别流程结束后,有一个识别结果$ k, R$ V$ B+ Y8 D  w3 ?
  75. #define LD_ASR_FOUNDZERO                 0x11        //        表示一次识别流程结束后,没有识别结果! Z9 c1 @8 {. ^- ?. G3 O
  76. #define LD_ASR_ERROR                         0x31        //        表示一次识别流程中LD3320芯片内部出现不正确的状态
    0 p) q* Y3 ]7 q0 G7 V* S$ i
  77. 3 D" T5 Y/ b0 C9 d
  78. 9 Y( i/ N- n- A/ C( T5 V
  79. #define CLK_IN                       8        /* user need modify this value according to clock in */' H: D1 Q6 p1 a
  80. #define LD_PLL_11                        (u8)((CLK_IN/2.0)-1)
    / ~2 R  Z# \) i; r. T$ d  S# u
  81. #define LD_PLL_MP3_19                0x0f
    1 c) \* ?/ H; l. w6 K& Q& n
  82. #define LD_PLL_MP3_1B                0x18
    ( M# U5 ]5 |" q1 q- q
  83. #define LD_PLL_MP3_1D           (u8)(((90.0*((LD_PLL_11)+1))/(CLK_IN))-1)
    + U3 f. S5 A" [4 R# w, |
  84. , Z" J0 T& w2 U- u! \
  85. #define LD_PLL_ASR_19                 (u8)(CLK_IN*32.0/(LD_PLL_11+1) - 0.51)( Z6 J% Q$ R& ^) @( }
  86. #define LD_PLL_ASR_1B                 0x48
    ) Y+ h) i+ A. r
  87. #define LD_PLL_ASR_1D                 0x1f
    4 |. P* C# e0 r; x+ O% N) b7 G6 v
  88. 2 y6 e# n$ k% S. Z. M4 T/ U
  89. // LD chip fixed values.4 ~4 V- g' b  v
  90. #define        RESUM_OF_MUSIC               0x018 u; J2 E( |6 G7 p
  91. #define        CAUSE_MP3_SONG_END           0x209 i* ?4 Q( E! q( H; }; v& d1 n
  92. ) v) L  @& {! ^1 c# j
  93. #define        MASK_INT_SYNC                                0x109 S& D% s% P' Q5 F2 _- \  D
  94. #define        MASK_INT_FIFO                                0x04/ ~; {7 {. j3 v) ~8 C
  95. #define               MASK_AFIFO_INT                                0x01
    ; V* z8 J! Z: G: m
  96. #define        MASK_FIFO_STATUS_AFULL                0x08        
    " P, _$ z( [: r/ F
  97.         
    2 ^3 V+ I( ^8 j# X, J7 I
  98.         ; u) S3 d* ?7 e0 l) x( U
  99.         
    * p, k. @4 z: |
  100. typedef enum
    # _3 k; H) h8 }  X
  101. {! d" b' H( {& E  o5 f1 c  |
  102.         name=1,  //小灰灰 9 G- d& F0 {& J8 G" z4 j+ X
  103.         wife=2,  //你有媳妇没
    : L( Z. f! e# P) \: D" M
  104.         speakStore=3,//讲个故事+ p7 Q& T- @) B, M. K+ n
  105.         eggPain=4,  //你最近是不是蛋疼
    & p+ Z" u0 g2 S% _" Z/ q0 _2 q
  106.         visionNum=5, //你版本号是多少. i4 g4 {9 a8 a5 I! X: ~! ?
  107.         todayDate=6,//今天多少号
    : l& c! X+ o6 c$ h% L
  108.         whyToday=6, //今天几号了
    ! N5 B% X8 k: ~
  109.         whatTime=7,  //现在几点了( X  G" |0 j) O* r/ t
  110.         howOld=8,    //今年几岁了
    # f) ]+ Z) i/ M( u# L
  111.         haveChild=9, //你生娃了没
    6 I( w3 n( w2 m* T/ I6 _
  112.         openRelayOne=10, //打开继电器一
    1 ]0 `5 O0 P! A' ^/ e; r& ^0 V
  113.         openRelayTwo=11,  //打开继电器二9 q# G0 `; {; N% o, B2 v
  114.         closeRelayOne=12, //关闭继电器一* r0 Z" U1 L% s$ F, W" E
  115.         closeRelayTwo=13, //关闭继电器二
    6 t( N  p: C, a( F6 P' O6 d8 a# p, O
  116.         openRelay=14,     //打开所有继电器
    # b9 [8 V/ ~* O
  117.         closeRelay=15,    //关闭所有继电器
    6 n5 @% v. K4 o  r  i7 z  F
  118.         upVolume=17,   //调高音量
    * D0 I9 f( ~: `' p8 X' v/ |3 O& B
  119.         downVolume=18, //降低音量
    # E1 e) A8 k5 X8 t1 r& P$ ^
  120.         upSpeed=19,                //提高语速
    & h: d7 C" W0 t3 R1 \8 q
  121.         downSpeed=20,      //降低语速  A+ R4 e. r' A4 g8 L. _" ~
  122. }Order;
    6 D/ m- I  a" k/ z$ W% d0 v) j% K0 N
  123.         4 R% x5 ~# _. C' o$ @
  124.         
    " ]# U2 B% s3 p
  125.         4 N- Z: j* f( A) H" q
  126.         
    ( a6 C1 d) K) R+ X) Z# `. L$ [
  127.         5 i# i7 R1 Z" T, H8 Q
  128. extern unsigned long nMp3StartPos;
    ; ?2 m) ^+ ]# ~, ?
  129. extern unsigned long nMp3Size;
    + v3 n) M2 t% k2 ~% G. x
  130. extern unsigned long nMp3Pos;
    * u" b1 W; D; v% m) |. @
  131. extern u8 bMp3Play;                                                        //        用来记录播放MP3的状态# U3 C% B; s0 L. [0 F" L3 L" @, N
  132. extern u8 nLD_Mode;                //        用来记录当前是在进行ASR识别还是在播放MP3
    " V3 c, x0 U4 _
  133. extern u8 ucRegVal;: m; E  z. N/ T' q8 q* G
  134. extern u8 ucHighInt;9 W4 k% l# s. |1 i: `3 l2 N, `1 Z
  135. extern u8 ucLowInt;
    2 W2 v- t/ s- y( K  [& }4 x
  136. extern u8 ucStatus;7 F5 S3 S3 m$ \" @& x# f! W& F
  137. extern u8 ucSPVol; // MAX=15 MIN=0                //        Speaker喇叭输出的音量) c# |$ O0 q, s4 r
  138. #define MIC_VOL 0x55        2 F9 b8 z; n' e& r1 W8 d
  139.         
    $ v# g# _' C$ g% r- I
  140.                
    & Z0 e- Z! c6 K- h0 h) r8 n8 s: g  R
  141. u8 ld3320_check(void);        
    3 h: X6 B% s  h+ v1 y6 Q
  142. void ld3320_init(void);        ) Z) b! Y" T  I# q. J, u$ @
  143. void ld3320_process_init(void);        6 K* B& A6 k$ I: e- g
  144. void ld3320_reset(void);" L9 ?  c1 }" R6 ~
  145. void ld3320_init_common(void);1 q& j- i) }3 r% k1 E
  146. void ld3320_init_mp3(void);
    . k$ M" ^& V$ _" V, H2 V& C
  147. void ld3320_init_asr(void);  k, v' P3 ^& i6 ?5 a9 {. Z
  148. void ld3320_reload_mp3data(void);
    * K" v, |- @6 O
  149. void ld3320_reload_mp3data_2(void);
    3 X* U2 b* U+ V( H) ~$ x
  150. void ld3320_play(void);
    7 g/ w3 u8 a+ J; k# Q4 A: P  f4 M
  151. void ld3320_adjust_volume(u8 val);' Q% w9 i& @. n' L: o
  152. u8 ld3320_check_asrbusyflag_b2(void);
    ! D% G" v) Y6 Z/ T% A6 M' L! R
  153. void LD_AsrStart(void);& \$ j6 ~* L8 M. f! D; N- \
  154. u8 ld3320_asrun(void);! k  `  h+ u+ O7 a# B. H
  155. u8 ld3320_asr_addFixed(void);
    5 k! j( Q& C& l
  156. u8 ld3320_get_result(void);
    0 z  A- D& _6 ?9 f: R
  157. u8 ld3320_run_asr(void);3 o! l$ m/ _5 X* ]
  158.         0 ?( y( T8 s, B7 [+ r
  159. #endif
复制代码
0 G9 Z  I, m. ?5 N
freq.c
2 b; f, ]8 L, }( d
5 e6 c! }: p/ x: L" z$ o( [
  1. #include "freq.h"; z. j2 s6 M5 b* x# U. z1 B
  2. 6 Y9 C0 S9 A" T2 ]

  3. 1 r9 v& v' O) [  N  b) W5 k
  4. void ld3320_freq_init(void)' v% `4 g) ?! y8 f" }+ N
  5. {
    : |' K  q" g& [/ W% W
  6.   u' G0 Q$ U; n; \: D1 l* S# v* q
  7.         GPIO_InitTypeDef  GPIO_InitStructure;6 t. X& N9 R* x( O4 |& c
  8. 8 F6 m9 P! r9 k' Z
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);         //使能PB,PE端口时钟! ?- T) M$ r, g: @& y# u1 H% ^  \
  10. 6 K8 j% `" H' O
  11.   G2 a, L) w. j( {1 B3 w
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;+ Q& K7 H" z! x( k' X
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    7 r: P1 B; F- Y8 i3 C8 W
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;2 U. f! W" Z4 z: C, p
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);        
    6 q6 R" V0 ^0 \; T7 M1 ~6 o" f
  16.         GPIO_SetBits(GPIOA,GPIO_Pin_8);6 K5 u& L7 B2 o3 d  Z; h
  17.         
    2 _* x+ \4 a: j& X& d4 z8 H# V3 ]
  18.         RCC_MCOConfig(RCC_MCO_HSE); //RCC_MCO_NoClock --- 无时钟输出 - q7 l' y: [7 L2 `7 G
  19.                                                                 //RCC_MCO_SYSCLK --- 输出系统时钟(SysCLK)
    - l' c) j6 e- a, M
  20.                                                                 //RCC_MCO_HSI --- 输出内部高速8MHz的RC振荡器的时钟(HSI) # d" d" H$ h/ |. n# Q
  21.                                                                 //RCC_MCO_HSE --- 输出高速外部时钟信号(HSE)
    % X8 L$ C9 f5 ?* P' r
  22.                                                                 //RCC_MCO_PLLCLK_Div2 --- 输出PLL倍频后的二分频时钟(PLLCLK/2)               
    " G# K6 ?; _7 d+ T( }
  23. }
    . }& u. }& E- V" V7 A
复制代码
% l8 A/ u/ m" O3 W/ p/ a7 ]0 `1 S
freq.h3 Y3 [! E2 L) R/ J( z, H; k

# j( b& i% H& _- |4 B. s
  1. #ifndef __FREQ_H
    - P% o, r( `1 o1 m4 Z% k8 ?
  2. #define __FREQ_H 8 b* J; A0 g# h: W6 s; s0 j
  3. #include "sys.h"5 s' M" t! F7 G- X

  4. 2 g: }6 m3 l' j
  5. 8 w9 D8 p$ d" V9 d; l6 A
  6. void ld3320_freq_init(void);        
    9 k/ r5 h! ]9 w) A: F
  7. 6 H3 T7 A, q* o) ?$ C
  8.                                                      ) G& F, K. `' f1 s' Q  V
  9. #endif
复制代码

( q  b+ |1 J( `0 M' ^, Imain.c. E) V5 b+ ~) v$ q9 y/ R

  _' |: \  s, J/ b- X
  1. #include "sys.h"
    & P$ m$ D4 X1 j8 J- _& |
  2. #include "delay.h"6 G/ s& _* v) h9 x
  3. #include "usart.h"1 B6 P3 L1 W$ o0 _  |9 f
  4. #include "led.h"  |: Y( d: [/ V: r
  5. #include "ld3320.h"
    $ b0 O1 u( {* }; e: D: [; P
  6. #include "freq.h". o' b/ H# d; z  [6 V2 g
  7. #include "malloc.h"        & N8 q1 t8 E! G  R2 ~
  8. + [1 A( R  S' b1 T1 n& ^) C

  9. ; z# S( ?9 E; J) Q8 [. y
  10. u8 nAsrStatus=0;        $ b: R6 }, G1 O" j0 F7 Q. \
  11. extern u8 bMp3Play;                                                        //        用来记录播放MP3的状态
    ; L/ [) j# p  ^0 q
  12. . S6 C( x0 V( ?/ u$ l, M2 }
  13. u8 voiceSpeed=5,voiceVolume=10;
    + h4 q, W& T  C5 U+ K$ T2 q

  14. / [0 |$ v9 f, ~, x  V* ], F
  15. int main(void)
    ; L& B, f% `0 i4 |% ?  q0 `0 d
  16. {        
    " ]1 h3 R  C( s% F5 u6 W
  17.         u8  nAsrRes;
    2 S( f: ?$ n% C% B% z
  18.         u16 i;4 `) X( L3 F8 E' l+ }- p! p
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    9 q* s! U  D. v. e
  20.         uart_init(115200);
    + V5 K& r6 h5 ]1 Y2 S+ Z( J
  21.         3 n- m+ v, v8 Q/ }% j7 v
  22.         delay_init();        2 `/ t, `: g8 A7 O
  23.         ld3320_freq_init();
    6 J5 u* w8 j9 i
  24.         led_init();        
    " P  J0 n3 B6 ]1 L2 v! O# Y+ P+ I
  25.         mem_init();                                //初始化内存池
    4 T7 ~& J3 f2 Z* \# \  o8 x
  26.         ld3320_init();
    5 N  \$ I4 f: G/ K+ `3 ?2 i
  27.         delay_ms(1000);! u3 v6 f" }" G/ M7 T, G
  28.         ld3320_reset();
    ! t( W, o& a2 q
  29.         while(ld3320_check())
    ' P) A7 ]1 `- I) d2 |! C2 B- c2 G5 s
  30.         {
    ; R! a1 i  {% U
  31.                 printf("LD3320 Error!!\r\n");# h4 Y: ]9 F; O6 p, N
  32.                 turn_r_led();
    , M/ u$ ?5 l/ u$ k- Z2 |" Q3 c2 j
  33.                 delay_ms(500);4 Y+ z, p% p9 ^: Z5 y* q9 Y
  34.         }        4 d: v( x( n' X7 e( z
  35.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR
    " R9 V5 e  ^2 T2 u8 k! @
  36.                   @, ]* C; j" _; S
  37.         while(1)
    + Z! M8 W; X7 b" \! L
  38.         {        
    6 H8 U& @2 c! z& t$ C# H
  39.                 if (bMp3Play!=0)                        //        如果还在播放MP3中,则等待,直到MP3播放完毕 即bMp3Play==0
    / Y1 h  {" v3 o! y, \& `4 U# k
  40.                         continue;                                //        bMp3Play 是定义的一个全局变量用来记录MP3播放的状态,不是LD3320芯片内部的寄存器
    , L; E7 b; Z6 K* X8 _
  41.                 switch(nAsrStatus)
    - o, U8 B1 n9 o
  42.                 {" h& ^9 E8 Z: |" A
  43.                         case LD_ASR_RUNING:        break;8 \8 C9 m; V% m* Y  U$ k( Y/ z
  44.                         case LD_ASR_ERROR:        break;
      a$ O+ E2 s+ i- ]+ h
  45.                                 2 v# c) e1 @! W6 q
  46.                         case LD_ASR_NONE:
    + a. d' f; [2 ?; @5 [
  47.                         {        
    + U2 ~: ?1 j* v* U2 \4 u
  48.                                 nAsrStatus=LD_ASR_RUNING;; g' j2 M2 d: y( J1 L5 @( g
  49.                                 if (ld3320_run_asr()==0)        , S9 I5 P1 j  J, G0 O2 j
  50.                                 {5 J6 P# F7 H' e' v; L
  51.                                         nAsrStatus = LD_ASR_ERROR;) _8 e& {0 B5 {9 h
  52.                                 }
    , Q8 J: n; g* `1 F& e) n" {
  53.                                 
    " l% c% U# T8 o: D0 x+ A
  54.                         }break;
    0 R' ?( Q* f; f4 W3 H6 j3 k% m/ @
  55.                         case LD_ASR_FOUNDOK:4 P- F: S, P. e7 Z3 h. ~
  56.                         {* n8 ]" r# f" P" E6 \* G
  57.                                 nAsrRes = ld3320_get_result();& y0 O+ R% ~0 q/ _+ R2 }+ b1 N
  58.                                 printf("nAsrRes=%d\r\n",nAsrRes);                                / T+ u$ H2 L) ]( `
  59.                                 switch(nAsrRes)4 A  B, v( A* B3 d7 c# z( ]; \( N( E
  60.                                 {
    8 l& ?( e/ q9 k6 X6 |5 a* i
  61.                                         case name:/ I- `9 Z* q, x" b
  62.                                         {           
    & P5 J. O, E% B  R/ f1 w) m! U  V
  63.                                                 printf("小灰灰\r\n");        / ^! A: ~1 }. Q1 V0 Q
  64.                                         }break;
    9 I% {' B0 }* `0 y  s( Z
  65.                                         case wife:   
    ) Y- K' i  n" J# U5 D
  66.                                         {
    1 n3 t% i5 K4 X
  67.                                                 printf("你有媳妇没\r\n");% W* U3 l: X& k/ U4 u
  68.                                         }break;
    8 ?7 N. e0 [) d9 q$ J
  69.                                         case speakStore:
    $ M8 F0 S" b6 m8 B8 k
  70.                                         {                        
    ( k" z/ p( ]2 R7 X# x
  71.                                                 printf("讲个故事\r\n");
    , g% T# N7 M1 T& N' x
  72.                                         }break;  q: e/ Y! |/ n
  73.                                         case eggPain:   
    . m; x" x+ Z: P
  74.                                         {                                                
    6 E! w/ T- E0 ~9 C
  75.                                                 printf("你最近是不是蛋疼\r\n");
    4 x* ^, A/ z) w* v
  76.                                         }break;! V# J) s, G1 _2 v
  77.                                         case visionNum:   7 `1 j  X; i& Z5 ~' ^6 L, {
  78.                                         {                                                
    . l! e$ g! }' s" {' D% b) F6 I- J
  79.                                                 printf("你版本号是多少\r\n");
    - X- L$ J7 l* T& u
  80.                                         }break;, `4 G( }% D0 W
  81.                                         case todayDate:
    % X8 Q3 t9 n% o5 E
  82.                                         {                                        # f& {0 z/ M0 x, h
  83.                                                 printf("今天多少号\r\n");3 ?! r8 Q( S9 z: ~& u  [. V
  84.                                         }break;8 [+ j: W; i+ q! h7 d3 P1 T* V
  85.                                         case whatTime:  ) }$ a0 q0 ]9 t2 \7 S
  86.                                         {                                                ( F5 |' P2 D2 d) B5 p' x
  87.                                                 printf("现在几点了\r\n");                                        2 x0 n3 q$ G) J) U' s
  88.                                         }break;3 R. C8 s! p, Y% `# i0 I
  89.                                         case howOld:        
    + Q9 Q9 a6 u3 I" M9 V/ [
  90.                                         {                                                5 u  w. {/ D4 F$ c* i) a2 c' ~; g
  91.                                                 printf("今年几岁了\r\n");
    + a8 ^9 z7 H: h, R1 m
  92.                                         }break;
    " r/ ^5 q& L& a
  93.                                         case haveChild:  - Y! @% ]) A, w! }, j8 ?+ L% d! I
  94.                                         {                                       
    # `/ U3 \# O: v" X
  95.                                                 printf("你生娃了没\r\n");1 J% M4 S: B; ?5 |- ?
  96.                                         }break;7 _* B) Y/ R! X2 @8 W0 z' x" z, v: b
  97.                                         case openRelayOne:
    ; J- V  B' q3 M2 q5 p
  98.                                         {                                       
    ( W3 }3 J5 S% l- n
  99.                                                 printf("打开继电器一\r\n");
    3 H, L1 C. ^; {
  100.                                         }break;! t$ H( V( r( d. h  M3 Y; @: w/ N
  101.                                         case openRelayTwo:
    2 f4 b2 U+ d! C9 m
  102.                                         {                                                8 f0 n+ X$ j" s6 G' w+ u/ Z1 g
  103.                                                 printf("打开继电器二\r\n");$ z, U7 ^1 k$ B% T  B4 Y: B
  104.                                         }break;
    & g; p9 Q4 w1 x2 K, k
  105.                                         case closeRelayOne:
      T0 G$ q0 d5 z8 j0 J' L
  106.                                         {                                                . e9 V2 Y, P8 }/ D" ]6 D8 _: g* ]
  107.                                                 printf("关闭继电器一\r\n");/ ?: x& ?0 f2 }( T+ n" q3 `
  108.                                         }break;1 @  @4 L/ d6 p
  109.                                         case closeRelayTwo: % l, V- [7 \/ v4 z. x! x( \0 I
  110.                                         {                                                7 x' b6 B' T8 V2 L7 y
  111.                                                 printf("关闭继电器二\r\n");
    7 T1 H+ B* M# b; m: x* V" Y
  112.                                         }break;: E+ Z% l2 W' ?! @. d  k- c8 b
  113.                                         case openRelay:   
    5 _& g' M, K4 a: e1 j
  114.                                         {                                       
    0 ^" D, O( i6 m- q' X
  115.                                                 printf("打开所有继电器\r\n");
    # c' r6 U& O6 N, p* y- R
  116.                                         }break;8 L, J  |5 N4 L- t6 o
  117.                                         case closeRelay:  
    , t% p( E  n) n& ]) \
  118.                                         {                                                
    7 b0 B% w* B: U: g1 g( V& v  A  O: C% L
  119.                                                 printf("关闭所有继电器\r\n");
    * o: m8 O8 C+ Z3 l# i( n3 V  \
  120.                                         }break;        5 S. ?( n4 @3 o$ E( ?. F0 h# l
  121.                                         case upVolume:   0 K$ l; `1 D3 v4 {
  122.                                         {                                                / f; }7 c+ {) p& ^3 K, O
  123.                                                 printf("调高音量\r\n");
    # m* s; c- l  `4 t  D$ e
  124.                                         }break;        
    . J0 q. k! p  {; M, E: y
  125.                                         case downVolume: ; q3 Q7 H; K9 K5 H' m. X& B
  126.                                         {    0 m2 T1 M1 l' o8 L+ q0 V
  127.                                                 printf("降低音量\r\n");1 q, P% j1 ?  p; U! K, B
  128.                                         }break;        2 u' c! [) B) ]9 o
  129.                                         case upSpeed:
    6 s, |# B4 ]/ f0 w" ~7 p0 a
  130.                                         {                                        * H! U- G8 o  ~! U3 Z, D
  131.                                                 printf("提高语速\r\n");9 N; L# Q1 t. G- o; m
  132.                                         }break;        , @/ p, g- j& r7 z. ?; X8 z3 ?7 N  z
  133.                                         case downSpeed:  % D! Y6 G, |9 v( C+ r$ p7 S
  134.                                         {                                        , r+ v9 {$ V, x( q2 z
  135.                                                 printf("降低语速\r\n");6 q0 G" b# U  i- S  R1 U
  136.                                                 
    ! M/ O. r' Q# Y* h, [/ a
  137.                                         }break;                                       
    - a& ]- q; E. t4 ?8 T7 c
  138.                                 }
    1 X" d: e- i* w5 R  K0 a$ w+ i
  139.                                 nAsrStatus = LD_ASR_NONE;
    # G+ L' ]+ ^1 y/ g5 f
  140.                                 
    ! l. Z5 i( u, Q5 B- J! m
  141.                         }break;
    3 _% i  a6 U2 C; R
  142.                         case LD_ASR_FOUNDZERO:& ^7 A4 L; X6 H: j: ]
  143.                         default:
    ) W  h; U2 J8 D# f, h
  144.                         {8 g6 {0 ^* e3 ~" A" k
  145.                                 nAsrStatus = LD_ASR_NONE;' W! V# Y+ h, X- ?. k* J
  146.                                 ) a' c: b) w% u1 Z) [1 G
  147.                         }break;
    8 r3 f8 T* O' q' O$ k: j' l# k
  148.                 }
    ( ?* E& s  w7 B
  149.                 delay_us(2);" x" c2 w% w/ S" a
  150.                 i++;1 d# z  G8 g& X. S- l+ h
  151.                 if(i>=60000)
    ! f: W* \2 ~, }/ E; E% o: N
  152.                 {
    - F' u1 U/ a& x2 k" b
  153.                         i=0;
    2 ?/ t9 Q0 P" s6 D& E/ a, s6 ^4 g7 F
  154.                         turn_g_led();
    " M8 Z! O2 u9 n0 `, P
  155.                 }
    3 {" w2 ~% w2 O8 _! ~5 J
  156.         }
    , [( Q+ d: ]0 ?$ b" `. N- r
  157. }/ L' w4 I; U0 @; s+ Z
  158. " i* h# ]- L" Q& ?* T
  159. 0 w; P" E( e3 t0 c
复制代码

0 Q! o0 Y$ I8 l$ i9 @! {8 r
赞 收藏 评论0 发布时间:2022-4-24 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版