|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
; P# C1 U. H& M6 Q% G) `- imain文件:
- i1 ~8 Q) d9 x4 _0 P, c8 Rinterrupt void interrupt4(void)
- |& W% K& j5 @) Z5 L( E{% M# U( T1 U' O8 x) \3 G. ^
Uint32 sample;
0 o/ e& z, [: Y) L& D/ T6 v( C" s: e5 E7 U. |
sample = input_sample(); // read L + R samples from ADC
% G$ ~3 V% ^% X% C' l x, X* ~2 z output_sample(sample); // write L + R samples to DAC
$ x" o1 |0 `4 f# p! x# a1 z$ P# P% E return;
! d% c$ b( @0 W, D. [. Y6 s* Q4 f}, R1 M7 x& z( z! k2 L2 `9 K# e
" n( q, N' Z% w, J5 s. ~
int main( void )! y9 a: o$ D; Q* E* q
{. F, m* A9 h$ d8 F: c8 a
& O4 O! P0 N6 P8 s' h% l
/* Initialize BSL */
0 s+ A7 d, A/ n+ M8 e EVMC6747_init( );5 G, a6 `4 t6 n3 l
/* Call evmc6747_intr function */
, J/ O2 f* K5 | aic3106_init( );# p6 ?! v$ C/ R6 @$ ~6 n
while(1);
3 `! k+ Y' p( a. G% j5 b9 m+ }: f}3 [! k* }9 ~" W& N8 p) \' V/ |8 U
8 J0 e4 @# j5 s2 f* ?$ y
9 {, T! ~3 e% m# _% Paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ ~3 A1 |2 K! o6 H5 }# C0 a/* Initialize MCASP1 */9 e. e. c( P. A3 q1 ^ c
mcasp = &MCASP_MODULE_1;/ Z7 S$ F: ?$ c. C5 Y+ [
mcasp->regs->GBLCTL = 0; // Reset7 H7 i2 {; M% ]* F' x
mcasp->regs->RGBLCTL = 0; // Reset RX
" h: m! F% ?+ u" I mcasp->regs->XGBLCTL = 0; // Reset TX
; ]' c3 m" q* N mcasp->regs->PWRDEMU = 1; // Free-running
8 U2 s* X6 v: V // configure McASP0 receive registers, {9 z3 D( k7 H1 z- i* e
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
. |4 ~$ r u" f+ h& o, G% Y6 H' J mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" l$ W/ n3 j. F' Z
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word# ]' Q" E/ \1 A& ~5 ~( |
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
0 E) t& q- u: [ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
7 L" @" D6 {- s0 K, \ mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 i3 G+ _4 R' _9 ?6 @' b mcasp->regs->RINTCTL = 0x00000000; // Not used: z6 V4 X& |. h$ Q4 q
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 x4 @' m, T" u2 H- g: k, ~4 g: l. e$ c, v" |- E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
: R) v- ~; x7 Z0 [ mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
2 @% |9 s7 W `0 Z- o& U* d' O mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# A! b2 R5 B- X" E mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16/ t+ U i! k2 D
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK6 r6 e# ^: j8 ]* ?; M
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
& N' C& t1 k7 D! O# r mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
p; N" o7 ~! z9 Y" j& k* u# a mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256/ x- V" r+ e% E9 E) w( j) c* m
2 a% b" b9 A8 J* k mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN6 J, {# c1 W& R7 _3 f# W8 b+ D' R
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT2 s/ g3 y3 \9 ]! \6 J; `4 P( q
mcasp->regs->PFUNC = 0; // All MCASPs# ~* f8 `( Q7 ^( p" q
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
& y. Y; O) h4 R% ]
& S2 G$ i3 m% \, a e" v mcasp->regs->DITCTL = 0x00000000; // Not used4 z* ?% g2 f! Q0 G
mcasp->regs->DLBCTL = 0x00000000; // Not used
* t+ ^7 d' H# f mcasp->regs->AMUTE = 0x00000000; // Not used2 ] a1 y* J& X1 }4 m3 |
R& m) A* o& ?, H1 g" D% z
/* Starting sections of the McASP*/" S' C% r9 H2 r) Z5 j; f- p6 Y2 s
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- S; v: k9 y# }+ D' f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ m* V& O: t; u# z3 h+ ^ mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 O. ?3 D/ M+ W
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );) P" d( @! e: _3 \
_9 ^! \& M1 a4 k2 Y mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ u" A% `( E4 o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 Q; H1 G( h7 g. l! \: X
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ ^( c8 _9 V, E7 o, f9 f/ @( i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );( e4 f0 j2 g4 T: Q( s
- Z3 \+ l% k% U3 p" L1 ?9 H, H mcasp->regs->XSTAT = 0x0000ffff;
* U, [( Z, N8 j T* X4 ]' H) S mcasp->regs->RSTAT = 0x0000ffff; % G7 q5 }$ _2 y. l$ m
5 z1 w0 M- y( n. i6 t+ I% f
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;& f# r/ J9 C! Y, V: y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
5 t2 E+ ^# U6 c3 v mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
. m$ p& f+ i6 @5 | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );$ Y8 f' Y% |, x! D# j- d
' Q2 N# G, ^1 ~( M% I
/* Write a 0, so that no underrun occurs after releasing the state machine */
# M% a0 @! i- @. @! g mcasp->regs->XBUF5 = 0;
; d4 y! J6 H" o& F; o3 C8 q, }% F) s* A mcasp->regs->RBUF0 = 0;% O+ @; {% b- s, j3 W( V/ @0 A
( q, @3 R. G7 q; d- q$ W% ~+ P5 C
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 f0 W" ~* ~1 Q9 p while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' h# @5 ?. O: M8 R; o
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; % f( m, k1 q7 g% \ X" x; R
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 B$ k" j8 c1 q$ Y8 Y
1 \6 C; @! s: s/ Y. e$ p. w3 m4 n6 z mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# }, F* O" }2 t6 @/ s; L while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 U% [" e5 J1 \
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* U, C3 ?' D0 G% ^" V, f% _/ t& G while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );- [0 e+ k) l- a
. E6 S L7 W7 E CSR = 0x0000;
3 I# F2 K6 e. `! ~5 y2 a/ \+ O: x INTC_INTMUX1 = 0x3d;
* N1 u$ S5 {0 W$ I" d. q8 U' i" N ISTP = (unsigned int)vectors;8 y: H; r2 g& \' i1 ?
ICR = 0xFFF0;
7 o- M8 g$ W! @ K6 I IER |= 0x12; 2 C+ ]$ K1 u, S! F; p P
CSR |= 0x01;
, A. w! Q3 {! p2 o' j# n! F
6 h$ n& r- w4 `" M h$ K1 @
0 ^* w9 K; X+ ` t" F% D0 ^1 l: \- I: \. c0 a: U: \3 v, j- U" m0 l
还有就是两个输入输出函数:3 A6 D: l4 \' p, }' e
void output_sample(Int32 out_data)6 u& `6 U' L, i
{; ^$ `6 ~9 @- W0 P; R
AIC31_data.uint = out_data;
3 x8 T! ^! u b, ~0 m7 `: ^1 b( m MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 {1 ^' g" h, `3 o# b, y9 K9 J}
5 L ?: W( T" i* I
7 v! M6 w* p2 }8 p V& Q3 M5 gInt32 input_sample(void)/ g' o( x2 o/ @1 A& y
{ - O' q1 B* P9 ~/ h7 A& I( z% Q
AIC31_data.uint = MCASP1_RBUF0_32BIT;/ h$ r0 J1 O4 ] S7 N
return (AIC31_data.uint);" e5 z0 q- c( G# w
}
$ K% q! L8 m: X: K
1 R7 g) ]& b. w) w |
|