|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
& s n2 E0 U8 t n5 T/ \main文件:- W. S/ ]: ~ v, v5 L' g+ j
interrupt void interrupt4(void) ( g$ Q' C/ ?, [6 C( [3 Y. d
{ ^9 C7 y& [7 F
Uint32 sample;
% w! T6 J, T/ ^" \% d" J+ J: A2 ~
7 y% v- [. U) @% r7 F. b0 j* y' \ sample = input_sample(); // read L + R samples from ADC
$ e3 i& Z" b3 Y% j- ?- c output_sample(sample); // write L + R samples to DAC % p' R3 E3 }5 {4 v% x7 {0 g
return;
0 q1 c' H1 [8 P5 Q' w}
- K! e" W) r \7 t2 F1 p7 x5 c% u9 `/ s. z; z! [/ u- @" J7 M
int main( void )" q, d* _# i6 B8 M6 q
{' c5 Z* x' o: ?! s
! a' R8 n% L8 w1 F, ^ /* Initialize BSL */
* S- U8 x( |! e& H) y; x. ~# B EVMC6747_init( );
1 p' j4 W4 f; ]. J- [/ u7 n /* Call evmc6747_intr function */
9 i8 B i7 u1 m" ~ aic3106_init( );
( m$ G, L8 u. |2 M) V while(1);0 u% \* X) m5 ~5 J% j$ N" w
}9 X ~$ i$ U* W0 D) {
$ d) v% e5 z7 G- B }- H! r+ C; t z) s4 G% E( d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
& Y8 c+ r" o& X0 m: m' `$ ~" b/* Initialize MCASP1 */
, E/ X2 O7 O- @! M mcasp = &MCASP_MODULE_1;3 D0 B% a% t! D7 T8 R5 K3 g/ S* |
mcasp->regs->GBLCTL = 0; // Reset
# [5 c1 m# ?; k5 c mcasp->regs->RGBLCTL = 0; // Reset RX
. P* f3 A5 K2 H mcasp->regs->XGBLCTL = 0; // Reset TX3 \7 \* {: g% l: X9 r% j& h
mcasp->regs->PWRDEMU = 1; // Free-running
7 a/ @2 u) y1 R0 ?( n // configure McASP0 receive registers
/ p5 e" k- {: Q& ~- c" H" g, D; s mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used7 k9 q* j7 z6 m" N8 M4 }
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus, Q9 b2 n {9 }% Y% y- `$ L) y
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
# h8 `- m5 A+ ] mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
& P* N* L. g# g( S) W' Y) H mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
/ f) g% ]0 |4 h2 z U( P% v mcasp->regs->RTDM = 0x00000003; // Slots 0,1, Y( J/ x9 }6 G5 y$ ]- O: v8 u
mcasp->regs->RINTCTL = 0x00000000; // Not used
( Q/ |0 x8 O5 F mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
' t+ @7 s, x2 {% _* r7 l
% C3 @2 k# ^. f w mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used# G/ Q& V- i3 Q$ Y) |
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus8 Q0 l9 B5 s( x6 R$ u1 E8 @
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word* u/ I$ P! z/ Y, q" V( J( t, t- c
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ m2 {6 P5 |% A: C1 \
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK' M* e, l' K/ ^- r1 I9 u
mcasp->regs->XTDM = 0x00000003; // Slots 0,16 l/ O/ z8 ~' R4 u
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
" v* n c% O/ ^6 e mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ F8 H$ s7 v' i: Y" q, ? m
* P/ ~+ a- _9 I: o' T* ^) a$ C mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN7 Q: Z4 k* l: c3 V% a5 B% }
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
* H& t* w4 W6 T mcasp->regs->PFUNC = 0; // All MCASPs
1 x( ^5 b$ b' C1 P' Y c% q mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
8 w$ C/ `8 c) r/ G+ Q' c( b5 G7 }4 _! K2 h6 [/ m
mcasp->regs->DITCTL = 0x00000000; // Not used; [1 q+ Y8 _( X! h
mcasp->regs->DLBCTL = 0x00000000; // Not used
! w- `6 }5 {3 |7 h4 _3 p7 }5 f mcasp->regs->AMUTE = 0x00000000; // Not used
( @: A, O) K% \% Q
1 Z6 Y- r" d4 Z; [( z! O/* Starting sections of the McASP*/( v$ a# k* x, R: J/ ~8 y+ y
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 w" b8 y; G3 Q0 Q) F3 r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); L( e6 N& f( q, }. G# F# F& h; c. w
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) l3 W) T3 s% [# M2 [* {! M
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );! p a: d$ K7 \' ?, C
. o. p' w- S1 \6 x% J mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 z% l& }; `; ^+ j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
- E3 b/ V; ^! b- R# O( Z mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" x# P. _6 ?& w6 Q/ U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
0 d3 s/ j$ W' g/ ]6 d6 ?3 ?/ G9 m* v/ k+ V) u( R* c# h. E" P( R2 ~( b2 f
mcasp->regs->XSTAT = 0x0000ffff; - h% C! p; _) g* Z- r8 l# v
mcasp->regs->RSTAT = 0x0000ffff; / h% ?$ X2 a4 R8 w' |. m' Q, T- g
2 z _ F! V. W mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
# W; J! r* L( v while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, R5 A: k& x7 ]+ l, K+ W mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ! \8 v" p! H3 J. I; A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ d4 N3 V9 `1 d7 C% A
6 O3 N9 H1 E7 O/ _ /* Write a 0, so that no underrun occurs after releasing the state machine */0 W! E# e9 F$ x* |( t3 S& ]
mcasp->regs->XBUF5 = 0;/ K$ _" Y% Q/ [- R, B
mcasp->regs->RBUF0 = 0;& Z6 l. j4 p2 A& x1 J5 p, j. l. D t
9 j% Q/ a4 c, ?6 v( H! t% b% C) l! n mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) G. c h; r! ?+ P# O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% n& q$ S2 n5 ]9 k0 ?* l( Y mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ j7 e$ c, |. m3 X$ _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( f- J4 {( n0 z7 }- Q( m3 G; |
: k1 I( _/ ^3 [% A5 @ R# u5 r mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
& ^4 L8 | u) N6 a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ |! ~0 O. T1 Y7 u
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ! z5 ?% O$ t- L# e/ |+ `
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" e6 I0 w2 v) o; P& O5 f1 R* b7 _6 y8 U! L
CSR = 0x0000;
" j" Y2 K4 Q7 h: s INTC_INTMUX1 = 0x3d;) U/ K$ K. m& X* |9 d$ H* `
ISTP = (unsigned int)vectors;* D g; Q1 F! K/ J L( A
ICR = 0xFFF0; : z$ S0 [+ p0 n/ y
IER |= 0x12; # b; d* y- M- R
CSR |= 0x01;
1 }+ k# E l" C; T- ~3 W9 @& ^" U% Z% b* r, z
8 n! D3 S6 Y2 K9 w6 U4 E
4 S. B- w. Y( W9 I
还有就是两个输入输出函数:
1 T/ s: `3 J4 h Ivoid output_sample(Int32 out_data)' M* \( w6 e, C4 ]3 f5 i
{
9 M4 ~9 v$ j8 y AIC31_data.uint = out_data; ' T. G1 s2 m0 t T$ t" h$ f
MCASP1_XBUF5_32BIT = AIC31_data.uint;( m, I+ i" Z5 |6 w+ I/ w7 d
}) f7 y0 s& t$ b
; T/ b7 \+ K. q- I# |Int32 input_sample(void)
8 W6 H) @- ~7 A/ h+ `3 x, X{ 0 b# X! h! O0 y. o+ y/ M U
AIC31_data.uint = MCASP1_RBUF0_32BIT;& H3 _+ N7 J) }3 Z' U( K: G# r; G; A
return (AIC31_data.uint);9 e: b; t6 T' {$ R7 X& t
}
# I( l9 b0 S' N$ P# K, }* P7 O2 a* u# v! f0 X8 C
|
|