一、原理图0 x: \9 W5 \" @% [; ]- D
( {9 t$ D2 A/ R# b( s3 l0 O; w! F8 N
9 x; Q+ H- X) @( K
. ^2 U$ s9 T& D- |二、源代码
: P8 r5 J5 }9 M6 ?/ n% pLD3320.c7 ^/ N8 K# a$ c6 Z5 ?9 M7 \
( Y& a) F" I* F' D# D' @
- #include "ld3320.h"8 v3 |) l6 ]4 j4 N" B
- #include "delay.h"
& y3 |2 d: d+ F, P% W1 Y - #include "usart.h" ! \ F3 Q7 N, w. J
- #include "string.h"
- r( O0 r6 g+ S; V0 I$ K - u8 ld3320Data;( t. F8 I2 C- p- L
- extern u8 nAsrStatus;1 _7 |. y3 A# ~5 `% _
- # b1 Q; j3 d1 _1 h5 O1 Z5 L
- unsigned long nMp3StartPos=0;
, ~% l$ ~9 l+ M# h& g* V0 [ - unsigned long nMp3Size=0;+ B+ J. O0 E7 Z7 o
- unsigned long nMp3Pos=0;9 b, Z% w0 J6 Q2 k) s3 H
- u8 bMp3Play=0; // 用来记录播放MP3的状态& O" \: |+ B5 B6 F4 M J, e
- u8 nLD_Mode = LD_MODE_IDLE; // 用来记录当前是在进行ASR识别还是在播放MP3
( V9 L# w. a$ X1 j6 R; _) d - u8 ucRegVal;" r5 q) B# c) Y% T( k/ ~2 X
- u8 ucHighInt;3 m! d0 X8 ]2 O1 N! k4 y) P1 s
- u8 ucLowInt;
: r2 O+ E$ B. M) v4 Y% z* z) u% _. c/ s - u8 ucStatus;9 C. C4 ^4 x6 ` u& Z% f, Q/ H
- u8 ucSPVol=15; // MAX=15 MIN=0 // Speaker喇叭输出的音量
. Z" s% I0 \% B+ h' T; y
L! I2 l* ?7 }- ! ~* ^, l+ e3 u8 P, k0 }
2 N8 u4 h3 ^- D+ |0 O) O- void ld3320_init()5 ]6 U' y0 q( c8 p; C6 z# J
- {3 Z9 r0 L% ^! s" C2 ~1 H
- GPIO_InitTypeDef GPIO_InitStructure;
/ I; P+ b" `$ ?+ C! u1 G - EXTI_InitTypeDef EXTI_InitStructure;
1 l9 i) J' \1 e% s - NVIC_InitTypeDef NVIC_InitStructure;0 ]$ ?0 @9 b; P0 e- G z
- . l/ J. O/ @% C, ]+ z! F9 t. I8 r
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //使能PB,PE端口时钟
9 F/ t! D/ k0 e - ) _8 e U) o# {1 g; J
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);4 ^6 _' ]9 i* p" V9 s8 l. T1 G
-
1 Z7 i @' U# p+ B. L; n" i - 3 g5 o4 n- a+ Y) k7 i9 I X5 W
- GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15;
% m) G4 c1 ^, c - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + V3 K- a: \' @$ Q- `
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
* M+ o# ~. R& m8 l1 o1 s - GPIO_Init(GPIOA, &GPIO_InitStructure); " M) Y# t! G- d: L) F+ n: W
- GPIO_SetBits(GPIOA,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);
/ w& \) y+ V# T" G: K% x -
( t$ ~( ]- I6 C! ~ - GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 ;
1 m: M/ \ J- J8 d6 x5 S& O0 m, K* ` - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
3 }" o/ u0 ^: O5 g4 d - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; $ h6 t: i( u* Q) l
- GPIO_Init(GPIOB, &GPIO_InitStructure);
9 X; m% ]2 t3 m8 _ n7 R - GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15);+ H3 m* |2 p1 g
- ) ~. b# d! u. r, @2 j4 {7 s+ b
- $ F' f5 C- h) U+ M) o" }; W
- LD3320_MD=0; //选择并口2 I2 }" `; Y; z7 n! {7 m4 [
- LD3320_RST=1; " u9 |% T, F! O8 ^6 y
- LD3320_A0=0;# v9 k! y* Z/ A. k
- & N. m9 p$ f1 {$ H8 S' q4 i9 p
-
: ]2 t1 C0 `& |) T% P - GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11; * s' s, ^6 O9 }
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
$ D. \4 J9 M+ X0 ]7 ^, \* x - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
3 L8 r4 k/ B9 X - GPIO_Init(GPIOB, &GPIO_InitStructure); 2 Q1 w- x- d! S4 J2 K! n
- . v, V9 R; c# c
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
! U1 k8 ]6 n- y5 s9 d7 y - . B D& ]3 i/ \9 }6 C2 [; U; C
- // 中断线以及中断初始化配置 下降沿触发" S0 G' o7 i! \, A
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource11);( h7 H7 ~, v) ^' \5 D
- 5 E; I2 t! s" v- Q4 h( t9 |
- EXTI_InitStructure.EXTI_Line=EXTI_Line11;
9 n/ ^% j) u7 H: m* Z1 z - EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
( n/ }+ }9 j ~" l( }) y% C" o - EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
' P9 ?7 n& t0 _7 K: z5 B) s& V* O - EXTI_InitStructure.EXTI_LineCmd = ENABLE;
* v h, V( O9 L/ W9 G5 t' W" p O - EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器' q* _. K U3 k6 O
-
, X, {6 ^3 V1 E4 v( R - NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能外部中断通道
+ y, ]. _; l9 n) P$ h - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //抢占优先级0
% V5 Q8 I3 }. V& e& }' ~$ ^ - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级0
7 h5 X$ ^8 {4 G8 E - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
7 G/ H3 K+ W0 v) R B: q; ? - NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
5 g% j8 S2 T. t0 }0 @; G: L0 [8 R - + R: @8 H' _0 V( e) N4 e0 e' P
- }
% u! h g/ u1 @9 u* Z7 \, s
# ?3 n* R: P1 s# }1 h+ G- //外部中断服务程序
4 e- f5 C$ e5 m! W4 P - void EXTI15_10_IRQHandler(void)
+ N$ H& K2 H# A$ H# Q1 v - {
4 x6 _- t# e' R- y! a" ]+ D - if(EXTI_GetITStatus(EXTI_Line11)!= RESET ) 1 w7 b) q* G4 Y% m
- {
0 ~2 ~" v; z$ K; j - ld3320_process_init();
' [; B w& o8 g1 V1 n/ K! M - EXTI_ClearFlag(EXTI_Line11);- t* R0 l8 k* g/ n8 e
- EXTI_ClearITPendingBit(EXTI_Line11);//清除LINE上的中断标志位
! H% Z, g- ?' B5 Y* t/ v# F$ v7 G - } 5 V$ u6 ?1 I. G9 w: A
- }
2 c3 J: k6 d) a& M
) p. \( B' ~2 ~% g1 ^+ f! o+ d& f
( V* F0 \& w- r, J- void ld3320_write_reg( unsigned char address, unsigned char dataout )) T7 @- `4 O- [8 F" j
- {! F$ }+ K5 |0 Y
- - F. }' g# Q& F: |# f
- ld3320Data=address;5 W" F" x7 r S+ v
- LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;& I, J$ @) T5 ^' A# _( t
- LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
; D' [! j9 X- H/ s: ?' X - delay_us(1);. O( n% z i0 n7 x
- LD3320_A0 =1;' m& V3 D5 x: U, M' D
- LD3320_CS = 0;( M( H& p. a. Q& k0 {
- LD3320_WR = 0;4 X- S; O2 K4 O1 R* N
- 6 Q. w5 B: y, P& r$ Z4 O
- LD3320_WR = 1;
2 {' O; H1 \! b/ ` - LD3320_CS = 1;
. t0 E5 W( e- A) A) G& W - 1 ^7 ?/ i% p1 a& u% k% ] J
- 2 B, \" G4 G# G% a v) r+ U
- ) F# F- h/ n# D8 O
- ld3320Data=dataout;
% [8 h7 ~$ O0 Y. j - LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;
0 f6 @4 E4 L* Q& X" m% F$ F) z - LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;# D( R6 g2 u+ j: w. P
- delay_us(1);
1 M, `; _2 T' e1 J, M. Q) F) e - LD3320_A0 = 0;! v8 s ~: k' o. c
- LD3320_CS = 0;
( R @9 K( L8 b* j - LD3320_WR = 0; ~: b) S- k: i
[2 Y0 M6 w5 r2 w3 e- LD3320_WR = 1;& I6 d) l* B0 T/ [7 J* G4 Y
- LD3320_CS = 1;
5 {! }" w* k" u" z - }. p( C7 f! h p. P
- & J7 E& q) y- \
- unsigned char ld3320_read_reg( unsigned char address )
1 O4 d, l w* u& D4 s1 f - {9 z9 ^# c r) r' [& H4 _6 X# k
- unsigned char datain;5 B% A( `# I8 J" O% p; q
- 0 v7 D$ D+ o6 _3 q" C
- ld3320Data=address;
( H" w7 j) N% r0 `3 B5 e( y7 u/ f - LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;
( V) P! g1 `! T - LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;
) ?5 [8 [: I8 O8 B - 7 L7 f/ j& U0 I# p2 t1 x- x
- LD3320_A0 = 1;
2 s% J6 W" X! X5 d) g5 ^5 y, e - delay_us(1);
+ p$ p6 ^7 {2 ?* g0 }3 W7 S - LD3320_CS = 0;
; p1 t" N7 O% y; \& \& H" V7 K - delay_us(1);- A& H) w% ` q& K( X
- LD3320_WR = 0;
; [& j/ Y- ` ?" L8 C4 V& @/ D - delay_us(1);
3 L W% R0 l5 B' E- C' C - 4 b, d( n e# u5 o: k; y
- LD3320_WR = 1;! p4 z6 Y/ j8 p+ z6 j5 c
- delay_us(1);
, \ @1 Q, E1 p7 I2 E- P1 q, C - LD3320_CS = 1;! |+ r \" z l9 g; c1 |! J
- delay_us(1);: Z8 I- s, h8 t2 z# h
: ]8 x( m* f+ F1 T- LD3320_A0 = 0;
2 b9 {; r; J2 I4 J - delay_us(1);
; k8 b& H1 S9 A - LD3320_CS = 0;
/ @/ ~8 S: m5 H) a. U5 O - delay_us(1);
0 n# j. E d; {' z+ d( E - LD3320_RD = 0;
# e* C$ X! Q5 Y) M - LD3320_DATA_IN();3 ~9 U1 ~* ^: k; O* T4 }
- delay_us(1);
* B/ j8 ^; R5 K/ {, I - 3 L! }9 G( u( Q6 z
- bita0=LD3320_D0_R;bita1=LD3320_D1_R;bita2=LD3320_D2_R;bita3=LD3320_D3_R;
9 ?5 \: _# K/ F: r( Z7 [: U - bita4=LD3320_D4_R;bita5=LD3320_D5_R; bita6=LD3320_D6_R;bita7=LD3320_D7_R;3 u6 p( h# P# B+ b
- datain= ld3320Data;
2 r2 ?3 q1 t! ~" V$ Z3 N -
9 P3 r0 U" @. ] - LD3320_DATA_OUT();5 e5 g& M- a" v9 K
- LD3320_RD = 1;
$ ]. y& I* t; `3 Y - delay_us(1);8 x+ E8 y* t/ Z2 e" W
- LD3320_CS = 1;1 N" `$ W, M8 @. H! t
- ) J+ }. d; {! Y( D' M# c
- return datain;# B- a: k( t* y3 [8 l" ]$ x- d
- }# ] \2 U) t( E# M
- * i7 ^2 K, Y- A/ G- }" e- S
- . @$ x" U& I! P( t) h& {, ?5 x: W+ Y
- void ld3320_reset()
( c. o8 E: p3 j% O - {
" `' o. G8 z x$ W7 K1 d* m - LD3320_RST=1;
) i3 B+ O- U! h - delay_ms(1);* t; S6 D" y& c% X. T( \% f5 @
- LD3320_RST=0;
7 B' g4 x# ?: a A" W* a - delay_ms(1);
% O9 H. Y+ V, J+ }& T; T8 f - LD3320_RST=1;8 P1 Q* z2 w# h6 R
- 1 V3 k) v Z+ c
- delay_ms(1);9 z' R5 [" k7 z2 s1 a
- LD3320_CS=0;: D" g* W; b* _
- delay_ms(1);
, O: t4 W( X3 A* S# G" R: { - LD3320_CS=1;
) `3 g1 r9 a# s9 _1 k/ Y - delay_ms(1);
# \& L4 M& E( T2 E2 Y3 g - }
- j) Z/ g2 q- U* {8 _" } - u8 ld3320_check()
5 A- c8 \( O$ j0 Q3 Y3 r ] - {% }/ t0 Q1 H) o/ z, p
- u8 a[3];5 D: t$ Y" X: v' Q5 Y
- memset(a,0x00,sizeof(a));- `5 o$ P* [7 E0 n6 }
- ld3320_reset();/ q( @7 }- v' J. H
- delay_ms(1);0 k, n3 |4 u% m" m, s
- ld3320_read_reg(0x06); 3 b' l1 _. z8 P; C9 W! [
- delay_ms(1);
& l7 i! K+ O$ Z( I - ld3320_write_reg(0x35, 0x33);
1 ?' p$ ?3 n& G6 {! r9 I- y: @ - delay_ms(1);
+ p# |2 e4 S8 X/ y- P3 s - ld3320_write_reg(0x1b, 0x55);
i5 g; `! S6 v. W) ]& I3 |/ i' a# j - delay_ms(1); `, W; K3 ^$ ?4 i
- ld3320_write_reg(0xb3, 0xaa);
7 V; h0 l5 i6 n# W, P* _# O - + @" o$ ~; ^" n3 x5 Q
- a[0]=ld3320_read_reg(0x35);4 C' R( o2 c v$ \% p0 H9 N' M
- delay_ms(5);
, s$ u! i) P6 ]" o -
; Q* f0 Q/ Q1 X! F1 G - a[1]=ld3320_read_reg(0x1b);
. Q+ c8 Q8 L& k; h - delay_ms(5);! c9 p U# ?4 ^" g# T
- a[2]=ld3320_read_reg(0xb3);
9 x* }( F! I6 r0 M7 D' r4 G8 V - ) |: X: O. E3 y e' G4 D- d+ k
- if(a[0]!=0x33||a[1]!=0x55||a[2]!=0xaa)
4 a S8 P8 t8 W8 m% R - return 1;
+ ~, m; o# o$ U! h - return 0;
! s1 B5 F# r* y1 J! W" m. a' `$ w7 Q -
) l/ N1 E" v) T: u, y3 H1 j - }1 P" J2 U _" g, t$ E) s) H/ j- H
- ) {% F; Q+ Y9 o* `- l. I7 V& L
- * t6 U7 B7 p/ K2 }& I
- ! A" i0 @9 @) `3 ~, u( p7 s6 Q
- void ld3320_init_common()
. v& K9 p( w; K4 i - {* h0 g7 k7 p! B I, c/ I8 V
- bMp3Play = 0;
) V% B2 m) B" G - . @, E7 u' d* Z
- ld3320_read_reg(0x06);
; L1 X+ ]% H: |6 } - ld3320_write_reg(0x17, 0x35);
/ ?* z9 s0 m2 b9 D8 U - delay_ms(10);
" I3 _1 I, J. X+ v" `6 S - ld3320_read_reg(0x06); . T7 V5 T+ [% f4 Z* A& V9 G( w
- ' n' s9 j, }) n, [$ y6 Y$ [- I5 X
- ld3320_write_reg(0x89, 0x03);
0 E& m- s4 e* H1 O: x: w# _6 w. ?3 E( B - delay_ms(5);
9 j2 O/ ?; P, P) S - ld3320_write_reg(0xCF, 0x43); % z7 G7 l4 n4 z- M
- delay_ms(5);
5 J. w! [ j/ y) d' k: a9 \5 f - ld3320_write_reg(0xCB, 0x02);
$ P4 F7 f V) w+ ^: ] A3 n -
) R/ a: I) I1 k- v+ M - /*PLL setting*/
" \ D) `4 V' H! M& L- M - ld3320_write_reg(0x11, LD_PLL_11); 1 f8 T. ]4 W' f( {* k2 @4 J
- if (nLD_Mode == LD_MODE_MP3)3 K% q; M9 U6 W* A
- {0 Q( v( q) I g. \ P
- ld3320_write_reg(0x1E, 0x00);
" I9 x) [: P* t% H) p: u- ?4 G9 J - ld3320_write_reg(0x19, LD_PLL_MP3_19); + M+ Q/ P# s, E5 |7 m: C
- ld3320_write_reg(0x1B, LD_PLL_MP3_1B); ) ^& s5 D: {3 A |
- ld3320_write_reg(0x1D, LD_PLL_MP3_1D);
- U3 _: O% R3 N9 G - }
6 W' V2 _; K' @) } C" G) g3 }$ c% X - else
. t3 N2 R0 e% I# U! z. n - {+ `& y9 Q" u) I: G/ r2 K0 L$ ?
- ld3320_write_reg(0x1E,0x00);
9 M3 J: s9 q0 L8 k7 F - ld3320_write_reg(0x19, LD_PLL_ASR_19); J; E6 _0 W" K# Z! X9 }" i
- ld3320_write_reg(0x1B, LD_PLL_ASR_1B);
6 e$ V W+ @* o; S: R: Y0 J - ld3320_write_reg(0x1D, LD_PLL_ASR_1D);
+ F: X9 b8 q- {% ~7 R: @8 q - }
+ S5 k: z3 `0 k# W8 F* _+ c: D - delay_ms(10);
( w0 w! N5 g' |7 M7 Y& L2 V -
" R/ v% r4 [" b+ t - ld3320_write_reg(0xCD, 0x04);
, Y( Z& S; Q! _1 k" \3 ] - ld3320_write_reg(0x17, 0x4c);
( r' E |, y1 f2 {4 j& v - delay_ms(5);- x4 x% Q% o7 x0 I) M$ P5 P' @9 x
- ld3320_write_reg(0xB9, 0x00);
- P) {6 M4 u# a& }2 Q - ld3320_write_reg(0xCF, 0x4F); . q7 h0 u. a- V" {0 \4 n* \
- ld3320_write_reg(0x6F, 0xFF); 3 x9 H# t; j% c
- }
8 k6 q7 `4 X# i C, l - / [; m( n! X0 }. U
- void ld3320_init_mp3()( f x% Y9 G: m" K) N( i, P- v1 v
- {2 S* W" v. m- v8 y4 b1 O
- nLD_Mode = LD_MODE_MP3;
) ?: g+ \) D+ y0 p - ld3320_init_common();7 V! o: H8 F$ z% [7 D! z
% H1 W: d [6 C/ R& o( I! V$ {- ld3320_write_reg(0xBD,0x02);0 b, H" N& x! T! u; Y
- ld3320_write_reg(0x17, 0x48);' F5 F( |$ q0 Q8 g2 y
- delay_ms(10);
, S, `% ?' f( P3 z d6 ~! a
" M1 K+ P0 s, W+ F- ld3320_write_reg(0x85, 0x52);
8 n" B- [5 D. @3 G: L& E - ld3320_write_reg(0x8F, 0x00);
; }$ o/ M* F& ^( c+ ^. M - ld3320_write_reg(0x81, 0x00);
( X) J" j: u5 h9 x% ?+ g - ld3320_write_reg(0x83, 0x00);
" D! W' g+ V& B; q& [% h& m - ld3320_write_reg(0x8E, 0xff);
& d3 G7 j) y" n. L6 W' p# e; H( A - ld3320_write_reg(0x8D, 0xff);
" b9 O+ S5 U( i$ J - delay_ms(1);
( N* Z0 b8 k7 E3 \- J r q& H - ld3320_write_reg(0x87, 0xff);: {6 Q9 D- f) E" z! h! a) v
- ld3320_write_reg(0x89, 0xff);
; X) m. S; U1 L2 ^6 o4 J! T - delay_ms(1);
2 M, e; b) i% s& k+ ^5 | - ld3320_write_reg(0x22, 0x00); 9 W& p. [: H3 N ~' ~! c
- ld3320_write_reg(0x23, 0x00);
! ]+ D9 W8 ?* b+ K - ld3320_write_reg(0x20, 0xef); 9 d) z2 \; d S. A3 y3 k
- ld3320_write_reg(0x21, 0x07);
" A5 l! i( \: F" f& G/ j - ld3320_write_reg(0x24, 0x77);
& w; e% [! H+ M+ p - ld3320_write_reg(0x25, 0x03);0 n) B0 h( B- b' L$ B1 M$ D6 ?! \
- ld3320_write_reg(0x26, 0xbb); % O& N. B7 u# I7 p
- ld3320_write_reg(0x27, 0x01); $ g0 E: z% G3 e/ ^0 U+ V: A
- }
0 y5 x" X2 v/ k0 f$ Z' ^
A) ^1 O- W. n! @7 a [3 C" D- 3 m3 `' c* ^7 H4 g# N
, I+ {5 a6 g: e- void ld3320_init_asr()2 \7 m$ A8 j* H: r# E2 x, F
- {/ x0 G* {9 P- B, Z( Y2 H, L
- nLD_Mode=LD_MODE_ASR_RUN;
' J+ ]4 @9 y# f' Y# S - ld3320_init_common();
( a# e5 }* X* m1 ^/ ?- W8 T% l - ) F# ?. `" ]" m6 E3 n7 ^
- ld3320_write_reg(0xBD, 0x00);
8 p- x/ i4 L& `5 v' Q( R( e - ld3320_write_reg(0x17, 0x48);2 y- Y r! `# x
- delay_ms(10); ?1 m+ r1 g7 H7 D1 n* r. v) f
' ^+ J# K; t" u J: Q1 D) d- ld3320_write_reg(0x3C, 0x80);
' I% x" l# {, J% O. @3 r - ld3320_write_reg(0x3E, 0x07);- ?! V# y. n# h7 J3 n# R7 V
- ld3320_write_reg(0x38, 0xff);
- T" H' K. ^1 H: @3 N* O7 w( e - ld3320_write_reg(0x3A, 0x07);
6 R$ i ]1 b* S5 X& g$ X$ v. B% h# ~ -
2 `% C7 U! z8 r6 o" x" s$ a - ld3320_write_reg(0x40, 0); / ?8 e/ ^4 x. ^- r: l+ }
- ld3320_write_reg(0x42, 8);& d& B* O2 t$ E }
- ld3320_write_reg(0x44, 0);
' |% q: g7 @5 s) Q - ld3320_write_reg(0x46, 8); & c6 w) _) H' v# P+ J( s6 W
- delay_ms(10); n8 a4 M% Z6 Q7 v* o' c2 O
- }* |7 I7 |% W- t5 V
$ U3 g4 [9 U# {; T) f5 F- void ld3320_reload_mp3data()& V Q. E- D* _$ H* g
- {" j3 J% u w6 N- B
- unsigned long nCurMp3Pos;$ j% N+ v- N7 f0 D& O
- u8 val;/ N) ]; Y5 r. j+ i
- u8 k;) J% f1 h; w$ A5 i
- 5 R7 E* \2 S/ v! v
- nCurMp3Pos = nMp3StartPos + nMp3Pos;% l% {4 w( m& [. c* x* h
- ! P2 ]) M, a) Q- U! Y: F& e
- ucStatus = ld3320_read_reg(0x06);
$ y# J6 z n- t1 M L W+ `6 C - while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )
: n# S$ i8 W1 h" Q6 S - {; D1 n6 l% Z- f9 d/ L
- val=0;( y7 Q! E6 G8 l& x' c( g
- for(k=0;k<8;k++)8 r5 [5 B% U/ J, h2 R( P
- {9 l2 z. z( E# T* f
- }* L f$ _ Q" C9 A" I8 }
- ld3320_write_reg(0x01,val);9 _1 T- G' r- m! L$ p
1 ~' E. O: \2 S- nMp3Pos++;) @6 G8 v( ?+ S2 ]- O3 H( @
- . k# O# P2 @' s1 d) b5 c( L
- ucStatus = ld3320_read_reg(0x06);' L+ d1 M, B3 m* o
- }; a5 i! I1 M& n: ~
- }: b* p: O8 [* A
- ; @7 f/ H& u5 N4 x- Z5 N) i a
! O# l( D9 O$ a- void ld3320_reload_mp3data_2()
8 I6 o' J9 ~: [/ _. k - {
0 ^& y: T/ h" p8 O6 r - unsigned long nCurMp3Pos;! j& E" u0 a- w( }
- u8 val;
4 ]8 r; f$ g. c8 e! S5 J/ I. \ - u8 k;$ u+ q" J. p6 u$ F" ^ r
- # \! P& o+ [/ B
- nCurMp3Pos = nMp3StartPos + nMp3Pos;
0 t: k! w! f& @* o- t! ]0 s - . C( v/ }3 s& q8 ?0 L
2 D9 f. k2 t1 M3 C/ i/ i) p- //读取音乐文件写入
- p6 |2 c* H) b: m4 n8 Z4 J -
5 K7 f$ n, ?# y- Q - , O" y" U% [* r1 W: n! A
7 U3 f7 K5 g9 s' x, f0 v: q1 b, f- ucStatus = ld3320_read_reg(0x06);. g9 r" n: C& b* ~8 S
- while ( !(ucStatus&MASK_FIFO_STATUS_AFULL) && (nMp3Pos<nMp3Size) )
$ b+ e! }& c C1 N - {, X# y/ @0 L4 ?0 `, g
- val=0;" l. f0 O3 J3 W& y- Z7 G
- ) g/ J+ x- D4 h/ g, ^
- . ]; R( r8 V8 N) ~$ m$ S2 j
- nMp3Pos++;- _' _. [5 p. O% ?4 k: P* d
- , t" R0 J# G7 I9 t" w1 z
- ucStatus = ld3320_read_reg(0x06);" C& S3 Z7 F w8 P
- }
, y# k7 ?7 T' R( K1 B - }
; ?' U$ x( C; |3 }& E" t1 y
1 U" V2 p6 n: k7 {. ?/ o \- 1 w: s, ]) m+ U! f7 C
- ) l6 \, M; B5 U6 u! W3 }; s6 h
) g( T' n) ^$ `9 \: \- void ld3320_process_init()+ e. S! P" a" R$ I! C$ N- F, y/ I
- {2 {( R+ b) i/ X0 ~1 q+ k$ \
- u8 nAsrResCount=0;
7 j9 q7 [/ k" ^) s* D" S1 z* w4 j4 a -
3 H# @! b, V" r% A* ]+ u+ M - ucRegVal = ld3320_read_reg(0x2B);3 U) R" o! d9 N A! |% W
- if(nLD_Mode == LD_MODE_ASR_RUN)
2 t- T- d( H: M _( a* L# F - {
. ]) j' ]/ ]# A- Y- T8 u7 e - // 语音识别产生的中断
$ t1 k7 J) P- l" A - // (有声音输入,不论识别成功或失败都有中断)0 a' d C9 ~. x
- ld3320_write_reg(0x29,0) ;
# t& y3 e. I; r) P( P - ld3320_write_reg(0x02,0) ;
; A0 z3 |* M9 s) H - if((ucRegVal & 0x10) &&" N; T+ C( m% W2 d6 S
- ld3320_read_reg(0xb2)==0x21 && ; Z$ [' A. _* c8 q Z# k( O* F
- ld3320_read_reg(0xbf)==0x35)
7 u- a* o7 ]- I8 i1 K( U( e. V( w" r2 J - {1 T8 g! B3 R& b n9 g3 V
- nAsrResCount = ld3320_read_reg(0xba);8 L3 F9 d, k, l' G
- if(nAsrResCount>0 && nAsrResCount<=4)
$ O% T9 g( ^7 {8 s/ o - {- y6 S# ^% [3 D9 Y! x# S
- nAsrStatus=LD_ASR_FOUNDOK;
- q9 O- K7 {( h# m: A5 U - }' T' g% S- v5 x- |, ~4 A
- else
( o6 D$ K) I3 H/ Z2 t/ N. ? - {' }3 N& _. s6 Y( ~# c+ c& K
- nAsrStatus=LD_ASR_FOUNDZERO;2 I6 r& T. \" p
- }
9 s7 P/ U3 O' C z - }0 D" O {) B! a& J/ b1 X" b$ E v
- else
* K1 Y4 M9 F' e) B% b, c' b - {9 R" W3 D9 o- G& J% N
- nAsrStatus=LD_ASR_FOUNDZERO;) `+ y8 O5 d! h/ e S! x. X" t
- }
I% k6 a+ B5 s8 e' Q/ @ - / c( H, I1 q5 E
- ld3320_write_reg(0x2b, 0);
m+ ?8 t+ P: Q8 z j" H. w - ld3320_write_reg(0x1C,0);
% |* n# M" L+ j& t - return;
& U: z+ f' K& ^" x, y, C8 d - }
1 ~1 `+ E V3 v5 k2 P- a - ; W: w! t7 H; g' E. I8 B- |
- // 声音播放产生的中断,有三种:
. S7 ]9 {6 `( n - // A. 声音数据已全部播放完。
) ?0 D/ N4 v+ F7 A, U5 ? - // B. 声音数据已发送完毕。
* v) R N4 p d/ H/ W6 r( w - // C. 声音数据暂时将要用完,需要放入新的数据。 6 l) C7 d+ d3 s& v
- ucHighInt = ld3320_read_reg(0x29);
2 T) t/ F* ?3 ~- u - ucLowInt=ld3320_read_reg(0x02);
. `- |( n1 U* }8 u* X2 R1 k$ } - ld3320_write_reg(0x29,0) ;
: S% o) ~, g2 D; w - ld3320_write_reg(0x02,0) ;$ g: `( o7 Q! w
- if(ld3320_read_reg(0xBA)&CAUSE_MP3_SONG_END)
& {# l% E- S# U8 I$ R - {! K% c4 x7 N- }+ @' ^: D; `
- // A. 声音数据已全部播放完。% k0 t) Q# N0 z$ _. n7 k
v7 c! f9 d/ R- ld3320_write_reg(0x2B, 0);* `4 S/ g0 K: w( q
- ld3320_write_reg(0xBA, 0);
4 s7 m& w& n0 f t; D6 X9 P - ld3320_write_reg(0xBC,0x0);
, _& K4 H' |5 D& V - bMp3Play=0; // 声音数据全部播放完后,修改bMp3Play的变量" I z m5 S* w7 } S
- ld3320_write_reg(0x08,1);1 q+ w9 Q, P; g) {" o' n
- delay_ms(5); t; A" N- b! \. h0 F' Y7 C
- ld3320_write_reg(0x08,0);
) W4 c: g( s7 `, W' i, ] - ld3320_write_reg(0x33, 0);
8 s) I+ ~3 d3 i, f - ! z) ?: F2 y: H
- return ;& i- l# Z/ D- i6 y+ b% L3 A7 e
- }- n! K( b7 K' r: N/ K: w
- / _. I; V: D+ M; w' w0 x
- if(nMp3Pos>=nMp3Size)" F, c3 i- T) @* D$ S( F% V( k
- {
% k% ?7 g& S% m$ f% V - // B. 声音数据已发送完毕。
: ?3 c! s$ \# T2 Z9 g - * o9 O9 E$ v6 z" P' A
- ld3320_write_reg(0xBC, 0x01);
8 L; E0 [% i$ k4 x9 h [ - ld3320_write_reg(0x29, 0x10);1 R1 _% s9 i; C. E7 p0 \5 }4 @
- // bMp3Play=0; // 此时,只是主控MCU把所有MP3数据发送到LD3320芯片内,但是还没有把送入的数据全部播放完毕
2 Z9 v N `5 S - return;
) D2 k$ n+ ^ n - }
) T+ Q6 z/ N" S. m `
( E, ]5 @+ n* \) @% @# B- // C. 声音数据暂时将要用完,需要放入新的数据。
j% a# b; L0 O; M5 R( W' w) m
: A" z: E# ?0 U- ld3320_reload_mp3data_2();
' ^0 l7 C4 u/ I; _8 ^ -
( K% `! l5 R. C/ z8 Z- i9 Z - ld3320_write_reg(0x29,ucHighInt); / ^3 A( {6 N3 n+ W0 p
- ld3320_write_reg(0x02,ucLowInt) ;+ l0 h, @; l8 q5 y" ~
- }, |' \! o# K1 k# S
- void ld3320_play()
$ d' ?( E9 B3 x$ w4 P* Z. ? - {
# J6 d& s# n+ p3 u4 T - nMp3Pos=0;
1 g- m+ B3 D8 K1 Q6 h& b - bMp3Play=1;
" F9 N% I D$ P6 z
9 Q! p$ h! ^3 Q7 N4 v& `, C- if (nMp3Pos >= nMp3Size)
' v% u: H% Z* v* ^* s* k) F - return ; ! K- F3 B, C4 h% R1 R. Q, B& [
$ y( M/ A5 I6 d- ld3320_reload_mp3data();- K/ F" C/ M0 `( b+ U
- ! ]' f6 E- j( Q, G5 ?! e1 m& y
- ld3320_write_reg(0xBA, 0x00);
4 X+ ^* j. b* w2 ~+ K - ld3320_write_reg(0x17, 0x48);
, {: \6 F' n* L& J2 U/ M* U# o - ld3320_write_reg(0x33, 0x01);
5 N/ F" {$ n" n% {6 t - ld3320_write_reg(0x29, 0x04);
; N8 c9 b6 X& Y3 f! c. N7 V2 v - ) w5 }" e6 f" u6 @
- ld3320_write_reg(0x02, 0x01); 2 ]1 V5 F( v8 z& J8 v% [( C
- ld3320_write_reg(0x85, 0x5A);7 G1 ?/ s/ K- j. M
- }8 ^! P8 B; v6 Q: n4 d% M4 N
- 2 [+ z9 y$ F( K5 y9 o
- void ld3320_adjust_volume(u8 val)0 e Q; E" ?$ _1 C/ Z* _
- {
7 V; y/ `% h2 P4 ` - ucSPVol = val;
% l0 H9 s2 G5 m, ] - val = ((15-val)&0x0f) << 2;( h. r, n% A$ |* ]
- ld3320_write_reg(0x8E, val | 0xc3); ; T" o# g; G1 W- o7 a1 j5 i
- ld3320_write_reg(0x87, 0x78); $ Y/ ^& D0 E) d( S1 p+ _
- }8 ]4 x; f$ k6 |* {' B4 i+ s
- // Return 1: success.
6 n2 `. j' T5 c# |4 z3 @6 M - u8 ld3320_check_asrbusyflag_b2()
' X0 |& D2 k9 q2 ` - {% g1 e" T( b3 c, o# W3 r
- u8 j;
9 r( e2 s: r! h+ m1 i$ Y; O - u8 flag = 0;. T' d, |5 w. E/ r
- for (j=0; j<10; j++)7 L* Z$ M4 a5 ]. Z; ^9 n% Y1 `' f- X
- {% ~% |) G% L3 L6 J. i
- if (ld3320_read_reg(0xb2) == 0x21)$ E& g: U- a' d5 U ?. b8 z. ~
- {
P+ j4 G7 P+ `( z6 b - flag = 1; `* A+ \. b( p/ w
- break;- z, G' s& J& l2 T
- }
3 l: Y. K/ @$ ^- }$ M+ @ - delay_ms(10); : X1 O& e$ J; ?& l v
- }
+ _! ]8 T0 c5 @& N2 M1 b - return flag;
7 V, P& }: z4 |* d - }
) S* G0 q8 `5 T - 9 p7 i& a$ \- _
- void LD_AsrStart()7 A8 n R2 k7 }6 K% J0 L! R
- {" U9 U. d: t `, |
- ld3320_init_asr();/ k+ l" Y4 P/ I5 c/ V ?4 J2 c3 K
- }
/ y- @! E9 j0 F B1 Q9 s- q- A
& r- O* v: B) z5 [- // Return 1: success.
u8 b) @3 n" d& \3 W0 `% `, r - u8 ld3320_asrun()6 K% \1 h9 t8 d v X3 c
- {
) s- @3 v+ }6 } - ld3320_write_reg(0x35, MIC_VOL);# s x! Z, t' `6 A
- ld3320_write_reg(0x1C, 0x09);0 o% f! g, d% v$ W; `" t
- ld3320_write_reg(0xBD, 0x20);" {8 q+ I! a/ q
- ld3320_write_reg(0x08, 0x01);
9 ^8 B: S+ [- Y1 h/ E - delay_ms( 1 );
9 f) k. H/ T2 c+ J& [# x5 O - ld3320_write_reg(0x08, 0x00);
2 ]. M7 b \" Z2 }0 A) { - delay_ms( 1 );" a1 G$ k. O4 h: R \
- $ r0 Q2 L" V! s$ X6 e K5 h
- if(ld3320_check_asrbusyflag_b2() == 0)+ N& T% V1 R4 E W$ q
- {
8 O8 Q, L" l8 ^: _! t) ^ - return 0;3 o: G, V; T9 v2 T% ~5 M& D7 i
- }$ N7 p9 y' t! B4 o3 F/ u
6 G0 {9 E+ N- q- ld3320_write_reg(0xB2, 0xff);
. q2 J( D/ c! c - ld3320_write_reg(0x37, 0x06);; g4 @1 O) f8 Y, N# F7 t
- delay_ms( 10 );) d; a1 Z. f8 F/ n
- ld3320_write_reg(0x1C, 0x0b);
( d7 m3 I1 {& K - ld3320_write_reg(0x29, 0x10);
; k8 `% g9 a( q* v( s1 `% ]' J: X - 4 s: c, t6 Q0 e' e" T8 b
- ld3320_write_reg(0xBD, 0x00);: b. z% B4 s; a s( |1 D6 Y
- return 1;5 G6 o/ t5 X& H/ i- u/ w8 l' Q9 A% C
- }, H3 [; u" N' Y( p* {
- - x) D- h& M3 c% Z. o9 I
- // Return 1: success. b( `: S7 E( Y& S* h S+ S5 ]
- // 添加识别关键词语,开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中关于垃圾词语吸收错误的用法
7 @' l! ~" M. U" `" l) E' ~ - u8 ld3320_asr_addFixed()
" R# [% \" Y% Z( Y( G - {
8 M. U! g: d; H1 t9 \ - u8 k, flag;0 h4 e8 }$ Y& y, N- m: _8 X" ]! Z9 }+ h
- u8 nAsrAddLength;2 ^: D% ], l/ R) Z
- const char sRecog[24][30] = {"xiao hui hui",
7 [; M6 I9 v, g1 m" u' e I. o" I - "ni you xi fu mei",+ ~% x4 ?" Y- f1 u0 D3 v8 y$ P
- "jiang ge gu shi",$ K: A2 F n0 h' ~* m( l. S# i* z
- "ni shi bu shi dan teng",: j% ?) t6 q) k* U
- "ni ban ben hao duo shao",
, A) H" \: D2 D5 G0 M - "jin tian duo shao hao",+ M) {5 _, b0 v! g
- "jin tian ji hao le",/ P- G: u, w: {4 v+ ^- N
- "xian zai ji dian le",
7 K8 [3 B! e+ M# f, m) ]0 W - "jin nian ji sui le",& t( J8 R- y9 G) t" G" o
- "ni sheng wa le mei",
/ H+ H5 X$ z+ g - "da kai ji dian qi yi",
/ X7 f- j, e3 `* p" J% z( X/ ^ - "da kai ji dian qi er",
8 G+ |2 i; p! ^6 A% R# R - "guan bi ji dian qi yi",- V; F( h! P" b- G5 m
- "guan bi ji dian qi er",5 k$ x8 i9 l3 }0 {7 u; V
- "da kai suo you ji dian qi"," _7 ` F/ {2 z. [8 k/ W9 {6 G
- "guan bi suo you ji dian qi",
& c6 ^, Y4 e D7 T ~- ]! B - "tiao gao yin liang",% K7 k0 U! _$ v1 n% L/ z
- "zeng jia tin liang",& l1 _- O9 Q, G7 |' d8 A
- "tiao xiao yin liang",2 s+ h v* e) U' F3 O
- "jiang di yin lliang",+ r6 \6 j( _8 O
- "tiao gao yu su",8 w. p, z; k8 k7 i$ j4 W; g# f
- "zeng jia yu su",+ U1 N. S2 R/ g6 G
- "tiao xiao yu su", ?: x3 V$ `% x$ m. A
- "jiang di yu su",
: V: I4 ~: U. N' P& ]. ^7 W* V - };4 z) ~4 {, ^/ ]6 y
- const Order pCode[24] = {
- ~6 _. o4 V3 ] - name,: R9 K$ F H& V. L( _& n% ~. H
- wife,
8 t' G: v! q+ `. P - speakStore,! }% d( J/ k4 a! N- c8 P
- eggPain,
+ R0 |; R3 W, R" \ - visionNum,+ x1 e, _9 ~- ^& s
- todayDate,+ X0 Y1 i- H' ~- t. F
- whyToday,% k4 Z n1 p, k E1 S3 n! Z
- whatTime, N$ x f6 ~* V- d
- howOld,# o3 d' ?$ V. {! G5 a |
- haveChild,) F, l3 a2 ^9 ~6 s' i$ C; ^# {7 e
- openRelayOne,! L1 X9 V9 M* v* m
- openRelayTwo,
- U. N s5 @; M2 p) v2 j - closeRelayOne,. M; {" W1 M. N
- closeRelayTwo,8 w/ h5 R N$ Q3 E
- openRelay,
1 k& Z2 z9 g+ A9 B3 A: y' f. U - closeRelay,0 r5 C9 I/ r& @& z
- upVolume,
- x9 v6 d8 M) O - upVolume,
8 \& L; }* i3 o0 `6 e# | N - downVolume,; R% L; |& x, b9 [
- downVolume,6 g3 ~' v+ O0 A
- upSpeed,
$ a" n1 G4 T0 m# z D2 u - upSpeed,4 E$ c) U- J6 r4 c5 f5 v* s; e( B2 Q
- downSpeed,
7 k" |- u8 H& t9 [/ X. b9 x( e - downSpeed,
8 R; F, i* u9 e& J( J - };, ~+ n8 ^5 z/ g; ]7 V, N
-
/ e/ ^( q! L# H - flag = 1;# M2 k9 `! h0 [% F, ^% W5 m
- for (k=0; k<24; k++): w, z8 M1 | ~6 M u
- {
. g' k0 ?" n- B" s" [! j& W -
. U$ r0 s8 y) L* w5 @8 ?# J0 w9 f% q9 j - if(ld3320_check_asrbusyflag_b2() == 0). I5 a! }6 ?2 K
- {
6 K- g- t7 ?4 D6 Q$ S C. G - flag = 0;7 }& q8 i9 Q; \7 e
- break;) T: h3 ~: @( a9 l+ I
- }- r' ^. _& z2 d) N0 F" \; @
-
M: A( i, A. y6 L - ld3320_write_reg(0xc1, pCode[k] );6 d5 ?1 m; d8 y' F
- ld3320_write_reg(0xc3, 0 );* l7 \1 X" H; O; _/ N
- ld3320_write_reg(0x08, 0x04);3 N T+ {: Y1 D# W( U% U
- delay_ms(1);
6 s0 v) v6 H; y% k3 c - ld3320_write_reg(0x08, 0x00);
' m7 t: P/ G: D2 d - delay_ms(1);
8 v4 V" N1 f8 |% t0 O
& ~& b+ `3 _2 i4 T6 e- for (nAsrAddLength=0; nAsrAddLength<30; nAsrAddLength++)& K" _$ @1 \$ F8 k9 d0 R' }, u
- {
- N" e7 E" a9 `5 \5 v - if (sRecog[k][nAsrAddLength] == 0)7 |6 M" Z; M4 {, }1 p. X
- break;
+ H* n$ _8 o! y/ n/ \ - ld3320_write_reg(0x5, sRecog[k][nAsrAddLength]);
9 K! f3 u& h1 b1 q/ @& | - }. j6 K# D" q7 Y/ @) v* @
- ld3320_write_reg(0xb9, nAsrAddLength);
. w' f5 B1 o! L7 F; i; f - ld3320_write_reg(0xb2, 0xff);
) ~' B" z2 C: k7 t% J# X9 C - ld3320_write_reg(0x37, 0x04);7 z% T: q- Q' u1 a
- }7 E. Z. b7 Y2 q" Z q0 Y8 B( e
- return flag;2 T& T7 `9 o, H
- }! Q" E( i3 f0 A& Y+ d3 r I
: w. U. L3 R$ o- w9 w5 e; e- - S- ^- d, t3 n+ k
- u8 ld3320_get_result()
6 r/ X8 E: W2 u1 M" U( Q5 U$ g" ]4 j - {
0 q. J! Z4 U' n: q8 U - return ld3320_read_reg(0xc5 );7 a) n& `2 v5 Z7 ^3 f6 c# T
- }, p% L) h- j/ l5 s% I& d
- 6 B1 m1 V3 S+ i: ~' S% N0 E, F
- /************************************************************************************/
5 }$ B* G$ [, k! ~5 [' S; y3 I - // RunASR()函数实现了一次完整的ASR语音识别流程
# E5 c& R. c5 Y: z) j9 W. T - // LD_AsrStart() 函数实现了ASR初始化
/ g! K( `" E9 y% E7 s u; }1 ]5 k" d - // LD_AsrAddFixed() 函数实现了添加关键词语到LD3320芯片中( P$ u# ^1 Q: S/ w% D0 s/ k
- // LD_AsrRun() 函数启动了一次ASR语音识别流程
8 b: X( m; h5 |- |. |$ l& Y - //
" Z" v4 Q, l, M$ k' a8 E2 J - // 任何一次ASR识别流程,都需要按照这个顺序,从初始化开始进行
7 T4 b6 G( i. W; @" ~* I5 p - /************************************************************************************/
3 \! u4 {: _6 `1 ~ - * {# \5 k+ R( E; a$ H1 e2 I+ M, P
- u8 ld3320_run_asr()- r \2 R5 d8 r/ E
- {# M) @) _% O) \$ i% ^: j
- u8 i=0;
* F8 |# q" X3 v ?# j - u8 asrflag=0;9 A1 ^! V8 g9 B ~/ j* \8 n
- for (i=0; i<5; i++) // 防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程 ^5 d2 a2 w& J, g1 L
- {
9 g3 Y5 z5 |( }8 J' W$ Z - LD_AsrStart();
~% g5 g% F i+ y' x5 O+ g' u/ ?1 w - delay_ms(10);1 i5 m' }; ?7 H. @/ z2 v( K& t
- if (ld3320_asr_addFixed()==0)4 z, q# Y2 E8 p1 @" Q
- {
& S1 i3 E4 n5 _3 v$ C - ld3320_reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片9 S" A" M# D y% Y3 q
- delay_ms(100); // 并从初始化开始重新ASR识别流程" G( }# C9 u- J4 v$ D; F
- continue;+ K, z3 H1 |$ z/ j+ x7 A! A% I
- }
" M' k" O- f7 T4 E$ s - delay_ms(300);
6 f; \1 J) {: Q# C; \ - if (ld3320_asrun() == 0)
# o/ W. i5 t; f4 r% k6 r - {
; m9 P: k% y: t# b3 H& z$ C! }' \ - ld3320_reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片5 g+ u* x+ o( Z' ~
- delay_ms(100); // 并从初始化开始重新ASR识别流程
- D( y+ @% \& ]& l7 d+ y& [) H - continue;
% g6 o6 |; M2 o( s6 s2 x' ] - }
A) D4 g7 b4 `3 c4 m C
0 p" a6 |6 g6 Z3 j5 @* l" I- asrflag=1;. {" q# D) c6 J5 \. c' e$ c/ U5 ^& |
- break; // ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
$ v: W6 K9 }- g, d* B2 l- l2 A - }
: _- n* o9 J' t4 | - ; \3 ?2 `! { ]& D7 s2 L+ p8 P
- return asrflag;6 v+ O3 P9 o/ O% u
- }
# |9 w" a+ p6 ^9 c2 |% V+ k - 3 {! e# Z z0 S7 F! |
复制代码 % |7 W5 T, T; G' |1 g$ x/ @
LD3320.h' }& K. U) p$ ~8 n ?
5 @9 @0 h7 p4 f" K- #ifndef __LD3320_H 6 X& A) s( O9 l: Z* J
- #define __LD3320_H
5 D# _3 @: D1 Z0 U; |, K# L+ S! a- ~ - #include "sys.h"
. p) l; A/ Z, x; f8 d
' Y3 ?( E* S6 ~# q; `7 l8 R2 U- typedef struct' K! c& c$ v5 m' y% r* g2 g0 s
- {6 P. ]0 l7 s/ T, D8 N; a+ t0 A
- unsigned char b0:1;
. x5 Y1 m- n( U0 J- h: W - unsigned char b1:1; 9 q3 z: b; D" p! ~2 n
- unsigned char b2:1; 6 L5 f+ C% _. D2 U3 Z K
- unsigned char b3:1; " p" Z1 V$ M0 H9 X- s8 m, F1 L
- unsigned char b4:1;/ h4 w1 q* k) d' B- O" ?
- unsigned char b5:1;, X. l. W( D! E# L$ x+ N
- unsigned char b6:1;
. e- R; E1 Y6 \; { - unsigned char b7:1;$ @) z' c5 ~' S: S/ N
- } BIT8;
% \% v, z# f) j - 7 q3 I: L' w1 S% e
- extern u8 ld3320Data;
; g; a* o B! o( N - #define bita0 (((BIT8*) & ld3320Data) -> b0)
. N$ `& f- O; d7 g2 J - #define bita1 (((BIT8*) & ld3320Data) -> b1)
7 N' `, D( {; }5 ~: F+ R - #define bita2 (((BIT8*) & ld3320Data) -> b2)
1 w8 r' H1 F, `) L5 J+ o - #define bita3 (((BIT8*) & ld3320Data) -> b3): d* U# |/ l9 X" d/ I
- #define bita4 (((BIT8*) & ld3320Data) -> b4)
4 W5 D; p0 h% G2 `9 ^; f6 T* S7 _ - #define bita5 (((BIT8*) & ld3320Data) -> b5)8 T j# _% J! t1 v
- #define bita6 (((BIT8*) & ld3320Data) -> b6)# I- e8 s. F/ i5 `
- #define bita7 (((BIT8*) & ld3320Data) -> b7)/ ?4 o- i) _$ T4 }
- 9 P* U* g% F8 P
- 7 ?. Z: V2 K( `$ N
( J0 h t% w$ e0 }- * w$ U% ]5 X2 P" {
- #define LD3320_A0 PBout(15), f: t4 Z, o& q1 {0 @+ O- f0 I2 J0 t
- #define LD3320_RD PBout(14)
) D* @- R: Y* T) [4 }6 c - #define LD3320_WR PAout(12)
, U# }9 ? A3 K( u1 [4 M8 p) g/ A7 A+ O# j - #define LD3320_CS PAout(11)! e6 a2 t8 a _4 m# Q
- #define LD3320_RST PBout(10)$ R! _) u/ R! H
- #define LD3320_MD PBout(13)
1 e" l0 a8 d+ c2 g7 i4 f - 1 |* H( R9 f$ r
- #define LD3320_D0 PBout(5)# E: [& _+ {! |: ^" d v _6 g- Z
- #define LD3320_D1 PBout(4)# J) j; W$ \% ]3 [) X1 f. p7 {
- #define LD3320_D2 PBout(3)5 x1 m! q3 Z/ H
- #define LD3320_D3 PAout(15)
! R' u. l* G2 R7 n - #define LD3320_D4 PBout(9)
% P" {3 C8 i- Y5 f* ~ - #define LD3320_D5 PBout(8)
# D& \$ x/ u* k - #define LD3320_D6 PBout(7). F; ?3 X7 ^% A- k8 k' [5 [2 p
- #define LD3320_D7 PBout(6)% r) B% x, X- w: V: s0 C9 q
+ a6 i. ]3 @9 u. ]- #define LD3320_D0_R PBin(5)
. J2 D, \ v, i. S4 d - #define LD3320_D1_R PBin(4)% z2 P* D& A# B' R7 M: o6 I8 A o
- #define LD3320_D2_R PBin(3)+ Q+ k4 ]" W( m" z0 O
- #define LD3320_D3_R PAin(15)
0 b; i4 u. l3 S# `( Y - #define LD3320_D4_R PBin(9)
9 O8 F* E4 {! H3 W - #define LD3320_D5_R PBin(8)7 ?; \$ A; f2 I" i, F2 s, j
- #define LD3320_D6_R PBin(7). R2 j J1 z9 e7 x! s* ]
- #define LD3320_D7_R PBin(6)6 |! l3 d# i9 d n
' b" W: r) C) x5 W- , [# {7 k1 e( A6 A6 j% f
- #define LD3320_DATA_IN() {GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=(u32)8<<28;GPIOB->CRL&=0X00000FFF;GPIOB->CRL|=0X88888000;GPIOB->CRH&=0XFFFFFF00;GPIOB->CRH|=0X00000088;}
' P3 B- B' E! D. e$ g - #define LD3320_DATA_OUT() {GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=(u32)3<<28;GPIOB->CRL&=0X00000FFF;GPIOB->CRL|=0X33333000;GPIOB->CRH&=0XFFFFFF00;GPIOB->CRH|=0X00000033;}9 n2 D% W2 w( T$ H- e
- 6 ^) x2 \' Q% ^6 Q5 ?1 ]& {7 v! N& o
- h$ r+ d" e) K* ?( E1 F
- #define LD3320_DATA_WRITE(x) {ld3320Data = x;LD3320_D0=bita0;LD3320_D1=bita1;LD3320_D2=bita2;LD3320_D3=bita3;LD3320_D4=bita4;LD3320_D5=bita5;LD3320_D6=bita6;LD3320_D7=bita7;}3 M4 O9 H0 V! O W; g
- #define LD3320_DATA_READ(x) {bita0=LD3320_D0_R;bita1=LD3320_D1_R;bita2=LD3320_D2_R;bita3=LD3320_D3_R;bita4=LD3320_D4_R;bita5=LD3320_D5_R; bita6=LD3320_D6_R;bita7=LD3320_D7_R;x= ld3320Data;}
! O1 {1 b7 [: k' J. L - ) {1 L; G$ w7 ^3 ]
- 9 Q1 S; J9 a9 T( E0 w, E- I
-
0 n& y) U. {& D! i( d5 P - // 以下三个状态定义用来记录程序是在运行ASR识别还是在运行MP3播放
1 P* u- j, m" I8 i3 l - #define LD_MODE_IDLE 0x00
& V; J5 y" f3 T- O% J6 I8 B% d - #define LD_MODE_ASR_RUN 0x08
/ U/ V( X3 K" ]2 [ j% j! l$ D9 H2 ~" g - #define LD_MODE_MP3 0x40 j Y- a. l* Z
- 3 R# C ~6 Y V
' D, J. q& A/ T$ U' d! S6 ^- // 以下五个状态定义用来记录程序是在运行ASR识别过程中的哪个状态' `6 Y/ O, y+ J4 |: p
- #define LD_ASR_NONE 0x00 // 表示没有在作ASR识别- W" O( B) J8 X
- #define LD_ASR_RUNING 0x01 // 表示LD3320正在作ASR识别中( u# A% I. G% Y+ W: m
- #define LD_ASR_FOUNDOK 0x10 // 表示一次识别流程结束后,有一个识别结果
6 ?) g) I% a5 y V4 S& g2 O" |5 p - #define LD_ASR_FOUNDZERO 0x11 // 表示一次识别流程结束后,没有识别结果" c0 h: z' w" d5 { {! `
- #define LD_ASR_ERROR 0x31 // 表示一次识别流程中LD3320芯片内部出现不正确的状态& m, ^+ ?& C; W6 }+ D& u9 E
% ?9 x" r! }! N% O: @! }- & ~$ t3 r$ N: b% I$ \2 {' ?6 O: C
- #define CLK_IN 8 /* user need modify this value according to clock in *// `* e1 d) X; r O' e) X
- #define LD_PLL_11 (u8)((CLK_IN/2.0)-1)
9 S5 c2 [% O9 _3 U3 B% O$ I* v - #define LD_PLL_MP3_19 0x0f3 }9 P6 X0 x9 y6 P3 q
- #define LD_PLL_MP3_1B 0x187 ]! k ?& Y& U$ W9 H2 q8 c. m
- #define LD_PLL_MP3_1D (u8)(((90.0*((LD_PLL_11)+1))/(CLK_IN))-1); S) u; A( X+ p; c1 P X
- + ]6 N5 P7 X# f j6 `2 v$ Z
- #define LD_PLL_ASR_19 (u8)(CLK_IN*32.0/(LD_PLL_11+1) - 0.51)6 O8 X- b8 k. J
- #define LD_PLL_ASR_1B 0x48- T* s' t7 O3 t
- #define LD_PLL_ASR_1D 0x1f
! k" I, }. B# H, S
: h! Q6 i5 l1 L) W0 \3 W0 L- // LD chip fixed values.5 D# e! E7 }7 Q8 X; X
- #define RESUM_OF_MUSIC 0x01- I, ~- K7 M: P) W6 B0 f$ m* }
- #define CAUSE_MP3_SONG_END 0x20
?0 B3 k( K0 A; x - % f) W: x; ~3 t+ u" f
- #define MASK_INT_SYNC 0x10/ a/ S9 a. @* e* N4 R9 l1 `
- #define MASK_INT_FIFO 0x04: Y: f2 Y3 [# {) ]# U y
- #define MASK_AFIFO_INT 0x01# w6 s% @3 \8 \
- #define MASK_FIFO_STATUS_AFULL 0x08 8 ^( D' ~ L' Z! q/ p
-
, z( {1 i) |- K1 @ -
! v0 N3 Q P7 o* T1 a- ~2 B- r: d - # j9 b6 y9 D' ?. A
- typedef enum" z$ i' F' E! m4 T7 g# i$ T3 Y
- {% v* i- J. L8 @4 L7 h6 P9 l
- name=1, //小灰灰
P3 _6 W2 I: f. O" z/ T2 L5 \ - wife=2, //你有媳妇没
& a' X8 g# L. P, |7 E9 L, ]( G - speakStore=3,//讲个故事, k! F. g; ]( S) n# k$ f
- eggPain=4, //你最近是不是蛋疼
3 F3 s3 ]$ _7 ?( `2 P - visionNum=5, //你版本号是多少
: J# g3 X2 y1 o2 V! w - todayDate=6,//今天多少号
% W4 o6 W) I$ u& G - whyToday=6, //今天几号了
* v/ w: }' u) N. L9 X - whatTime=7, //现在几点了
- x, a. D0 H& n9 m - howOld=8, //今年几岁了% }( w. m$ ?+ i
- haveChild=9, //你生娃了没
! m3 V$ P2 v, W0 n& u1 ] - openRelayOne=10, //打开继电器一5 u" ]1 z0 I! Z1 H/ R4 m/ X9 c6 |$ e
- openRelayTwo=11, //打开继电器二
A9 L0 `" L( j$ y) b - closeRelayOne=12, //关闭继电器一
9 y. O0 Z0 n/ Q - closeRelayTwo=13, //关闭继电器二. c3 ^5 C8 n- L l# q" q
- openRelay=14, //打开所有继电器
7 q; l1 l" t: \0 T; V2 _. p( ]; X9 C - closeRelay=15, //关闭所有继电器 z' u& c/ K9 w$ B4 A
- upVolume=17, //调高音量, \' j$ ~. f# j% ?% j8 p
- downVolume=18, //降低音量
: I( m' u- C& U3 C - upSpeed=19, //提高语速& [& J0 {$ q5 v `
- downSpeed=20, //降低语速
' K; |$ r# D j( Y# X - }Order;
& R0 n4 p, K+ z i2 o% ?4 p, F) ]* t - 9 l' C+ }0 K6 @9 V' d7 t
- 9 {* H+ t& r& [$ s( _ b4 w2 Z
-
( b: q, j" h) ]# B' E, L -
; j) u; J8 E& J* }" a -
" l+ }5 f9 m! L6 I! m8 T7 u8 m - extern unsigned long nMp3StartPos;/ m5 D9 e B: I' I* c/ \) k! Q6 V
- extern unsigned long nMp3Size;
, v' \) j$ M0 G3 D$ T - extern unsigned long nMp3Pos;) r0 n' X2 K0 \. h1 J2 h* A
- extern u8 bMp3Play; // 用来记录播放MP3的状态
6 Z9 [0 z* E$ ~9 I9 u1 d# u9 q* g! T - extern u8 nLD_Mode; // 用来记录当前是在进行ASR识别还是在播放MP39 s( I* p9 b0 Z/ H
- extern u8 ucRegVal;* X- b# D A& F
- extern u8 ucHighInt;
( P4 s: q8 V& i9 V" W" v- M - extern u8 ucLowInt;6 l, w- J6 n1 w$ }& N* p
- extern u8 ucStatus;
( ~! Z, s' q# D# w @9 d4 I$ j - extern u8 ucSPVol; // MAX=15 MIN=0 // Speaker喇叭输出的音量
9 p, H7 w2 |8 G$ q/ v7 M( |8 G - #define MIC_VOL 0x55 ! C" C/ n) ^% a" S! N' j
- 1 q, R h. J9 c2 y9 d% U+ G1 }
- ( L3 B0 C# k5 C1 l6 l$ o5 J( N6 p
- u8 ld3320_check(void);
- i+ G6 z; }6 i& d) e - void ld3320_init(void); " c4 E% i1 I8 b5 J
- void ld3320_process_init(void);
3 y* X; s* a8 a - void ld3320_reset(void);
8 |# Z3 |! I$ x2 W& a& ^7 q A - void ld3320_init_common(void);
+ R) W. ], b% P) |4 J. ^6 A( `: B - void ld3320_init_mp3(void);' {! w' S: q3 b3 M1 M5 N0 d
- void ld3320_init_asr(void);
# n* v1 ^! f( |. E& ?/ e - void ld3320_reload_mp3data(void);
R* i2 A) n3 j& J& x8 l - void ld3320_reload_mp3data_2(void); j0 w9 g% ]+ f/ a: ]5 m1 |
- void ld3320_play(void);& V* K! F/ F8 y& m: q5 v
- void ld3320_adjust_volume(u8 val);- R _0 T/ l4 h1 f7 G2 W7 x6 ?
- u8 ld3320_check_asrbusyflag_b2(void);0 W2 P Q/ I: U1 e! f
- void LD_AsrStart(void);
. ~% |9 W% f( H2 z; o! j, a+ N - u8 ld3320_asrun(void);
, E) q8 N4 i$ y9 f - u8 ld3320_asr_addFixed(void);& L8 l- ]3 g" U& @+ v9 @# Z
- u8 ld3320_get_result(void);0 p6 Z- e# d. i5 Q
- u8 ld3320_run_asr(void);9 l: m) t2 X8 P7 l
- 4 R% K8 _. F7 r/ I$ T" U/ f
- #endif
复制代码 / \8 o$ e; v* T, ~' E
freq.c- l& w) @- j+ A& `& W, ^, s
. U0 s0 U. O& Z" ^( X+ Q- #include "freq.h"
: O. V: s `/ E( [5 `% V - , |+ g [! ~+ k7 S6 J9 w c
' |& v0 @: L& w7 j' s& [# ^9 o+ e, e, p- void ld3320_freq_init(void)
* r' l4 q# u5 `$ f( J - {: w0 k/ o( R& `0 x5 y0 s
; ^$ N" [7 N) w2 l) v/ e- GPIO_InitTypeDef GPIO_InitStructure;. F5 p& j* | {' Q) `* L3 }
- 5 k g+ `9 m# m- n' W/ r8 V
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能PB,PE端口时钟
1 H! i; ? f$ C0 [ |( e) F- v - 9 d& k1 w2 k3 O
% b- ]5 f, M$ }* b- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
9 E0 ? Q1 t& {, c+ ~' S - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;$ w+ V1 `) R( t* `0 |. u
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
b6 l e" k2 ?$ T - GPIO_Init(GPIOA, &GPIO_InitStructure);
( B0 R }# u% l# E# G - GPIO_SetBits(GPIOA,GPIO_Pin_8);1 T' ?7 X" A, _( O6 i+ g) {
- , Q1 U, z; v. W2 s3 |
- RCC_MCOConfig(RCC_MCO_HSE); //RCC_MCO_NoClock --- 无时钟输出 : o0 {1 w: a+ B4 e& B, E" a
- //RCC_MCO_SYSCLK --- 输出系统时钟(SysCLK)
! U9 R# ^: q3 T+ U( G8 z. F! \1 r* q - //RCC_MCO_HSI --- 输出内部高速8MHz的RC振荡器的时钟(HSI) ' W2 ~; r q- d" |4 I
- //RCC_MCO_HSE --- 输出高速外部时钟信号(HSE)
% I) E, { i- k" R+ U% t - //RCC_MCO_PLLCLK_Div2 --- 输出PLL倍频后的二分频时钟(PLLCLK/2)
W% E0 x l2 { - }
. E( ^/ E0 {1 J& |% [0 j: }# @9 y
复制代码
$ p& s& z5 o( Y) Tfreq.h
5 i& Q3 h$ G3 g& }5 s' ]9 ?
' p- g, J0 `2 o) |- S% v- #ifndef __FREQ_H% d" ^( j9 N6 P1 H0 i6 S+ E
- #define __FREQ_H % H! c$ h) c: R" I4 T2 }. h V$ I9 V) j
- #include "sys.h"
3 d$ Q& z& o/ C) r, g( Q* ?2 U2 w - ; `, V* s& t3 L' z8 q* ~/ o7 c. [
, ?# e* u/ J4 S- s/ w- void ld3320_freq_init(void); $ Q' x# V7 r7 ^* o1 `
- 1 k3 K, a! a& W' _6 I* c' x! @
-
% z1 n$ j5 l6 l - #endif
复制代码
8 ^& d( e6 k$ gmain.c
8 g) _1 q! s6 V. k
8 A6 q5 v) s* ~3 S- #include "sys.h"
) x" T* ]! b( g" ?: m R/ ~1 o5 q: U - #include "delay.h"
2 w, `0 {! r+ F o/ t- f* j% p* u; b - #include "usart.h"
$ Q H8 J- r8 g7 Z - #include "led.h"
- R' f3 @- U" T) F/ a+ j4 X - #include "ld3320.h"
; B# P& S ?- [2 i - #include "freq.h"6 o. ~7 H u2 f" Y6 ?. l# e) k
- #include "malloc.h"
- B3 y% ?% F3 o" Z1 M0 H6 l - 6 p/ ~' h, a2 V
- % U6 P6 g! Y$ @% a$ A& t3 v# W5 {
- u8 nAsrStatus=0; , G% j+ b' B8 h# ~2 B3 d' j
- extern u8 bMp3Play; // 用来记录播放MP3的状态
# ~# _ u. z. S
+ ?" {0 A! d4 ?) L$ Y- u8 voiceSpeed=5,voiceVolume=10;. |- z6 _9 Z i4 ^! B
9 z8 ?8 Q! B% h5 B! S- int main(void)
B- j! x9 f2 K; ?' o4 g, m - { ; W% B9 ^+ b0 h$ s1 j; i7 t9 ]
- u8 nAsrRes;! z2 y( H9 ?5 f% M+ k7 H
- u16 i;' ]0 y( _5 ]) ]( M8 F& w
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
% B3 y$ ^ @ I6 o( U W6 y - uart_init(115200);$ c9 m1 r$ v0 g7 f0 Z) M
- % R3 E/ f, V7 D/ B4 A- q
- delay_init();
( g% U9 h1 e: p' K" p! s y* m - ld3320_freq_init();
1 K9 J: B0 k) x0 d, ` - led_init();
* s8 E( N0 k% ^ - mem_init(); //初始化内存池5 m7 p# F3 y( M, [1 |3 C" P$ Z
- ld3320_init();
, _2 T1 x' q; @: [6 A - delay_ms(1000);) K3 ?% p4 v. R$ ?7 x
- ld3320_reset();3 L/ n+ @- O' e e3 h! a6 d: @$ C
- while(ld3320_check())
& l' i6 w# p" |' f& Q" A- ^7 | - {
" Y3 R- F8 s$ v8 m7 b - printf("LD3320 Error!!\r\n");6 B2 x; U. K5 d c/ y
- turn_r_led();
4 C5 D* F8 t8 C0 ] - delay_ms(500);. L% ?8 k @# @ E5 a
- } 3 B; L+ m: z6 ^, a' `; P7 }
- nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR1 X6 _) |, c2 {
-
4 @- K. z; z8 |4 }4 [2 p* N - while(1)
- n! n% l7 c$ v3 Y0 J - { / d1 R! u3 {. s7 {9 @: e3 I
- if (bMp3Play!=0) // 如果还在播放MP3中,则等待,直到MP3播放完毕 即bMp3Play==0
/ c# j* G1 g+ _5 ]* v0 \+ f - continue; // bMp3Play 是定义的一个全局变量用来记录MP3播放的状态,不是LD3320芯片内部的寄存器1 d% p6 s- \8 p, ?! i4 a+ J
- switch(nAsrStatus)
. R' u/ G* R, `2 _% [6 f - {3 \9 g4 q5 k9 [# w/ Y% [
- case LD_ASR_RUNING: break;
- R: ~2 f" I7 {+ b4 N" ?' A8 t - case LD_ASR_ERROR: break;- S' U ~. z- T0 \+ F( n- ~6 L1 C
-
5 n5 X$ g8 ~* U' @ - case LD_ASR_NONE:
- ^( t% l z6 }+ L" Y9 H$ }$ e - { - ?. j$ S8 J7 p' u
- nAsrStatus=LD_ASR_RUNING;. y: e$ Y, [8 K( t, \
- if (ld3320_run_asr()==0) " m( n; U! K" ^5 V
- {
) \" L# p; K$ n1 T( R' V' j' y - nAsrStatus = LD_ASR_ERROR;0 h. M8 \. q# f7 x* W
- }" ~ n& P& g0 v5 ` `* `- F' b
-
5 f: } M" d/ s. @; P/ [. s - }break;5 ~# g! u8 ]+ u% D) J
- case LD_ASR_FOUNDOK:* E+ j0 V# @7 s$ R4 z6 P
- {
; S1 i' t# l R/ x: t, B - nAsrRes = ld3320_get_result();
& w+ e/ r% w! c6 D6 P# b; `1 w - printf("nAsrRes=%d\r\n",nAsrRes);
, X( \$ B0 Q' W6 d- { - switch(nAsrRes)
1 h& M9 d7 y8 o7 n - {1 n- m& v: j# v- L1 B( v# e1 j
- case name:( B) j+ C0 [1 z m
- { 1 E; G- M. i) g$ b" h( F1 ^
- printf("小灰灰\r\n");
- L3 i5 C* _0 e3 K7 J7 @ - }break;
# W7 W& g8 D5 I3 g: u7 r - case wife:
% J+ l- E3 Y/ o' A- W - {
0 q' Z$ m+ b& s& b; w7 U - printf("你有媳妇没\r\n");9 A3 u# [$ F" I, H+ ~2 t
- }break;( p( y. h6 w2 z' |) i; k L# E
- case speakStore: . ~1 f8 @; X+ g
- {
2 T, N1 ~8 ]0 @6 ^' W - printf("讲个故事\r\n");
* G( W& f; o7 a6 H( X( \2 h - }break;. H3 R6 n, q, d7 c/ W
- case eggPain:
. r% b7 g& l" I- z A; u& [ - {
& \- h- Q* C. z: G+ w9 f; r - printf("你最近是不是蛋疼\r\n");. M+ Y1 x: H6 o; T
- }break;
8 U, C# ?+ b2 h4 V; W1 B5 M - case visionNum: ; K& r& T2 {5 K( y
- { # q: v, U* }, b p$ {3 T5 d
- printf("你版本号是多少\r\n");$ z5 I2 ^/ E& `! A% U% d+ I
- }break;
) R; v6 \. @" g+ c k: e - case todayDate:
1 y% {9 J9 R( ^* | - {
, v9 O( g! s/ w5 o+ y - printf("今天多少号\r\n");5 G5 o5 l* f! m- l b2 B+ L$ L
- }break;
$ @: f5 T/ ^' y- c6 ]) R - case whatTime:
$ W3 s, f6 I' y, ?, J- ~ - { - O# u/ Z$ D0 ~! K& J7 ?. k) w
- printf("现在几点了\r\n"); v4 Y& e$ \$ M
- }break;
3 v2 [+ P+ p; F. I/ u/ F% v - case howOld: ' \( O8 D2 @4 g( R; c$ f
- {
; e |) i- ~6 l+ s& `0 s - printf("今年几岁了\r\n");
& c: V+ L2 o; l; }* N* r6 T - }break;
. K! r i+ O+ N+ v' m3 q9 A% ~2 ] - case haveChild:
8 E; v T. y) Z; t; I L5 s - { 1 ]6 e+ X6 p, e" U2 A" ?
- printf("你生娃了没\r\n"); u! O; r6 K$ D. c9 F8 j
- }break;
4 d3 z5 P- b% c9 u, V+ E& a! C - case openRelayOne: ; v( Y1 i7 j- q0 }4 k7 H; I
- {
+ T1 p9 |( ^% J6 ^9 k4 [ - printf("打开继电器一\r\n");
) b* @* B- C- F - }break; D$ p- ]* r9 Y9 E: q
- case openRelayTwo:2 I" ], {9 \0 {$ n
- { % D! ?0 U; D5 w# A! g/ N9 \
- printf("打开继电器二\r\n");) D; Z" g( E5 A, H e
- }break;) q3 ?; b9 N6 s
- case closeRelayOne: 0 ?+ c/ S8 o. J# [, R. S/ O
- { ; J: J2 I3 W/ _- f, z4 O
- printf("关闭继电器一\r\n");+ i8 f( M ~, U4 {% B0 J4 R! j
- }break;1 `, ~ d* [$ k- J/ f5 I
- case closeRelayTwo:
! Z1 m0 @4 S1 ^, A+ z/ e. t2 b - {
$ i* x6 W4 X v |8 ]' T. K - printf("关闭继电器二\r\n");2 d# m( D, m2 m9 r- s& g
- }break;' a) c# g0 T3 A' m, Z9 K
- case openRelay: 9 n' j( K/ e+ \) S$ A5 g0 K
- { " P; B! J) W* {$ a0 T4 R
- printf("打开所有继电器\r\n");
. R- E: C$ Q1 F. o$ k& p$ j - }break;
0 ^- u; s6 J y; m- A - case closeRelay: 8 b% J9 P4 x, T" X& v" t- G+ F
- {
* D4 f$ a* c0 C7 O - printf("关闭所有继电器\r\n");
4 i7 u. R% ^! b! G5 f2 E - }break;
6 {' l" O% y* h8 {+ K2 ?9 } - case upVolume: + F8 ?$ i/ ~ l' h: h/ J. K" c- K8 z
- { 0 _- R: u, `. H4 E( i, H8 T
- printf("调高音量\r\n");
$ z- F0 V% K2 T2 c, P/ |5 @ - }break; " E+ Y4 e3 }4 P; S/ G
- case downVolume: ]0 l y: k8 a. ?6 W
- { + K# l8 {* C- A" o6 n( O
- printf("降低音量\r\n");- h! C: B) |; |! d+ W' i" b
- }break;
" `: \7 ^( U# `* u - case upSpeed:0 `' A; E) d0 o/ a
- { # \& h) j$ H+ H& r1 m6 y1 ]
- printf("提高语速\r\n");
' k7 n) r# `1 A9 T - }break;
8 ]& v' |- ?: ^2 _3 U2 N - case downSpeed:
! l/ h+ j7 e/ Q. p4 D3 q - { $ Q* c# V6 J- |3 Z- ]: m( H0 k
- printf("降低语速\r\n");
3 q5 L/ r9 l% N4 k' ]3 l -
+ J/ l$ u) u/ P( c6 R, X$ [ - }break; / R4 z( A- v" k9 o, j
- }7 _# L/ d3 |, I& D. ?4 r0 ^
- nAsrStatus = LD_ASR_NONE; I6 o8 o& X* t. G
- - E# C# W2 o* G% M
- }break;
( b* B% J |2 Z; a) O; r+ N) A - case LD_ASR_FOUNDZERO:
( Z: Y0 n4 o* m: K5 x- L! M! O" y4 ` - default:
( l" x0 U9 O+ a7 h - {- q3 t; X I3 x" s0 Z
- nAsrStatus = LD_ASR_NONE;
) {6 H% V# g" U* h8 L8 Y -
8 D1 l5 n8 l/ E4 t/ u/ q - }break;% @+ n! {* E" }! s% K7 c
- }
+ a: [3 ]# X6 Y - delay_us(2);6 {1 }' j* @5 e
- i++;
! j, @. F( p3 f! z - if(i>=60000)
3 q+ r9 N# v8 m" _ - {$ u% W- Q# ?7 |9 _, D- V$ n
- i=0;
$ V7 }& h: L5 k; r5 v - turn_g_led();/ l; x8 p. q' A7 D
- }
# T0 R: C; w; C3 ?9 [5 R! U2 P- I; v( r - }( s8 B7 a" c. ?( c/ t0 T
- }
' f% X1 e: K7 Z9 | - . v2 P! w. c. ?) a+ U0 F
- $ P$ H" x$ _. C) }! }7 i% |
复制代码
" w+ H$ a% I0 T8 ?! d |