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

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

[复制链接]
STMCU小助手 发布时间:2022-4-24 16:00
一、原理图
5 e0 L0 r, o" G- [0 p$ X# N
+ F! N: M7 b( q; ~
99Ia$W`8_TY4`GM[WZB52.png
6 G4 v) w% v. a/ ~( t* H6 V$ l: m
5 {1 D( ?- W4 E6 ^& b. M) J二、源代码

# r- `( g. j# n, U% `& YLD3320.c
6 D3 P) c1 N4 ~( u2 p/ h
% t1 H. ?) I$ a  x# D( T% G$ u
  1. #include "ld3320.h"# s. j6 P6 S2 Z: A  I! B
  2. #include "delay.h"
    ' m3 ?0 c5 ]- A% v+ _; g( ^# C; g
  3. #include "usart.h"        ( [  M( e. g, {. L- i7 c
  4. #include "string.h"
    % S4 x% n* m& [3 {, Q% q5 ~: @
  5. u8 ld3320Data;' H  I; o* y" u
  6. extern u8 nAsrStatus;3 I% D  [- A! n1 T: l
  7. . l7 c) ~6 D0 ]& D7 Q
  8. unsigned long nMp3StartPos=0;
    0 Q& _1 l, w8 P. t6 |1 w$ z
  9. unsigned long nMp3Size=0;
    ( f; Z# ]1 [* L7 T* f$ N6 z
  10. unsigned long nMp3Pos=0;2 l$ }6 _( t3 x! c% I- F
  11. u8 bMp3Play=0;                                                        //        用来记录播放MP3的状态$ d  A' X( u- G& W" R
  12. u8 nLD_Mode = LD_MODE_IDLE;                //        用来记录当前是在进行ASR识别还是在播放MP37 ~! _% F1 h3 a# C4 U6 d
  13. u8 ucRegVal;
    5 z( v- [& h3 @# S
  14. u8 ucHighInt;
    8 Z$ M. v: Z+ w+ C7 _
  15. u8 ucLowInt;
    % O& }# z5 N4 S# z, B4 y3 Y
  16. u8 ucStatus;
    : {4 F/ u- p5 W1 {/ v( V( |
  17. u8 ucSPVol=15; // MAX=15 MIN=0                //        Speaker喇叭输出的音量% c9 Q/ }6 n' P. E# V2 K6 Y# R
  18. * g* l$ Q4 f+ k+ ]
  19. ' d6 z1 y2 Y; P2 Y' f! Z

  20.   T4 c3 z) z" W2 Y% E, Q' ]! F& |6 x
  21. void ld3320_init()- z1 I4 W1 O3 N# M
  22. {5 G" z" u4 d9 g  f7 \+ m  B0 R
  23.         GPIO_InitTypeDef  GPIO_InitStructure;
    . w9 f( D5 S. q" T
  24.          EXTI_InitTypeDef EXTI_InitStructure;
    + K9 v# M5 f: ^, |. A( f* A6 U6 L$ K2 ~
  25.          NVIC_InitTypeDef NVIC_InitStructure;
      _8 a0 l6 t! E  I0 g
  26. ) l/ o  Y5 |. c0 [
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);         //使能PB,PE端口时钟* c4 L' n* E+ f4 a1 u& U; ]! h
  28.         
    ( j( n* O& u3 ]2 A, x9 l& F& f+ k2 K
  29.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);5 w+ U4 K  o% e8 O
  30.         
    + c* ?& O/ [# J& p; v
  31.         . _- Q* j8 @; k9 ?4 D
  32.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;                                 
    9 @- G& Q" o% A$ E; T2 e
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  6 p" i) K  }/ }+ p3 l8 V
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
    8 a- K& \$ {* W2 N* H2 H- [. @. C
  35.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                       
    * x" S5 y* E1 M0 N5 u* ]0 ?, g. w3 J; f
  36.         GPIO_SetBits(GPIOA,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);& S" m" [4 r8 F4 Z
  37.         
    . g; w8 g7 c4 F3 N! [
  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 ;                                 6 S3 ^2 K1 h( h7 i. ]
  39.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
    * T0 t6 A' E3 X( C6 a7 u
  40.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 # h% N! o, L5 q
  41.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                        8 M8 \! r: T. ?9 a: u+ W
  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);
    ) B5 ?) p& L- t+ U
  43.                 1 T/ H0 D( T+ t' Q1 ]4 o8 k+ j
  44.         
    # p1 r9 t, R  s) d1 M) y. l
  45.         LD3320_MD=0;  //选择并口
    1 H; x; P; ?; h7 K- T
  46.         LD3320_RST=1;        
    7 d* s; x. x8 U. S+ Z# X, W
  47.         LD3320_A0=0;* h. g1 \9 n; [
  48.         9 v- n* j; z, n
  49.         
    . r; K" R+ v0 F" k
  50.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11;                                 
    " M0 \/ _; e/ I. v* n
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                  
    3 y/ [# `" Y. m9 G: M3 c, {
  52.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 ) z; B# Y5 m5 \: Z! X  U: X
  53.         GPIO_Init(GPIOB, &GPIO_InitStructure);               
    1 v# U' [( b  s, i; ~/ s7 U4 y0 ?6 h
  54. ' Z' w% f' p, w5 |
  55.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟
    ! ?) h/ P$ R/ W) j
  56. % r  B5 V/ z3 e- Z! n: V- Z
  57.     // 中断线以及中断初始化配置   下降沿触发. r7 n* W' s& \' n# z% r
  58.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);
    , j( n% Y  F3 U5 L9 u
  59. ! ]$ `. O% y, A6 N) ~% d: Q
  60.           EXTI_InitStructure.EXTI_Line=EXTI_Line11;        
    ' m7 P0 |. ^# c- d
  61.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        $ L! K# a0 B, P( I6 c4 [( F
  62.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    & }6 C3 _0 [$ n4 W/ b# q; d2 D
  63.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    1 N6 A% E8 g' @  _+ t
  64.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    2 o8 V& o6 L" m5 @9 r
  65.         5 X& d5 C+ K2 a$ K" q
  66.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能外部中断通道; \8 i' w: O, d& K+ q
  67.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;        //抢占优先级07 `& d7 H! d3 K/ _6 ~8 d! U
  68.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级0 1 M# [( A5 X4 L( W
  69.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
      x# N/ _0 L8 k' r& b1 W
  70.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器        ) f6 H3 l  p. B$ X; o+ k  e

  71. " j# U7 a5 t, l& g
  72. }
    # ^9 y6 L; d  {/ Y3 d* p- n0 ?' d
  73. + R' A: [3 n2 {* D$ I
  74. //外部中断服务程序, w; \2 l2 e2 s7 }& o" U8 [
  75. void EXTI15_10_IRQHandler(void)3 _9 ?6 W. C- d
  76. {
    # [3 ?* ~0 x( F1 G- e6 [
  77.         if(EXTI_GetITStatus(EXTI_Line11)!= RESET )
    9 p  x" e7 N( J3 Q% a$ {8 Z% @1 E
  78.         {
    ' N, u8 }1 T! P
  79.                 ld3320_process_init();               
    8 S7 K9 }* u& V8 [5 g6 v% A
  80.                 EXTI_ClearFlag(EXTI_Line11);( z0 ?& O3 E  n
  81.                 EXTI_ClearITPendingBit(EXTI_Line11);//清除LINE上的中断标志位  # `8 r) w  z( c/ Z) K
  82.         }         - }; q0 ?/ m' }2 O0 a
  83. }
    # P' e/ V/ h, `/ `
  84. : C( H# U1 y# |6 i  ?7 m
  85. / ]7 m6 u7 ~0 y, x) P
  86. void ld3320_write_reg( unsigned char address, unsigned char dataout )
    ! s/ B, b; l: J% R$ C3 _
  87. {
    / ], U9 f3 K3 F
  88.         % r- h1 t  h8 ^3 e
  89.         ld3320Data=address;
    : B, g! S5 O( K' S6 X* M& h
  90.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;
    / ]9 |  S# K3 ]; @1 c! m
  91.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;  U5 d( B! I2 a4 r0 d2 q$ g
  92.         delay_us(1);* V6 i. R/ v$ o% h0 h& o; _3 q
  93.         LD3320_A0  =1;; I1 }+ A; @, o! b6 ?
  94.         LD3320_CS = 0;
    ' i( m8 h9 r3 y2 w$ [" V
  95.         LD3320_WR = 0;
    2 }0 t% n! x  l. f( }! j

  96. & [* E1 g* @3 `  r3 K
  97.         LD3320_WR = 1;/ g6 h. U, o! L$ C- g6 u' W
  98.         LD3320_CS = 1;
    ' Q3 k. x% b& {
  99.         
    5 \, Y' A0 i+ q9 v1 [8 D* T" g. u

  100. / B# o$ Q( f/ B% |) z/ A
  101.         ) W2 B2 N. Y* F  q$ H3 h6 |
  102.         ld3320Data=dataout;
    $ F% S# L+ p6 o) b
  103.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;$ K2 m7 f. Q3 E% [" C" _, ~# w
  104.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
    9 x) n+ B$ I  P. u- H
  105.         delay_us(1);# K; C/ Q6 D$ o6 U* H8 ^4 A/ P
  106.         LD3320_A0 = 0;5 ]- J$ y1 _4 u/ W& N
  107.         LD3320_CS = 0;
    9 u& ?7 W  X$ r4 f$ C  _
  108.         LD3320_WR = 0;9 [, k) g/ q! ?) j1 d& ~2 L

  109. ; h4 A7 G+ Q! W$ n6 y) O
  110.         LD3320_WR = 1;- q0 t% ~$ `# v+ I5 e# R/ L
  111.         LD3320_CS = 1;
    ' Q" Z% q- N6 w# y( w  r
  112. }* \4 J7 }, D* i0 _1 Q& {, T- t

  113. 0 y% `6 ^: d1 V2 e7 d5 Q' S5 M
  114. unsigned char ld3320_read_reg( unsigned char address )2 b: v4 B' P- @) v9 B; j5 p7 [8 ?
  115. {
    0 v# X0 }0 n, Z" B
  116.         unsigned char datain;
    / Y% }/ H( ^# o) f/ [+ d8 U( y4 l, h
  117. 1 K1 i6 ?/ B: a5 d2 h. Y$ ~
  118.         ld3320Data=address;, G) z/ w8 B7 y& H7 C6 H, A
  119.         LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;7 A+ L7 A& h: l3 V$ ]; S
  120.         LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;% ]% W, `( }6 K1 E2 V
  121.         
    . d& t' F* H4 m5 P( G/ n( K
  122.         LD3320_A0 = 1;( R; i# u  C/ _4 Q; T' H
  123.         delay_us(1);3 X! G+ q3 J" Y2 w- m, T  c9 {
  124.         LD3320_CS = 0;! L! x! R0 U- v5 C
  125.         delay_us(1);  o* u$ [: D) K* C2 A) \, T
  126.         LD3320_WR = 0;
    * S/ t; b$ C( }! T- M6 Z  M
  127.         delay_us(1);. p3 j2 a" `0 k& o- m9 O
  128. ) v( @6 n- @% B% O" l6 Q
  129.         LD3320_WR = 1;2 p+ {0 |, c& B$ }) R/ v2 i, r& V6 s
  130.         delay_us(1);! X8 z8 K! l6 Z' b2 T; s
  131.         LD3320_CS = 1;
    - O! p/ }9 G8 t6 ~" K% T( t" S
  132.         delay_us(1);
    ( p' O' O$ y; ?$ G+ a

  133. # e' D8 D" q) O" e& g# i
  134.         LD3320_A0 = 0;/ }. l3 z5 q# s# n$ v
  135.         delay_us(1);
    8 Z& @1 c# X; O
  136.         LD3320_CS = 0;
    * X* `$ w7 a; p4 d$ Y; \) ~( L
  137.         delay_us(1);) F" H2 H& r  ^, G: C
  138.         LD3320_RD = 0;  {' X$ z+ ~4 ]( ]; y# Q5 Q. d
  139.         LD3320_DATA_IN();
    6 `+ {+ B- a+ u4 m4 L0 n
  140.         delay_us(1);0 V6 p9 X0 K/ ?
  141.         - q( {2 j; ]3 [! a" ~2 p$ z- }
  142.         bita0=LD3320_D0_R;bita1=LD3320_D1_R;bita2=LD3320_D2_R;bita3=LD3320_D3_R;
    0 O8 {' [8 ?, U* F$ W
  143.         bita4=LD3320_D4_R;bita5=LD3320_D5_R; bita6=LD3320_D6_R;bita7=LD3320_D7_R;1 y, B: A- ]0 V1 V' y
  144.         datain= ld3320Data;
    - _6 g$ ?* s7 z' S, V) p' w
  145.           R' _4 o6 {/ x4 i
  146.         LD3320_DATA_OUT();2 I/ S! R5 @% T
  147.         LD3320_RD = 1;0 X6 Z1 y4 V6 Z% n( O2 [6 c
  148.         delay_us(1);* J* ?; m5 t% O; N" M& K" c
  149.         LD3320_CS = 1;; g8 K' n; O2 i+ G2 W6 I2 i! n6 F
  150. ! j( `$ [0 Q. @1 k, s4 x
  151.         return datain;
    6 s  V) T$ T8 ?0 H% K
  152. }& ]; x+ M8 Z, o  }2 s4 M1 H' w
  153. 8 x; p# [. t" h/ a
  154. ) K: q7 _; [+ ^* b( i  w! ^( t
  155. void ld3320_reset()
    ) t$ o8 L3 y$ w$ p0 R
  156. {
    ' n/ ^/ I. b, x' d1 M: ]) [% W9 G
  157.         LD3320_RST=1;( `9 v, ^8 q, a$ }
  158.         delay_ms(1);
    $ l, e4 ^# n1 _- f
  159.         LD3320_RST=0;/ f; c* B# R# r4 h; q* R
  160.         delay_ms(1);0 _1 D; a4 Q, T6 H3 C
  161.         LD3320_RST=1;6 ]* R* d" B# b
  162. 9 Y: o/ N& d* n" g; q1 }; w8 T
  163.         delay_ms(1);
    * b9 @! M+ b" ]1 z# E6 H
  164.         LD3320_CS=0;
    , K3 V: Y% B( W, a
  165.         delay_ms(1);
    & u2 i0 _9 u1 P+ f( I' P
  166.         LD3320_CS=1;# \! E" \" d. Y8 w
  167.         delay_ms(1);% u- \- K6 a8 g7 }  t% g  C' @
  168. }
    + I/ K, L, L& h: a* u
  169. u8 ld3320_check()6 F$ Z! g. X) ?1 b$ E
  170. {
    ; s6 c1 A" S9 j/ s( Z
  171.         u8 a[3];
    7 f5 Q4 v: {4 L6 r
  172.         memset(a,0x00,sizeof(a));4 u; x+ I. ?, J* Y. H% G2 N
  173.         ld3320_reset();
    5 T: n% |8 ~( n# R
  174.         delay_ms(1);
    . k& i$ ]* W- B! x& C1 y
  175.         ld3320_read_reg(0x06);  
    8 x- K) p4 ^" i) i4 k# k
  176.         delay_ms(1);: W1 y, H  `2 O$ g8 [! h) x2 w
  177.         ld3320_write_reg(0x35, 0x33);  0 {/ W$ z6 O' v1 L! J4 @. o
  178.         delay_ms(1);
    % X1 m# S; p. `# L
  179.         ld3320_write_reg(0x1b, 0x55);   
    7 ?$ q  X  s0 O1 t3 a( _% B
  180.         delay_ms(1);
    ; a- l* S  a+ u1 C! @: p
  181.         ld3320_write_reg(0xb3, 0xaa);        
    6 B5 N; q# {8 D+ l& ~, p8 ]0 ?; o
  182.         
    # b* \) g4 H2 v" Q
  183.         a[0]=ld3320_read_reg(0x35);# u6 z/ s- h' c
  184.         delay_ms(5);
      G# x0 o4 p4 S8 V; l# t. h+ N$ `
  185.                 $ `) U' D! I* H2 r& ~
  186.         a[1]=ld3320_read_reg(0x1b);
    . v( G' C2 V( Z% d) S9 Q4 ^; h
  187.         delay_ms(5);
    / Q- I& h6 |$ {) p  s; a
  188.         a[2]=ld3320_read_reg(0xb3);
    7 @$ B( P1 F4 k& O; J9 M! I

  189. * }$ R- p6 O1 [
  190.         if(a[0]!=0x33||a[1]!=0x55||a[2]!=0xaa)5 C( i6 r* Y2 c
  191.                 return 1;- h: Y0 Z; }! t& W
  192.         return 0;4 ]. D' Y% J( E, L" Y; l3 V
  193.         
    1 E6 L) }. U7 B2 I1 f9 P: z/ H, K
  194. }
    ( v4 l3 N9 ?3 k6 r3 u
  195. . B2 c, k: j. @/ h, q, W

  196. 4 P/ U+ r5 Z5 F/ v" }" J
  197. , P5 H4 ?' O, ?* Q2 `1 @
  198. void ld3320_init_common()0 K& W, o& Q' S, o7 o7 F
  199. {  D: ^* y' u1 k) p8 f$ {# E
  200.         bMp3Play = 0;
    ; ?0 v. i, J( m8 s0 C

  201. , B6 Q( x" H# R+ p
  202.         ld3320_read_reg(0x06);  
      e2 ]- Y( j2 O- J
  203.         ld3320_write_reg(0x17, 0x35); & |; T. E- g) h% {( @6 M0 C
  204.         delay_ms(10);
    - b* J, u+ R. }) T
  205.         ld3320_read_reg(0x06);  2 ]/ V; t  X% A1 j
  206. 5 ~$ ~  G9 Y$ d" b9 J
  207.         ld3320_write_reg(0x89, 0x03);  6 P$ I- y( z: d
  208.         delay_ms(5);
    ) @$ r+ h3 \7 w  V& P8 H
  209.         ld3320_write_reg(0xCF, 0x43);   # ]& v6 H1 G4 E" P4 A) z1 c& x8 H
  210.         delay_ms(5);* j9 I" j( r! X2 X5 d6 h
  211.         ld3320_write_reg(0xCB, 0x02);( h6 B7 U  |( Y$ I1 Z; I2 F- T1 e
  212.         
    - E# c) z+ u5 D& y9 Z
  213.         /*PLL setting*/* _: ~8 M4 f1 m
  214.         ld3320_write_reg(0x11, LD_PLL_11);       ! B: o1 I& F- D9 w( C# T" Y% z
  215.         if (nLD_Mode == LD_MODE_MP3)
    # F4 f- P# {# p( f+ T: V9 s
  216.         {6 p' H0 e3 F+ G9 B! k/ q8 F
  217.                 ld3320_write_reg(0x1E, 0x00); ' L  P1 }5 l" P5 s$ L/ D
  218.                 ld3320_write_reg(0x19, LD_PLL_MP3_19);   
    : |0 o" `2 @5 J# N3 W3 R* D
  219.                 ld3320_write_reg(0x1B, LD_PLL_MP3_1B);   
    # g" V, ]; U! @
  220.                 ld3320_write_reg(0x1D, LD_PLL_MP3_1D);" B' L# T& \* ~; g" {  y( e$ U, r) F
  221.         }
    6 {* j9 b; v, ?' f7 }% m
  222.         else0 Y3 p( V" `9 s* P% w" r
  223.         {
    # Y) b# n) j. I  q5 V
  224.                 ld3320_write_reg(0x1E,0x00);
    1 o# R4 j# m- E
  225.                 ld3320_write_reg(0x19, LD_PLL_ASR_19);
    $ Q0 G$ @2 e/ m( D" A* u! W
  226.                 ld3320_write_reg(0x1B, LD_PLL_ASR_1B);                7 X# y$ S. L, @) o* f8 C
  227.             ld3320_write_reg(0x1D, LD_PLL_ASR_1D);
    9 i' r/ c* Z. q- z
  228.         }7 R. e$ D, b; ]2 O, N5 Y9 Y& l& F$ p0 n
  229.         delay_ms(10);
    $ Q" u6 L' s% G" ?. j9 _& ^# Y
  230.         
    8 k) ?2 O. E0 u- L* @( k5 |
  231.         ld3320_write_reg(0xCD, 0x04);8 R6 ~; l& y: Q$ J& Z' s
  232.         ld3320_write_reg(0x17, 0x4c); 0 L+ @7 d& P. |
  233.         delay_ms(5);6 K: S% z$ ^$ ^. l, V" o( l+ Q
  234.         ld3320_write_reg(0xB9, 0x00);, Z; U/ w2 u0 t& Z7 w% O; a: H
  235.         ld3320_write_reg(0xCF, 0x4F);
    " c) u$ u, O* D" v
  236.         ld3320_write_reg(0x6F, 0xFF); 7 ?  o4 ^  r0 a8 K0 d& S/ V9 h# Q
  237. }( E: |; f. a3 _4 ~( `1 `
  238. 7 V8 r- y) e) \3 y6 {
  239. void ld3320_init_mp3()
    3 l; x6 j8 ]6 \0 t- J* |
  240. {
    ' Y0 h% T5 M8 z1 a& w
  241.         nLD_Mode = LD_MODE_MP3;( n/ m# F8 l9 r4 l) P" E
  242.         ld3320_init_common();
    9 H: _3 w8 O& s

  243. . o" I' N8 `# z4 t$ f
  244.         ld3320_write_reg(0xBD,0x02);
    % m+ Z. E; T! R: M4 L0 t$ [
  245.         ld3320_write_reg(0x17, 0x48);9 d% }6 c3 |5 r5 l3 ^3 w- }4 L; z3 q! e
  246.         delay_ms(10);
    % K- S4 M, Y7 p' M0 N' H
  247. 0 H% `  P& R$ X+ A8 I& k3 }
  248.         ld3320_write_reg(0x85, 0x52); 5 x/ d/ x6 T' S
  249.         ld3320_write_reg(0x8F, 0x00);  
    8 y7 _; C- }* Z3 f, ]& T
  250.         ld3320_write_reg(0x81, 0x00);
    7 E6 _  ]* n  Q. V8 ^* g
  251.         ld3320_write_reg(0x83, 0x00);
    ( Q1 @0 @5 J7 D( K5 W# B$ B' a/ p
  252.         ld3320_write_reg(0x8E, 0xff);, h, i# v2 F4 J! }- H' J0 Y1 v
  253.         ld3320_write_reg(0x8D, 0xff);# G- f! u5 O' |% a# F2 f. D
  254.     delay_ms(1);
    & h* s5 b. w3 Z+ P* L
  255.         ld3320_write_reg(0x87, 0xff);
    ! W3 N1 F) D3 o3 n3 ~
  256.         ld3320_write_reg(0x89, 0xff);$ e0 m5 `9 G/ |( E; _3 N) b3 N# j
  257.         delay_ms(1);
    7 \$ [- }/ u3 ^+ S8 _
  258.         ld3320_write_reg(0x22, 0x00);    0 B$ j! b% W' G( E, F* W/ c
  259.         ld3320_write_reg(0x23, 0x00);
    ; I' G' k, q  n
  260.         ld3320_write_reg(0x20, 0xef);   
    $ S# j0 Z# m- u4 D5 z9 N/ G. s- J
  261.         ld3320_write_reg(0x21, 0x07);0 v$ h: q1 \5 W. O6 }" H: N
  262.         ld3320_write_reg(0x24, 0x77);          ; P( q4 K# Y" [6 E  Z% p, O: f% D8 A5 [
  263.     ld3320_write_reg(0x25, 0x03);  Q) w* z3 l( p4 w+ \% J' B' N" R
  264.     ld3320_write_reg(0x26, 0xbb);    7 e* z1 b  O* b
  265.     ld3320_write_reg(0x27, 0x01);
    1 i0 d! e% T8 @6 c
  266. }5 Z# b! J. O2 g# w* X4 |# h
  267. 2 p7 `- A2 k9 p+ c

  268. : U0 Z5 o7 [  t5 u* b* X+ v9 r
  269. & g& N2 X. N: Z. b
  270. void ld3320_init_asr()* O) g; r( V1 Y
  271. {* o+ N% D* u' J5 x
  272.         nLD_Mode=LD_MODE_ASR_RUN;
    ! F( ]! Y" b/ S/ K
  273.         ld3320_init_common();+ C' ]. I) M! m/ G

  274. 1 q: C% q* R  h7 k" J: [7 ~
  275.         ld3320_write_reg(0xBD, 0x00);
    $ i' A+ O2 G4 d- V
  276.         ld3320_write_reg(0x17, 0x48);
    2 \2 j0 O0 N* I- g! H. }
  277.         delay_ms(10);
    ; M1 V5 o* T2 k  L6 k! Q

  278. , z8 G: |3 ]$ N* E8 p' @
  279.         ld3320_write_reg(0x3C, 0x80);   
    9 G! `$ v( b: T6 ]' H7 j( W
  280.         ld3320_write_reg(0x3E, 0x07);1 c# U+ @. S4 u, w
  281.         ld3320_write_reg(0x38, 0xff);    1 e, ]7 Y1 D$ O5 ?( z+ }% C2 D8 v* P
  282.         ld3320_write_reg(0x3A, 0x07);
    " H( k: s% g; `) N. g* m( Q
  283.         
    - l* t/ {5 N% F
  284.         ld3320_write_reg(0x40, 0);          1 m+ T: ^  [, q1 |; w7 m  n3 M
  285.         ld3320_write_reg(0x42, 8);1 o: _* P( q: r! L  ?" t
  286.         ld3320_write_reg(0x44, 0);   
    + b+ F& C+ W3 E* P/ R
  287.         ld3320_write_reg(0x46, 8);
    $ M* H" K: H* d6 F  q4 u
  288.         delay_ms(10);6 y( Y( q. N3 ?, F* e
  289. }2 H  p4 r4 b$ S, v
  290. - u0 I) u, d; f8 G
  291. void ld3320_reload_mp3data()
    ( W% Z( u$ T. e$ Y" A
  292. {
    & X- x* R& Y! C8 k: y
  293.         unsigned long nCurMp3Pos;
    # h/ F! [! N- d: [
  294.         u8 val;/ R0 O+ Z. a8 R4 m; n" z/ i# N
  295.         u8 k;& S! {$ J$ |# G+ f# U% ]
  296.   E) k$ N+ d* R8 u  _
  297.         nCurMp3Pos = nMp3StartPos + nMp3Pos;
    & T& g8 M2 R% ?' g9 y: t1 b8 C
  298. ) ]0 i: [0 B) i; c9 D* H
  299.         ucStatus = ld3320_read_reg(0x06);% q& u; F- w/ d; ~* N7 k  j) k, i
  300.         while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )
    7 P. a; ?. `, z! V. B5 g
  301.         {
    % w8 k6 U/ w0 Q& K2 B3 p  N" t, s) l
  302.                 val=0;
    9 I) ~8 z, B' \0 o
  303.                 for(k=0;k<8;k++)
    8 m3 W$ b! ^, s
  304.                 {
    ) W! S# E/ @3 Q! k, Y
  305.                 }
    ) l& C6 C$ {! u- ]2 c9 i7 c) z1 C
  306.                 ld3320_write_reg(0x01,val);
    % Y+ e" \' e. F- w; Y
  307. 1 q: K3 l$ B7 W- E
  308.                 nMp3Pos++;
    # D  v5 l* _$ Y* b: U- K

  309. 3 L8 Z7 o) y' ?1 w" L+ d
  310.                 ucStatus = ld3320_read_reg(0x06);5 D2 [: _& z1 M- u
  311.         }
    3 `: b8 Q+ a& d3 ?  H; Z
  312. }
      Q" k2 e* A! k6 `! G$ s) n
  313. : G% T' n! {. d4 L2 p! _
  314. $ b2 F, o: g) j/ |( Q
  315. void ld3320_reload_mp3data_2()3 B5 w& N2 Q5 T1 T
  316. {
    7 }7 V3 D' t  ?( M- Q, J) g! s6 Z
  317.         unsigned long nCurMp3Pos;
    / s  E0 `- ~. |
  318.         u8 val;6 }3 G8 h5 Y! T" r8 {
  319.         u8 k;6 ~# \; ~  {* z/ W8 w0 x- z7 g

  320. + ?0 o6 U+ e5 A8 h% n
  321.         nCurMp3Pos = nMp3StartPos + nMp3Pos;: Z0 o# \/ U1 e9 i- B* E
  322. 7 h; `8 S! T, J+ y! q$ o

  323. - R3 y6 z1 ]( m) r2 |' j. a
  324.         //读取音乐文件写入( m/ {2 o5 Z5 j* h& `4 R/ {1 ?
  325.         0 t. Q$ g" r% I8 c9 E
  326.         & J1 e2 I4 H; Q# Z% E/ n1 C  z
  327. 7 x* o! n+ }& Z, Y9 j% ?/ @
  328.         ucStatus = ld3320_read_reg(0x06);
    - F4 _& J9 |& L- r' |" C: P
  329.         while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )
    ) l' c+ D9 W0 g8 [# K, w) {, P9 M7 l) B7 Y
  330.         {$ T- w3 y# _1 J/ s
  331.                 val=0;/ f3 v  u7 Q" d1 C" v
  332. # G& k- v. s, O2 c

  333. 5 m- O3 j" T& e8 H
  334.                 nMp3Pos++;
    . r9 U5 |, L+ T2 N

  335. & L7 u! Q' ^" _0 q# T
  336.                 ucStatus = ld3320_read_reg(0x06);0 W8 I, X& P  \
  337.         }
    0 D/ M; O: t% l! k+ o* P' C
  338. }; |! {! I, G5 J" U
  339. & r% P0 y9 @) Y
  340. 0 J$ r; N. d: Q

  341. 3 c6 F+ Y2 o0 R- K8 j- z) ?% b

  342. ; L1 K% U0 J) e' U
  343. void ld3320_process_init()
    + U! c% T; ], d' P. q" c" _
  344. {  W% ]7 M0 ^- @: Z' @* J& r
  345.         u8 nAsrResCount=0;) V; a  A: h, H% r# f# O* e
  346.         , A1 q# n9 |) \' I$ g! W" N
  347.         ucRegVal = ld3320_read_reg(0x2B);% u- U/ q9 O& N  t/ j
  348.         if(nLD_Mode == LD_MODE_ASR_RUN)  s& x' D! G/ b" Y% ^# f2 `
  349.         {% S. T) a2 ~  v+ W: s: X4 X
  350.                 // 语音识别产生的中断
    7 r7 ^9 V4 {; }
  351.                 // (有声音输入,不论识别成功或失败都有中断)
    . f3 N# ?4 M3 g( e9 f; S
  352.                 ld3320_write_reg(0x29,0) ;
    5 }7 [1 b% w8 M" b
  353.                 ld3320_write_reg(0x02,0) ;4 f' l. I, v+ ~" g8 u6 i
  354.                 if((ucRegVal & 0x10) &&
    $ `& g6 D$ W4 ~0 _  `0 Y
  355.                         ld3320_read_reg(0xb2)==0x21 && ' M: c4 ?7 N: w, u
  356.                         ld3320_read_reg(0xbf)==0x35)
    5 R2 t- U% l5 V
  357.                 {1 l. w4 K9 Z$ Y
  358.                         nAsrResCount = ld3320_read_reg(0xba);. i( }* A1 q  e
  359.                         if(nAsrResCount>0 && nAsrResCount<=4)
    # x. T8 y2 R0 L5 d
  360.                         {' U2 ^" b5 Q( \( o  Z
  361.                                 nAsrStatus=LD_ASR_FOUNDOK;
    " w( c6 J* {: l- l/ E9 L
  362.                         }
    ! k5 d/ k. c# G
  363.                         else
    / _* ]" [; p% H& h0 @. W4 w
  364.                     {
    6 R0 G7 N; Y; r1 Y  [6 ^; {
  365.                                 nAsrStatus=LD_ASR_FOUNDZERO;: \! @0 s7 D( D/ z1 m1 y
  366.                         }        
    7 f/ d/ r& f) W
  367.                 }
    9 R" {$ h  A. }, k6 S' d/ M/ B/ G
  368.                 else/ b9 P1 G7 D8 B/ }/ N
  369.                 {
    ; C/ |7 a) f+ H. o6 E: q
  370.                         nAsrStatus=LD_ASR_FOUNDZERO;
    , \# z# Y5 @0 t! m! {2 j7 o3 N, b
  371.                 }
    4 l' M4 U$ N  F- F* b
  372.                         
    9 M+ E: b# E# H; b, O/ ^
  373.                 ld3320_write_reg(0x2b, 0);
    5 O) B3 @% _  I8 p& ?% j* ?
  374.             ld3320_write_reg(0x1C,0);, h$ h9 @9 {) P" r, R
  375.                 return;5 _9 t9 u: s6 Z. k( N
  376.         }# O7 e3 g2 ?* A# C
  377.         % D8 V: F7 K9 q' w2 Y; B
  378.         // 声音播放产生的中断,有三种:" e) n; u, j! v
  379.         // A. 声音数据已全部播放完。# U) _5 F5 B" J' r  y- P2 t  [
  380.         // B. 声音数据已发送完毕。; R5 A1 n" Z" T0 y" y
  381.         // C. 声音数据暂时将要用完,需要放入新的数据。        
    ) a9 X0 ~  N- f3 C* h+ D
  382.         ucHighInt = ld3320_read_reg(0x29);
    $ c+ }* x3 c- p+ h" j- y6 |
  383.         ucLowInt=ld3320_read_reg(0x02); - h, w+ {1 Y9 B6 S# G; N
  384.         ld3320_write_reg(0x29,0) ;
    ( G  x- z% f% u4 c2 B) t: ?
  385.         ld3320_write_reg(0x02,0) ;- r* C5 q! z  j2 ]+ m* u. x
  386.     if(ld3320_read_reg(0xBA)&CAUSE_MP3_SONG_END)8 Z, e% n. h4 u+ k* m/ |1 ?6 j6 r
  387.     {
    1 o. B  m2 H; N+ B9 N$ k" Z" p4 Y
  388.         // A. 声音数据已全部播放完。9 Q8 F9 v  H/ i( W3 p& A4 j* d
  389. 8 J+ f# v( [) d0 q0 \. v
  390.                 ld3320_write_reg(0x2B,  0);
    , p1 e/ |& l8 O# r( @; K/ @
  391.               ld3320_write_reg(0xBA, 0);        1 _' d$ F- K8 z) d; {$ Z
  392.                 ld3320_write_reg(0xBC,0x0);        + ^* h$ h* l- F1 A0 ^& m
  393.                 bMp3Play=0;                                        // 声音数据全部播放完后,修改bMp3Play的变量" a0 I& o9 b9 c. Y% ^3 O: R
  394.                 ld3320_write_reg(0x08,1);$ ]. [" Z4 i8 r- f: ?; m
  395.                 delay_ms(5);
    8 z) x1 h+ A0 @  i6 L: L( G* A
  396.               ld3320_write_reg(0x08,0);
    . f/ Q3 l: H2 B+ h5 l2 M
  397.                 ld3320_write_reg(0x33, 0);% B$ {# Y; E# w- g% i: s

  398. 3 e9 L) r, |" j
  399.                 return ;, a$ F% [0 T- v7 e' b/ d1 `- f+ H
  400.      }
    $ Y" v# ]) N1 w% N, {% T
  401. 7 H4 v: h& E; H. M; c! B
  402.          if(nMp3Pos>=nMp3Size)0 g( r7 _5 O3 i# H, j5 @
  403.         {: |. M6 {3 i9 S' H4 ~" D! W, r/ R1 R
  404.         // B. 声音数据已发送完毕。
    : P( l4 M7 e& E) `
  405. ' G# c) d: d1 W2 B: Z5 M% T7 I8 t
  406.                 ld3320_write_reg(0xBC, 0x01);
    9 h( S6 n. N2 y& D) o$ v) Y
  407.                 ld3320_write_reg(0x29, 0x10);
    : G/ A% Z/ n1 `, ]3 P
  408. //                bMp3Play=0;                                //        此时,只是主控MCU把所有MP3数据发送到LD3320芯片内,但是还没有把送入的数据全部播放完毕. Y' k& s, C) t, @
  409.                 return;        5 X6 L+ F6 n) h7 q0 l1 I; r8 S8 J' J
  410.         }
    9 c6 S' r9 c; f) y: d; x1 e

  411. / C+ x! P5 {; E) g7 Y
  412.         // C. 声音数据暂时将要用完,需要放入新的数据。        ' \! b- `8 r' Z
  413. 4 D. ]2 k8 B6 A/ y- f0 W* b
  414.         ld3320_reload_mp3data_2();
    ' z# ~9 p+ U- X6 F2 M0 {$ V
  415.                 3 e7 O7 Q2 }* `/ y( N9 h5 y
  416.         ld3320_write_reg(0x29,ucHighInt);
    # T6 s9 e  i( y& A9 x( y
  417.         ld3320_write_reg(0x02,ucLowInt) ;
    0 s1 p" a5 B" k0 d
  418. }: e; S% \, k# k/ ?
  419. void ld3320_play()4 z; e+ k: f4 {, Z% z1 R  h0 S
  420. {
    ) S+ P! n, N+ q9 {
  421.         nMp3Pos=0;
    5 c5 l9 J3 w  q3 O
  422.         bMp3Play=1;6 Y) ?' M) z- B1 E( r
  423. 6 p. Z  T! f; W" o5 u/ W6 b# k
  424.         if (nMp3Pos >=  nMp3Size)/ z) z0 L  o! F: x; [: M
  425.                 return ; $ ~$ T% R  z0 C2 G

  426. : @, q  V! o3 Y1 D/ l) s1 T
  427.         ld3320_reload_mp3data();7 J2 `7 O# x* I# Y1 e0 z

  428. * f! V' i& j; K# K$ z  w: V! s
  429.     ld3320_write_reg(0xBA, 0x00);: G$ M: L4 K  H. I5 Z  d) u
  430.         ld3320_write_reg(0x17, 0x48);
    " p6 X  \. _3 w/ u) p
  431.         ld3320_write_reg(0x33, 0x01);: J; C& H) z4 f% c- _" k
  432.         ld3320_write_reg(0x29, 0x04);( R: e6 N- k, v7 Z
  433.         
    . M8 c* S9 ~: p. F1 U* I; H
  434.         ld3320_write_reg(0x02, 0x01);
    3 ~7 K" R2 f4 f; i
  435.         ld3320_write_reg(0x85, 0x5A);
    4 V- ~, W' H5 n, N
  436. }
    / v+ z3 z" c* G+ i4 H

  437. 6 @1 |, m. i; m. f" I  O: t) P* a( m
  438. void ld3320_adjust_volume(u8 val)! @4 W* w  E2 @
  439. {* o7 M& r) `7 F. k. Q- s* Z) t  I# q
  440.         ucSPVol = val;0 A/ l- P$ r& c: {. C- U4 n' B7 c
  441.         val = ((15-val)&0x0f) << 2;; T+ c5 F$ d8 Z, m- C
  442.         ld3320_write_reg(0x8E, val | 0xc3); 2 v0 o$ G* K1 j. W) h
  443.         ld3320_write_reg(0x87, 0x78);
    2 ~4 W1 M8 n; Y& o5 D! Y" G
  444. }
    * A. Q+ _' Y  o8 l: C  j! G: @
  445. // Return 1: success.+ w) S5 F9 @- _9 L6 _
  446. u8 ld3320_check_asrbusyflag_b2()
    $ c" z4 D0 @4 l( Q* W
  447. {, r* {9 u) e4 J& z. Y2 G7 S
  448.         u8 j;2 p( u6 o8 n+ C; n$ U6 T8 B& U
  449.         u8 flag = 0;
    1 u, P$ D& F. x3 X/ d$ H! k4 g9 T
  450.         for (j=0; j<10; j++)
      m, H5 W% J9 D8 c* [# {
  451.         {3 d. w5 D* c( S+ y- l# R, F
  452.                 if (ld3320_read_reg(0xb2) == 0x21)+ W5 J3 f5 V/ U2 v$ e
  453.                 {" ?+ U! L2 |- j) B: U- S: O5 _" a
  454.                         flag = 1;
    2 S& K* r" h  w2 i- X) [9 |  X
  455.                         break;
    ; {4 K+ v+ w( |: J3 B/ Y3 K
  456.                 }
    $ C4 X- E8 y1 j& ^# l* k
  457.                 delay_ms(10);               
    ) j1 J7 y, N- L, U1 O+ E
  458.         }
    . ~4 n$ `* q2 ?  @. W( y& U
  459.         return flag;( Q& q) p3 X9 S' {9 f* A7 m' g
  460. }
    7 k7 A, o! F6 x' V  |6 z

  461. 9 X$ Q' Z; H# T4 R8 @' D0 d; n0 n- C
  462. void LD_AsrStart()
    3 Y; a6 n  e0 Y9 l
  463. {
    & s# V  E& U3 x' s; [( ~- k+ i
  464.         ld3320_init_asr();+ k% Y" K' W3 S# }! `$ z
  465. }  Y' h  b" H  M/ e! Q' B+ X

  466. 6 Z5 r3 l3 s* W+ V
  467. // Return 1: success.
    $ s5 H- L' I# d& O; i, P7 S- ]% k
  468. u8 ld3320_asrun()
    8 o3 V: \4 @0 G8 [7 z) ^, V) |: f( O$ ^
  469. {) Y$ @  d: [) b) Y5 p/ K+ {6 q' Y1 h
  470.         ld3320_write_reg(0x35, MIC_VOL);# ?: x3 N1 s9 X* @( W: h' F1 u* Q
  471.         ld3320_write_reg(0x1C, 0x09);
    ! f, }% r7 _3 w1 c% e+ ]- H; y1 _
  472.         ld3320_write_reg(0xBD, 0x20);
    : D. \, _1 @7 V% X9 i8 ]: m/ T
  473.         ld3320_write_reg(0x08, 0x01);3 n& E( F4 Z. W) p: t$ I
  474.         delay_ms( 1 );
    ' i' l( K9 Z- h' K0 [. W3 V8 s' N
  475.         ld3320_write_reg(0x08, 0x00);4 }0 N! W' `; _! d; @4 w* _, ^
  476.         delay_ms( 1 );# z3 b  k  M6 Y8 d* v& O

  477. + w5 W5 p. D" {; x; T, d
  478.         if(ld3320_check_asrbusyflag_b2() == 0)
    2 B! p4 G+ R- c' |' t" q" J8 z
  479.         {2 ~/ d. J5 J. d/ S: `  k
  480.                 return 0;
    . v/ {9 ?( N! C: u! n5 C
  481.         }# Z, E( h5 _" L4 ]8 N6 @
  482. 9 j9 ]" F7 Q# W+ R
  483.         ld3320_write_reg(0xB2, 0xff);        
    % M+ Q$ x, h' ^/ T! L! A' z4 K
  484.         ld3320_write_reg(0x37, 0x06);/ x" ]6 K$ a+ C/ i' c
  485.         delay_ms( 10 );
    0 C/ v2 R4 V  T2 }4 Y: W+ h
  486.         ld3320_write_reg(0x1C, 0x0b);
    / u+ o# T2 j3 _, S- v- V
  487.         ld3320_write_reg(0x29, 0x10);
    ( p4 ^, c# R+ o, Q5 y+ h2 {  ^
  488.         ' p7 V+ x; R$ w# H7 w3 ^1 g2 _
  489.         ld3320_write_reg(0xBD, 0x00);1 B7 n9 n8 H9 i4 u
  490.         return 1;
    ) X) q% }: g8 J6 G4 E0 a
  491. }  B% i; Y& K0 l+ D0 J+ r
  492. # `' i2 v# x) {6 V
  493. // Return 1: success.
    # r+ Z$ Z8 X2 V+ D$ r: C/ p
  494. //        添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法; D+ I; F; m& Y8 L2 B
  495. u8 ld3320_asr_addFixed()
    6 L' V1 r% E: ]7 r& P8 i- O8 B3 ~+ j
  496. {% {* D' {$ i, `* f7 ]) b
  497.         u8 k, flag;' A" `) l$ H; j1 d$ l2 V! o7 m/ R. E
  498.         u8 nAsrAddLength;) }0 v: K3 O+ x
  499.         const char sRecog[24][30] = {"xiao hui hui",1 X' [; Z3 S4 r2 T6 h  E; q" s
  500.                                                                 "ni you xi fu mei",
    % k- K, ^2 R! k* X
  501.                                                                 "jiang ge gu shi",4 U* ]# T" U5 p- Y9 _
  502.                                                                 "ni shi bu shi dan teng",! h7 z2 s$ u8 d  I: T) X! w
  503.                                                                 "ni ban ben hao duo shao",$ x" q9 T4 K% [6 r5 Z. h6 W6 W
  504.                                                                 "jin tian duo shao hao",
    6 Y9 Z0 ]' {" N2 f2 `# Y6 D
  505.                                                                 "jin tian ji hao le",
    ! I* }6 a0 E3 T7 E& R
  506.                                                                 "xian zai ji dian le",
    0 u0 V/ t2 H+ T# D# q
  507.                                                                 "jin nian ji sui le",  @" e, I# Y( n! ^: K( T
  508.                                                                 "ni sheng wa le mei",
    1 s6 O: g, \6 ^# i/ I2 g
  509.                                                                 "da kai ji dian qi yi",
    ; w( O4 S0 y9 c3 L
  510.                                                                 "da kai ji dian qi er",8 P4 T% Y0 X4 J$ O. P  D- ?
  511.                                                                 "guan bi ji dian qi yi"," m; T+ E* f$ [
  512.                                                                 "guan bi ji dian qi er",  ]) M$ @& i2 k7 t/ m, u
  513.                                                                 "da kai suo you ji dian qi",4 }3 W' \" E6 y' k0 t0 C% K1 l5 v
  514.                                                                 "guan bi suo you ji dian qi",  U4 m( ^- F  s3 A3 v
  515.                                                                 "tiao gao yin liang",8 ~& f/ a6 Z6 Y5 k# b* Y
  516.                                                                 "zeng jia tin liang",
    3 `  H0 \  N1 W0 b2 ], m
  517.                                                                 "tiao xiao yin liang",) f3 v$ G  N) f& a& I- c' P( P
  518.                                                                 "jiang di yin lliang",: n4 [2 T6 b% K* i. I
  519.                                                                 "tiao gao yu su",' ~, w8 S" ?0 N4 R' ]: Z9 n1 Q; c
  520.                                                                 "zeng jia yu su",1 X( L: I: O. ]/ c
  521.                                                                 "tiao xiao yu su",
    , f. @) a% I  j/ u; b: A
  522.                                                                 "jiang di yu su",; ^, t, U% L9 p5 D
  523.                                                                 };# M0 b) v/ \# g; u$ o2 M
  524.         const Order pCode[24] = {
    , M6 m# l, S/ m4 {1 e
  525.                                                         name,/ e! y% ]0 i5 k! j) y4 B
  526.                                                         wife,1 V, B( e0 g! r4 d4 y% E
  527.                                                         speakStore," j7 ]' {" J; C& Z( z: A
  528.                                                         eggPain,$ N0 A( F2 R0 H1 ~0 Q0 ]# Y6 U
  529.                                                         visionNum,
    / U2 Y6 y( z" o0 A7 W% [8 o" Y
  530.                                                         todayDate,
    " v, u. J/ t# R" x* U# n: B
  531.                                                         whyToday,
    4 l0 M0 J9 G9 R& i( E5 j
  532.                                                         whatTime,
    ( D3 A6 N! I( J3 E
  533.                                                         howOld,
    / g( |, e3 e2 k# r$ G4 J# V
  534.                                                         haveChild,# W( d1 G4 h+ h& q, E% l6 g0 C
  535.                                                         openRelayOne,
    " O) Z4 ^  I$ W& a" p* C
  536.                                                         openRelayTwo,
    $ \8 D) i; A+ t1 p
  537.                                                         closeRelayOne,8 ]8 Q* T* @: H& W9 }5 j! |
  538.                                                         closeRelayTwo,& p7 h. Y: `# N& R
  539.                                                         openRelay,6 B) I1 w0 U7 G7 t4 |: X
  540.                                                         closeRelay,
    6 E5 t, U2 U  x8 g4 \. s
  541.                                                         upVolume,5 i/ c$ o' f; E- P2 o
  542.                                                         upVolume,2 Q* @7 V2 Z  k$ b9 w; K2 ~
  543.                                                         downVolume,0 I0 ~3 a( i% Z
  544.                                                         downVolume,
    7 u6 l/ c; \8 r; b# r
  545.                                                         upSpeed,) g! W$ V1 X  T
  546.                                                         upSpeed,1 o6 X5 b* Y- U: h! P3 X
  547.                                                         downSpeed,1 [' q: O: E8 t' @. S/ k6 @
  548.                                                         downSpeed,$ t( Q8 P2 m3 v4 k0 b
  549.                                                         };
    - e/ ^8 B6 S1 p# P- K
  550.                 3 z& C7 ^2 E/ |! [/ g8 o9 y" [1 o8 q
  551.         flag = 1;  Q$ \+ ~, ^+ Y1 L7 |( r% n
  552.         for (k=0; k<24; k++)
    ) F- A4 I5 t( q9 q
  553.         {
    " T) @' Z6 j1 l: o, g- H/ s
  554.                         0 V6 x' h! g3 u
  555.                 if(ld3320_check_asrbusyflag_b2() == 0)
    / H$ I: Z9 S! ?8 o6 o8 v" X
  556.                 {+ D) \' Z' @: A7 Z
  557.                         flag = 0;8 B3 B; Z; F3 b8 o. o6 N
  558.                         break;
    * E$ A% Q$ B- b, v2 K5 C8 i
  559.                 }
    / `6 y9 `" n4 s8 ^" z8 O7 w( {
  560.                
    ; r1 [/ Y0 E  i! w
  561.                 ld3320_write_reg(0xc1, pCode[k] );& R( e( {6 Z- v' r$ W
  562.                 ld3320_write_reg(0xc3, 0 );, X8 a- j9 i' s3 q, F
  563.                 ld3320_write_reg(0x08, 0x04);
    & x9 d# {1 y" J. O- [2 l, C
  564.                 delay_ms(1);
    % r7 t' a+ v/ V, k" I. T/ B
  565.                 ld3320_write_reg(0x08, 0x00);8 f( w3 p9 W1 t6 }3 z  Y! S% _0 Z
  566.                 delay_ms(1);
    ; Q  U. U  f* ^

  567. ( o1 _# _1 f4 }- I" v( @8 y2 ^& w: t& Q5 V
  568.                 for (nAsrAddLength=0; nAsrAddLength<30; nAsrAddLength++)
    ) v# U) ?+ d2 Y: o( J
  569.                 {# }, J1 i. Z+ O5 ]
  570.                         if (sRecog[k][nAsrAddLength] == 0)7 i- D; j0 W3 M0 h
  571.                                 break;
    + W6 U* ^/ X% k' X" g" c9 C
  572.                         ld3320_write_reg(0x5, sRecog[k][nAsrAddLength]);
    6 T2 }. _2 i  ~9 W/ a" k; \, q, _
  573.                 }6 \% H- l7 z" l) Q) r
  574.                 ld3320_write_reg(0xb9, nAsrAddLength);
    ( {$ K& ?# \: s) G3 M: |
  575.                 ld3320_write_reg(0xb2, 0xff);
    2 P- [" M/ }2 b
  576.                 ld3320_write_reg(0x37, 0x04);* |% x0 I' G- H, F$ N- r5 |+ h* i. N
  577.         }
    ' ]3 i8 q  k! r4 Z% g+ J
  578.     return flag;
    ; z9 x  R9 c% H' f1 Q
  579. }
    ! G4 U8 H# k  V1 B5 O5 k

  580. 6 d& g8 M! j8 Q! q1 _. S1 ]
  581. ) d  ~/ f7 F- U6 u
  582. u8 ld3320_get_result()
    ( ~5 k; ?) X+ e/ O& n% G
  583. {
    0 k# Y4 J( ]0 H
  584.         return ld3320_read_reg(0xc5 );& V& f# P! K6 V" Q! j% a) e8 H( [
  585. }+ U, v8 j+ Q$ z
  586. & N( K6 v& ?" i
  587. /************************************************************************************/
    + y' @; q* e# Z1 x7 q* I  e4 i
  588. //        RunASR()函数实现了一次完整的ASR语音识别流程
    - t4 o1 B4 P. G0 e* s8 F
  589. //        LD_AsrStart() 函数实现了ASR初始化  H! v4 W9 J5 Z
  590. //        LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中
    3 Q" E. s- u1 a
  591. //        LD_AsrRun()        函数启动了一次ASR语音识别流程1 V4 J3 F( _' F7 d
  592. //
    8 l3 r& ?9 g. Y1 {( {) u
  593. //        任何一次ASR识别流程,都需要按照这个顺序,从初始化开始进行
    3 @/ }" j# ]( }$ y
  594. /************************************************************************************/
    9 u5 @! T( p& n

  595. ; t! J% Y* N& H2 r6 y3 M1 y# d
  596. u8 ld3320_run_asr()6 e! d$ Y( H& b
  597. {, M; X4 q& H8 z8 ^+ b+ A8 x
  598.         u8 i=0;$ |% Z; c  g9 d: K; P; s7 b) p
  599.         u8 asrflag=0;, {# }" ]5 d. L9 n0 X
  600.         for (i=0; i<5; i++)                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
    - ~$ q5 o: ^: P! B
  601.         {
      [5 i$ A, q. p' G$ {
  602.                 LD_AsrStart();
    ! X9 ~- \5 z% c
  603.                 delay_ms(10);* p$ ?. z+ O; `1 S/ f
  604.                 if (ld3320_asr_addFixed()==0)
    & ?! \1 p; L5 {7 V
  605.                 {
    9 m! m6 w' D' @  b: p9 ]) P- K. n
  606.                         ld3320_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片1 |  u4 b7 K) N: [2 |. l) T$ C
  607.                         delay_ms(100);                        //        并从初始化开始重新ASR识别流程
    % `4 m" a; g& |( Y
  608.                         continue;
    9 u2 I! A, @$ e  N* B, `; C9 ?
  609.                 }
    5 b9 i( e) ?' O4 O
  610.                 delay_ms(300);
    & z3 o/ a6 T: _& d
  611.                 if (ld3320_asrun() == 0)- M- `! F- e9 `/ c" g
  612.                 {
    ( b% s/ @! F- p$ _: y, I' ~/ i8 W/ {1 a
  613.                         ld3320_reset();                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
    9 m4 P* i5 c: v" |9 w0 n! \
  614.                         delay_ms(100);                        //        并从初始化开始重新ASR识别流程' {" n3 D) n: G9 s' C
  615.                         continue;
    : o! X# X4 Q& ?
  616.                 }
    & ]1 ]( l) n, y
  617. # N8 h5 x9 F9 ]
  618.                 asrflag=1;( \/ Y' J- X1 z. n( r' l# r' `2 z
  619.                 break;                                        //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
    ! g% F$ x1 [( a" D, ^/ f- t
  620.         }8 [/ k0 q4 X6 m% Z
  621. ! m  [9 V3 M2 ?9 ~
  622.         return asrflag;
      i2 s4 |* k& c/ v: Y1 J4 X
  623. }4 Q- K, K5 U2 J' Z+ C& c

  624. ) {2 |# _* a3 v! C
复制代码
# e5 E6 n; d7 G" A% N# U/ T! c
LD3320.h
4 ~! i& e7 m$ _4 z( E; |% y: S
; O* Q* F2 d3 Z- y' S$ g5 h
  1. #ifndef __LD3320_H
    3 g  t. e) Z2 F: S5 Q5 F- X
  2. #define __LD3320_H
    # C1 x0 h( a) {( l& z
  3. #include "sys.h"" \/ m- r$ j- j0 q" s8 k

  4. 2 N% Q( l# z$ `. \! a1 E
  5. typedef struct6 A+ h6 h0 @" c- v
  6. {
    6 H8 @; T( ^; J3 V' e0 G, E
  7.     unsigned char  b0:1;
    , |& U, @/ x6 Z9 @% x- a
  8.     unsigned char  b1:1;
    6 w$ g& ?4 \2 `( i. n: q
  9.     unsigned char  b2:1;
    0 m1 @( L- o; e! s" x
  10.     unsigned char  b3:1;
    5 r. T" a# z1 k6 o, F
  11.     unsigned char  b4:1;
    ! T# V0 i, m' e5 P
  12.     unsigned char  b5:1;
    1 G6 [& a9 n! U6 C9 @! p
  13.     unsigned char  b6:1;
    2 h3 h0 w+ V. T% z7 a
  14.     unsigned char  b7:1;* D* G7 c! h" ?
  15. } BIT8;# n- X* \2 k2 a# Z3 S

  16. 9 G# N& b$ V' W& t7 a3 b
  17. extern u8 ld3320Data;
    - h" `9 M& {+ G" D
  18. #define     bita0               (((BIT8*) & ld3320Data) -> b0)) e/ k! Q, ]+ A9 U
  19. #define     bita1               (((BIT8*) & ld3320Data) -> b1)
    $ b( ?) `8 {( K3 [
  20. #define     bita2               (((BIT8*) & ld3320Data) -> b2)2 h7 o- Z  |+ t
  21. #define     bita3               (((BIT8*) & ld3320Data) -> b3)
    8 r- u; @% H  m5 j, T
  22. #define     bita4               (((BIT8*) & ld3320Data) -> b4)
    0 a& }- G3 y4 {# d7 _
  23. #define     bita5               (((BIT8*) & ld3320Data) -> b5)3 u# M1 G/ Q5 Y! j2 b. A
  24. #define     bita6               (((BIT8*) & ld3320Data) -> b6)
    : W! S" o3 ]) [; t8 ]8 {/ V
  25. #define     bita7               (((BIT8*) & ld3320Data) -> b7)3 ?' U6 N( v. a' u) K+ W

  26. * @) h6 g# g" Z; o* O
  27. / \% |' S+ G: N5 P. a" z! e( R
  28. 1 n; v4 i6 E3 e9 Z) L6 p  X' J
  29. 0 \/ R% V7 w7 \- A
  30. #define LD3320_A0   PBout(15)
    7 f. o$ t0 V* D
  31. #define LD3320_RD   PBout(14)3 r8 R" V8 C6 `
  32. #define LD3320_WR   PAout(12)/ G( ?7 M" y9 C/ G. z9 ?
  33. #define LD3320_CS   PAout(11). _' q# r% T' E+ N( R) X/ c
  34. #define LD3320_RST  PBout(10)
    8 K  K: I. b( G% u1 S
  35. #define LD3320_MD   PBout(13)
    " a+ y2 K  I# H! |$ [
  36.                
    ( e8 u& @% d! @3 L* k2 d3 u
  37. #define LD3320_D0 PBout(5)
    / D. f8 \' l: N1 n( s  v( R
  38. #define LD3320_D1 PBout(4)7 _& Y0 f6 D. `# ^
  39. #define LD3320_D2 PBout(3), k' _: }0 W, d0 N$ p
  40. #define LD3320_D3 PAout(15)
    ' D9 u, E2 p! T! j$ ~7 X. O
  41. #define LD3320_D4 PBout(9)
    ) n) J  @( t# Z: _, H& F- e
  42. #define LD3320_D5 PBout(8)8 \' G& h/ v2 u' ~4 A. u' e
  43. #define LD3320_D6 PBout(7), p; y& ?0 A4 v
  44. #define LD3320_D7 PBout(6)* Y) g9 W2 s0 S2 \

  45. % T  A/ A- ^# i) t
  46. #define LD3320_D0_R PBin(5)& f5 @) V8 ^6 }1 _3 ]- E0 m$ e7 v0 h
  47. #define LD3320_D1_R PBin(4)
    3 f: Y" O4 B; Y3 |- d7 k% l
  48. #define LD3320_D2_R PBin(3)
    ' B' ~( {. k+ P( R0 X" w8 O
  49. #define LD3320_D3_R PAin(15)
    : U; l, o3 X) J9 y# l5 s2 |7 ]
  50. #define LD3320_D4_R PBin(9)3 C: i2 [$ |- w
  51. #define LD3320_D5_R PBin(8)
    % p6 ], q' `$ U( j
  52. #define LD3320_D6_R PBin(7)6 Z9 }0 U6 U5 X; r/ i6 P% N
  53. #define LD3320_D7_R PBin(6)
    + p/ D$ r; J' T# A

  54. 7 t1 H; q8 u! ?$ S) v. ]  n2 k; a7 P

  55. 3 J/ ^; y$ @- |' G& [
  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;}
    ! Y3 g; K5 |, t4 d
  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;}8 c) k/ o* [$ S: g. h; A
  58. ; N9 Y" Z8 I1 \; g
  59. $ n$ q( C9 W6 J4 U
  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;}0 V2 ^  N/ }7 b. y/ u9 w
  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;}9 R; y& ^4 x* g

  62. 3 v$ U  f2 ~* n: P; L: l6 g
  63.         2 a5 L" m% f/ [2 H+ @3 {0 g) V
  64.         $ U. J8 {, q% g2 Y0 ]" |6 W
  65. //        以下三个状态定义用来记录程序是在运行ASR识别还是在运行MP3播放. \3 B. n' n5 t: ?5 n3 j) Z2 `
  66. #define LD_MODE_IDLE                0x00" g2 P$ S; h+ r" n  [
  67. #define LD_MODE_ASR_RUN                0x08
    + E# P8 k# }7 K3 G8 W( k+ q% z
  68. #define LD_MODE_MP3                         0x40
    . G$ O  T# L8 F8 I8 J) }3 t; h
  69. : }5 D' o" L0 L9 y, {$ |
  70. ( g' D8 R4 \2 P
  71. //        以下五个状态定义用来记录程序是在运行ASR识别过程中的哪个状态  H6 n% A4 y. L5 P' S. [& h: c% _
  72. #define LD_ASR_NONE                                0x00        //        表示没有在作ASR识别9 P5 Z4 g  E' t3 _; _3 h
  73. #define LD_ASR_RUNING                        0x01        //        表示LD3320正在作ASR识别中
    & {" U% z2 s% q) n/ S
  74. #define LD_ASR_FOUNDOK                        0x10        //        表示一次识别流程结束后,有一个识别结果0 M$ M* |) F9 Y$ f" I9 m% Q/ e
  75. #define LD_ASR_FOUNDZERO                 0x11        //        表示一次识别流程结束后,没有识别结果
      n- ^9 t( Z4 }/ {/ C
  76. #define LD_ASR_ERROR                         0x31        //        表示一次识别流程中LD3320芯片内部出现不正确的状态/ P: y+ G. ^, ~$ _+ m7 o. j
  77. 8 k0 [! T/ b" Z% V+ A

  78. 0 `, d& u" H5 N) \0 a. b" w3 ^
  79. #define CLK_IN                       8        /* user need modify this value according to clock in */2 A' T! A6 D# C
  80. #define LD_PLL_11                        (u8)((CLK_IN/2.0)-1)' w" \$ r8 O! h+ T! [2 p
  81. #define LD_PLL_MP3_19                0x0f
    ! B9 U  G; r) ~% x
  82. #define LD_PLL_MP3_1B                0x18& \8 T/ D/ q- d. d. L* N3 @9 e
  83. #define LD_PLL_MP3_1D           (u8)(((90.0*((LD_PLL_11)+1))/(CLK_IN))-1)
    3 K2 T  g- Q0 f8 t/ ?* g
  84. / l& x6 K- V$ ]) W
  85. #define LD_PLL_ASR_19                 (u8)(CLK_IN*32.0/(LD_PLL_11+1) - 0.51)
    0 n% |7 d+ L' Z9 G7 d
  86. #define LD_PLL_ASR_1B                 0x48# p: S/ W) G. F. X1 g6 B# x- S
  87. #define LD_PLL_ASR_1D                 0x1f
    + p4 _; `* L/ k, X" h1 g# p# c& t. |

  88. 4 Y8 t  F+ S( T" t/ `  E
  89. // LD chip fixed values.
    0 g9 R* Z. h, N" k/ K7 g; R
  90. #define        RESUM_OF_MUSIC               0x01* _% A# I4 A4 A# ^1 A& R; V$ W
  91. #define        CAUSE_MP3_SONG_END           0x20; h0 ^& l% V0 p, w# N

  92. . b8 n5 q# J% T/ I: w5 V2 o
  93. #define        MASK_INT_SYNC                                0x10' ?4 ?3 Y. |6 U, E0 {- R' f
  94. #define        MASK_INT_FIFO                                0x04
    - k+ o; d7 x& a/ r
  95. #define               MASK_AFIFO_INT                                0x01
    " I: A0 r- K; N9 L
  96. #define        MASK_FIFO_STATUS_AFULL                0x08        
    & }3 E5 U+ q2 T" U. S
  97.         
    3 h( c3 Z( t' X/ d9 k. n, }
  98.         
    2 ~( f: }9 T/ u  {* ^! p( `4 D
  99.         : ]& i7 Q* r' ], W. W8 L
  100. typedef enum. L$ a$ I! J* s' }. C
  101. {
    2 h& _3 @+ j6 @" e$ g" h8 Y9 g% F
  102.         name=1,  //小灰灰
    $ A* d0 t5 Q* o% j4 M
  103.         wife=2,  //你有媳妇没! Q+ N4 d9 M; w5 ?- X: ?/ w" G
  104.         speakStore=3,//讲个故事
    + {# n4 H- t' c2 {# B
  105.         eggPain=4,  //你最近是不是蛋疼
    " N; A0 ?  \1 q) r: }" Z' Y
  106.         visionNum=5, //你版本号是多少* [: i2 ~2 ~- w: e; M# l8 ]; k
  107.         todayDate=6,//今天多少号
    / u5 ]) v4 V5 \- s. R" w
  108.         whyToday=6, //今天几号了( Z% N- m( K% u! X" \8 b
  109.         whatTime=7,  //现在几点了
    6 h& Z) ^! O( p( m4 V
  110.         howOld=8,    //今年几岁了
    ; t. ^5 Q; l. u7 E
  111.         haveChild=9, //你生娃了没
    5 ^  d( f" }7 m9 K0 Y6 g
  112.         openRelayOne=10, //打开继电器一3 ]6 h$ ?0 a* U. }  o7 w' ?
  113.         openRelayTwo=11,  //打开继电器二! T0 c+ ^. e6 E
  114.         closeRelayOne=12, //关闭继电器一. U2 H) ?  O$ J) C8 Z
  115.         closeRelayTwo=13, //关闭继电器二
    8 }+ q. I- B0 ~
  116.         openRelay=14,     //打开所有继电器: U# }- O5 }( h8 c0 Z
  117.         closeRelay=15,    //关闭所有继电器
    % T" b) |$ L) N- W7 K( }- w
  118.         upVolume=17,   //调高音量4 N: ?' O1 o3 r: r
  119.         downVolume=18, //降低音量4 h6 O) i3 k# X. M% \; p
  120.         upSpeed=19,                //提高语速+ q* p" {+ [3 B0 D+ ?
  121.         downSpeed=20,      //降低语速
    ) f7 v& @  z! n8 w  Y. N( V
  122. }Order;8 Z* x+ M% d6 N) I3 @
  123.         . T/ r# m+ ^& y0 r) T: Y
  124.         , L7 j$ ]. f, \. W: w7 C# }; W1 l4 Z; C/ D
  125.         ! @2 X7 ?% E  P: @. U( l  b1 Y' {
  126.         ) X. A8 Z8 W% f* l* ~
  127.         ( r; y6 n$ [, c0 _
  128. extern unsigned long nMp3StartPos;
    ! r3 F3 C- A# `
  129. extern unsigned long nMp3Size;
    ; t/ `( G7 [5 J: a0 l7 L
  130. extern unsigned long nMp3Pos;) h: y$ s( |  |) c
  131. extern u8 bMp3Play;                                                        //        用来记录播放MP3的状态
    6 p9 @/ @, W8 |# j0 F
  132. extern u8 nLD_Mode;                //        用来记录当前是在进行ASR识别还是在播放MP3
    9 ?  I% W; G% g6 o# a) N4 o2 I
  133. extern u8 ucRegVal;6 t9 h" A) U' [& J' B4 `5 J
  134. extern u8 ucHighInt;
      T& Y8 M2 N9 t2 ~% Q2 j
  135. extern u8 ucLowInt;' j0 K4 {& P) ^- v; |
  136. extern u8 ucStatus;
    6 f2 a" _/ B; m' n7 {
  137. extern u8 ucSPVol; // MAX=15 MIN=0                //        Speaker喇叭输出的音量
    ( K0 S( n$ Y8 o# z0 [
  138. #define MIC_VOL 0x55        
    $ N4 z  P6 [0 M8 V' i. _: p7 }# ~
  139.         : {4 _7 J' q- E) n3 z: B, Q
  140.                 ( N# Q9 t& y, J9 U" I' R! C
  141. u8 ld3320_check(void);        / x7 s# W& k7 @* n! C
  142. void ld3320_init(void);        ( f& l3 d, s! _; z+ |  H9 E( W
  143. void ld3320_process_init(void);        
    9 A7 k9 \5 M* j+ _; x
  144. void ld3320_reset(void);
    0 T6 j7 h5 D7 [' ^6 L# c; k
  145. void ld3320_init_common(void);' Z+ q9 I% P0 {- B& F; @+ I# w" G
  146. void ld3320_init_mp3(void);
    4 E5 B, I! P, `8 @$ @
  147. void ld3320_init_asr(void);0 z3 a! s3 w8 |$ i( k4 u8 ]
  148. void ld3320_reload_mp3data(void);- C8 R) Z2 o9 Q, z6 l+ V! G
  149. void ld3320_reload_mp3data_2(void);- G, N& i% k, k2 O
  150. void ld3320_play(void);! a$ n/ r8 \# W) t* m
  151. void ld3320_adjust_volume(u8 val);7 M) g3 t# k( O% _8 g+ G( ]
  152. u8 ld3320_check_asrbusyflag_b2(void);
    ' |2 w! b) ~/ h4 N
  153. void LD_AsrStart(void);
    5 H' I3 R6 `# [, \( W  h
  154. u8 ld3320_asrun(void);
    3 t' `( r1 I0 |( j$ W* @
  155. u8 ld3320_asr_addFixed(void);" a7 v# y4 X- W$ n" S
  156. u8 ld3320_get_result(void);
    3 L7 M/ Z* t8 p+ \9 F2 H
  157. u8 ld3320_run_asr(void);% r8 C. E- J& Q4 X
  158.         
    1 U6 w: n# C! r9 D& {* c
  159. #endif
复制代码
1 v# ~' B+ S8 ~& H
freq.c$ }$ z" {7 B6 U7 w& L' C6 _

2 ?% L- E4 R# R5 N; I2 k, D
  1. #include "freq.h"
    ! C+ a7 f& a$ u  X" `3 y- [: Q

  2. * g- g# m4 i& X* P7 d

  3. * t0 Z: H. Y- K- w0 ^: @( h0 Y" P
  4. void ld3320_freq_init(void)# G$ C. K. }+ f! I: Z
  5. {
    + Q0 K$ K, ]! b" P. Y
  6. $ B7 D( I" [9 K9 P
  7.         GPIO_InitTypeDef  GPIO_InitStructure;
    1 e" B; V4 k3 I7 l( O
  8. % Z0 `$ c, ~1 d$ O
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);         //使能PB,PE端口时钟
    7 p" {# K" K5 l% R) v/ V

  10. 3 T; H+ c4 F$ ]/ d$ {/ i. ~

  11. " o. u1 p) c0 Z' |; B6 G
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    . L% [& A/ D  g  U; }/ D
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;" }$ ~: i, }) s' ^$ D; c9 q
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- c5 j, G5 j$ N) r1 t/ {
  15.         GPIO_Init(GPIOA, &GPIO_InitStructure);        0 J, D/ O3 {! L" L( x# @  s5 ?! f
  16.         GPIO_SetBits(GPIOA,GPIO_Pin_8);0 ^5 {6 l$ d0 D3 M. Y- g7 x" I
  17.         ; o9 m& L" I  V0 C
  18.         RCC_MCOConfig(RCC_MCO_HSE); //RCC_MCO_NoClock --- 无时钟输出 0 Z" y0 }! y+ Y7 b# V, H
  19.                                                                 //RCC_MCO_SYSCLK --- 输出系统时钟(SysCLK)
    - c! f+ l' V* ^" g$ w1 E
  20.                                                                 //RCC_MCO_HSI --- 输出内部高速8MHz的RC振荡器的时钟(HSI)
    - e% D# J2 p4 K( l- Q& C
  21.                                                                 //RCC_MCO_HSE --- 输出高速外部时钟信号(HSE) 4 z: f6 q8 f" v9 M$ c0 A
  22.                                                                 //RCC_MCO_PLLCLK_Div2 --- 输出PLL倍频后的二分频时钟(PLLCLK/2)               
    - U) R3 u' u( }& g  @4 t
  23. }
    + N( y% W- y1 s/ X% y7 E; Y6 |
复制代码

% }+ l# c# @, z9 r% G# `freq.h
. d( w' ?: u. T. H9 x7 {5 Y
0 A, ^3 E) W" ]9 a8 K
  1. #ifndef __FREQ_H
    ! t# H/ N6 h& b9 Y. e
  2. #define __FREQ_H 2 ?3 x  x$ i7 k# ^
  3. #include "sys.h"
    9 C  t: @3 {, Z' Y- p- K
  4. 2 {. q+ y* Q/ Y2 W' q7 A9 t
  5. / B5 p0 Y* G7 n. \' G) A
  6. void ld3320_freq_init(void);        + A; s+ Y: L1 D

  7. - @& F& X' {+ g# ]
  8.                                                      
    $ D6 @" i1 W" s+ _6 E2 p
  9. #endif
复制代码

) X- b5 _* h- F. e6 r' t% gmain.c# D( P! J. |5 f
. r+ k7 j9 R' e
  1. #include "sys.h"+ t) l. K2 q2 \3 t
  2. #include "delay.h"
    1 x5 k. H! Q* ~/ ^  n. U
  3. #include "usart.h"1 @5 ?; P+ G- T1 q* c* G
  4. #include "led.h"
    ! ?2 u" c; a8 ~8 |) ]2 ]# g$ `
  5. #include "ld3320.h"$ e1 \% S! I: m' r8 ?8 h
  6. #include "freq.h"& _! Q4 C4 s+ i" G7 F' y- [
  7. #include "malloc.h"        
    . j7 E, V  r( ^6 t
  8. % H1 _1 `* @$ y- M5 V$ d

  9. 2 L- b* y. Q' M# l' k; V
  10. u8 nAsrStatus=0;        " ~# K! h+ `/ V6 @' n4 i8 y, M: a
  11. extern u8 bMp3Play;                                                        //        用来记录播放MP3的状态) l8 i& f; w9 v1 ^) z, Z

  12. 6 v3 A/ @; T7 _: x
  13. u8 voiceSpeed=5,voiceVolume=10;( z8 p) s9 [0 c# B7 b6 r4 g

  14. : O# g5 D: }5 X  P5 Z
  15. int main(void); I1 g5 o  s+ n
  16. {        
    ' @0 K; l3 e( j
  17.         u8  nAsrRes;" H# }1 \8 k; S
  18.         u16 i;2 m/ U+ O1 I; c  O
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    : H. p7 _* d6 p1 N( |0 a5 M) i
  20.         uart_init(115200);
      _$ U5 l1 B' A- p8 C4 w1 l; c; |
  21.           d$ K1 @; ]" W; g* d$ F8 K1 Q8 a2 l
  22.         delay_init();        / Y! R" D0 l6 L0 l6 ]
  23.         ld3320_freq_init();
    1 ^$ k" r! v# ~4 [. v
  24.         led_init();        # F2 _3 p; ]8 L$ u. U. m+ C6 I
  25.         mem_init();                                //初始化内存池) t, ]& ?/ U; D; Y) j7 M
  26.         ld3320_init();0 l  F# _# t' ~, m
  27.         delay_ms(1000);* k  a# m4 O8 t  S# q: G
  28.         ld3320_reset();
    - m0 S7 j6 ^, }2 T. [& F
  29.         while(ld3320_check())
      ~) r3 ^* A( H
  30.         {: n& {: K# b" V  {
  31.                 printf("LD3320 Error!!\r\n");
    / C- X( d4 g$ @7 U& {
  32.                 turn_r_led();
    6 c9 Y* |6 z0 @
  33.                 delay_ms(500);) s& f5 \" K3 A5 C7 U; H, A7 M
  34.         }        % F1 Q9 A% h2 f. U9 W- u
  35.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR
    ; y: R, J  w0 L9 z; r8 [* Y* H
  36.                
    3 U$ O* V' _6 \& V$ m' P6 O
  37.         while(1)
    1 F+ \& j% S2 q" Y& z& [
  38.         {        " I% t, _6 d6 a" n
  39.                 if (bMp3Play!=0)                        //        如果还在播放MP3中,则等待,直到MP3播放完毕 即bMp3Play==0
    5 C, n$ Y7 G* N- s
  40.                         continue;                                //        bMp3Play 是定义的一个全局变量用来记录MP3播放的状态,不是LD3320芯片内部的寄存器( h+ r0 ?, w9 A
  41.                 switch(nAsrStatus): X, Z" A: ^6 v
  42.                 {
    " o+ y$ B! `" r5 _( I
  43.                         case LD_ASR_RUNING:        break;
    " U: Q: d/ x8 D# r1 H4 k: Q
  44.                         case LD_ASR_ERROR:        break;) a2 r& F; ]: y
  45.                                 6 U8 L% R/ p& a+ ~
  46.                         case LD_ASR_NONE:: R5 R* w, z# D# K$ d
  47.                         {        
    " q* r) ^6 n" ?' r+ G
  48.                                 nAsrStatus=LD_ASR_RUNING;
    : f, R# X3 o4 O* f
  49.                                 if (ld3320_run_asr()==0)        " V& u* m6 o+ o8 l; T
  50.                                 {
    ' {+ N+ S3 Y3 r2 ]' |
  51.                                         nAsrStatus = LD_ASR_ERROR;
    : e/ J6 a' |4 P6 K0 J
  52.                                 }
    , l3 k! Y7 \- [  M
  53.                                 
    ! I; y+ ~  g; m  b
  54.                         }break;; _0 k! Q: U' h7 _3 e; C. L7 r; O
  55.                         case LD_ASR_FOUNDOK:
    ' m3 S8 E1 N9 K1 Y2 a5 G
  56.                         {
    0 u3 w9 j6 O9 ?! T6 B
  57.                                 nAsrRes = ld3320_get_result();
    3 V5 {; U! c, W. C7 Y& j2 X
  58.                                 printf("nAsrRes=%d\r\n",nAsrRes);                                ( a9 x3 T7 A2 T( a: G7 ]
  59.                                 switch(nAsrRes)
    - B# @5 I. G3 D
  60.                                 {$ q3 s1 [  |/ z4 [# k9 r
  61.                                         case name:
    9 |  Z$ }4 [2 E1 B2 K
  62.                                         {           
    : q. a+ _5 N/ f4 _
  63.                                                 printf("小灰灰\r\n");        : @) l2 s) H! `' D
  64.                                         }break;
    * k7 d8 `: Z7 K0 d
  65.                                         case wife:   
    6 F# n$ \/ }3 m( K4 k, u
  66.                                         {
    3 q# r" D0 A/ o: o/ k" P$ e( U! ~/ b# ~
  67.                                                 printf("你有媳妇没\r\n");/ s6 _, u4 q( u; i! l
  68.                                         }break;
    7 I% L( g) w. D( e0 i5 d! y$ R3 y  S
  69.                                         case speakStore: ( D7 F3 k& L- H, E! m
  70.                                         {                        
    : ~/ u+ Z: g- I: o3 l( `( G
  71.                                                 printf("讲个故事\r\n");0 x& |( j0 T% ^; k( J
  72.                                         }break;1 D/ g8 s$ Q0 h8 T7 ~  h. Q
  73.                                         case eggPain:   
    1 \3 ]: T; \2 U5 s# F6 X) V% j7 ^: j
  74.                                         {                                                % A/ H" ~# w' q) z+ K
  75.                                                 printf("你最近是不是蛋疼\r\n");4 W4 ?" r$ R' c, N3 l) B9 q
  76.                                         }break;# `( d) n9 o1 d4 ^9 P& a! l
  77.                                         case visionNum:   
    ; ?0 ?' o5 l5 ~9 \" w. z2 G
  78.                                         {                                                
    7 n6 D7 r0 u4 J" E% C
  79.                                                 printf("你版本号是多少\r\n");  e" Q9 i8 ?" U
  80.                                         }break;$ J3 X* w2 ]9 u& D+ O6 L
  81.                                         case todayDate:
    0 @8 S# K: }& }! P4 |1 \
  82.                                         {                                       
    7 B4 Y" S, M% q7 [9 d
  83.                                                 printf("今天多少号\r\n");- z' |  C/ L% m+ E8 \% U
  84.                                         }break;- N2 H8 O4 M3 w4 F2 O: N
  85.                                         case whatTime:  
    ) M  W3 B2 o1 ?7 l0 e
  86.                                         {                                                9 m: `* ^  b# B4 H
  87.                                                 printf("现在几点了\r\n");                                        0 u7 Z, ^- }8 d& l8 b3 p, a
  88.                                         }break;! F6 [; @( l% q( G8 L
  89.                                         case howOld:        5 {9 @, ~/ z/ L& r" D* c! [$ ~+ {
  90.                                         {                                                , L2 w1 J3 W9 s. n5 \; P
  91.                                                 printf("今年几岁了\r\n");2 ]6 a: X; N9 O/ a" ], P5 d0 Q
  92.                                         }break;
    6 _+ R% c- H% Z: R* V, \7 G' ?
  93.                                         case haveChild:  . b; w7 l, }8 f
  94.                                         {                                       
    + b& ]+ P7 u+ j  L0 F) a
  95.                                                 printf("你生娃了没\r\n");% W* W% w7 c2 Q: ^3 O
  96.                                         }break;
    - O7 u5 H3 _& P) Y
  97.                                         case openRelayOne:
    & v, T% `9 \+ Q% a+ A
  98.                                         {                                        " S& f$ w( m% _+ m  g0 ?
  99.                                                 printf("打开继电器一\r\n");2 L# j. m  t$ R  p
  100.                                         }break;
    * z$ R% j: ]' Y8 l8 u: B7 `  V4 A1 \
  101.                                         case openRelayTwo:- h, @; W( k% ?' ?7 \% j) ?
  102.                                         {                                                
    % F7 L6 h; H% E5 a# N
  103.                                                 printf("打开继电器二\r\n");0 f: K" i8 [; I8 V7 G" o" Q: W
  104.                                         }break;9 z4 Z7 j0 }# Y
  105.                                         case closeRelayOne: ( Z' e, I; z8 z" \* A4 x
  106.                                         {                                                ) y4 F0 j% o2 l- y( `
  107.                                                 printf("关闭继电器一\r\n");
      _1 ~1 E1 I! h+ ?0 p, V5 ?  g, H' r. h
  108.                                         }break;
    * p$ v" b) V/ y, W
  109.                                         case closeRelayTwo: 3 B* k1 q$ K; {, `6 T: E
  110.                                         {                                                
    2 d* K! d/ ?, Y( f
  111.                                                 printf("关闭继电器二\r\n");7 k6 }0 r' b1 T; ^
  112.                                         }break;
    1 L; h+ u! y6 q/ x" [* K2 @
  113.                                         case openRelay:   
    7 x0 ~7 I* A% N
  114.                                         {                                        2 f$ ~2 `: P# W: T2 M2 ~5 c* m* |
  115.                                                 printf("打开所有继电器\r\n");6 q; g0 Q0 e+ Z+ Q2 Y
  116.                                         }break;
    6 c& o" q7 \9 b
  117.                                         case closeRelay:  . d8 h7 S0 T) C9 r# z6 F; F
  118.                                         {                                                : @( [, q! S! O2 K; V
  119.                                                 printf("关闭所有继电器\r\n");
    $ U- j3 q7 |, u. [+ d/ a, R
  120.                                         }break;        
    1 a6 a/ Y- H# x+ @5 \# ~5 U8 J. d0 y: {
  121.                                         case upVolume:   
    / F% b. e* d- w% E, S
  122.                                         {                                                
    6 s! ^5 f. t3 u; M: s0 p( ~0 N: l( |
  123.                                                 printf("调高音量\r\n");. j, V* D5 H. ~! K! L$ o
  124.                                         }break;        
    ) {1 _" E8 @- {$ I0 f
  125.                                         case downVolume: ) R9 L' W1 e; I$ {/ E% p
  126.                                         {    + `3 y9 L; Q6 z& x4 x& x: I
  127.                                                 printf("降低音量\r\n");
    $ {0 @" N' A7 X" S
  128.                                         }break;        
    7 U) i8 I8 i9 s8 T( p
  129.                                         case upSpeed:, j+ k9 `- b/ c6 n% I* p+ F( Z
  130.                                         {                                       
    1 E# r) _  G1 E2 j& I! Q$ Z
  131.                                                 printf("提高语速\r\n");7 [% V3 U, x+ o# W" M* P" a
  132.                                         }break;        ) f, x7 {9 U% t, p. z& N, e
  133.                                         case downSpeed:  
    8 C* B* l( o4 |1 \" \5 c
  134.                                         {                                        : S/ }4 a+ I( \( A/ l! [
  135.                                                 printf("降低语速\r\n");8 u/ ~5 M3 d* K' z+ w  X+ W& l
  136.                                                 
    ( m# i! L( Y8 S% a7 h& l
  137.                                         }break;                                       
    4 e3 @$ K5 ]: K
  138.                                 }
    0 o0 `" T& l7 u, g4 [( j
  139.                                 nAsrStatus = LD_ASR_NONE;
    # u  P* w% b& m! W
  140.                                 6 D0 m/ o) j% |# R9 E+ @
  141.                         }break;
    # }7 k8 [! a# d4 q5 Z- z2 _
  142.                         case LD_ASR_FOUNDZERO:
      V1 }1 M! K0 T! M1 z
  143.                         default:
    / a# `: s% `  B6 D& X/ t4 b: _0 M
  144.                         {* S& k, K' e( F4 X( h! ~8 y
  145.                                 nAsrStatus = LD_ASR_NONE;
    : A0 Z0 a3 t% M& e
  146.                                 2 V9 W* k" ^5 O1 q& O9 ~! y  s
  147.                         }break;
    & r+ U; _/ b3 {( u4 S0 h3 }! \1 v" ^
  148.                 }
    . P( X% @% z5 s$ |) J
  149.                 delay_us(2);
    % G( }) v" W2 Y8 ~& q# Z
  150.                 i++;
    ' z2 A1 ~' A8 Y2 l0 M3 q) x" _* A8 `  _
  151.                 if(i>=60000); i/ n5 G% N6 W7 }
  152.                 {
    7 m- W! `8 ?1 L- u  v
  153.                         i=0;2 E! t  n/ i) M. `( }  q, Q% [8 Z3 c
  154.                         turn_g_led();4 D- e% g. Q6 v/ G( b. x1 X% n
  155.                 }6 S) o2 R' G7 P4 }7 T( w3 ]; }
  156.         }' B* B+ l* \/ ^
  157. }, B; t; [- b1 e) W- L
  158. 6 s! b, \' Z1 v  v
  159. 7 D" j3 i' a2 E& V  ^$ M
复制代码

' s/ q6 m" n5 w" X4 \0 F; K
赞 收藏 评论0 发布时间:2022-4-24 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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