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