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