|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
4 \' W" q2 o3 b; T% Ymain文件:
( E d( {2 X; q9 V7 j B5 ^interrupt void interrupt4(void) : }: r+ e, Q& u
{9 X; h: b8 B% p' U9 B7 w8 o) d
Uint32 sample;
; i# K( {$ }; c, T) m
4 N% L7 L- \6 j6 p% H- {+ d) H) A1 W sample = input_sample(); // read L + R samples from ADC
) T% @: y9 ]3 C% J* A0 } output_sample(sample); // write L + R samples to DAC 7 I! Z8 ]& h5 S* k E9 N
return;
- U4 A8 u4 b5 M6 W}
; v; s7 Q! R$ Z. I. g1 I3 L; h$ c
int main( void )) l- T+ o& S% c6 y
{9 X6 [0 f" p' | c1 P
( `, D0 `0 l$ S8 w /* Initialize BSL */+ M2 ?4 I0 p' S: p% l; R$ m
EVMC6747_init( );
3 H0 b9 C* T: V' @3 B* u /* Call evmc6747_intr function */" L5 E w9 S$ `3 n3 ~
aic3106_init( );* D( r1 a R _* _ e
while(1);
' N2 s4 I7 t2 B! L}
0 K' A! B9 V$ ]3 e5 b& Y5 z- j& }; I' N+ F' J2 x/ ?
8 n( |" @2 J/ J/ [3 uaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% [# j) _, S( T; d. { m! E
/* Initialize MCASP1 */
, t; a3 s3 e5 ~/ r: g: e7 v* V mcasp = &MCASP_MODULE_1;
$ o5 D B( ^' ], y mcasp->regs->GBLCTL = 0; // Reset
2 n0 N) y+ ~8 c' B7 Z mcasp->regs->RGBLCTL = 0; // Reset RX
, ^9 j5 ?( I/ O% A1 ] [4 v" } mcasp->regs->XGBLCTL = 0; // Reset TX$ N5 U' Z) m& Y! k: e
mcasp->regs->PWRDEMU = 1; // Free-running
: ]6 V% a% s0 u; D4 {% Q3 Z# Q // configure McASP0 receive registers7 z0 f4 l$ M/ L. v# \
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used9 X( u& b5 L: Y+ P7 W6 j- D
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
g" y5 u* L" a1 C# J mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) `- Y; h; Z+ Z) B mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
; V& Z$ V/ |7 }, s! B. A* l6 ? mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side); `* h* d/ W( u: S9 M% R# l+ t
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
) E" J% I$ T% G) l4 e0 | mcasp->regs->RINTCTL = 0x00000000; // Not used( I7 ^2 x8 H/ G
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
y/ ]% u2 m* H+ [1 T. L- t" n$ U' d! A0 y7 Y
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used1 F- Y- v# i9 P
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 b/ Z4 [/ q7 _: z: A, m mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
9 `! p, J/ e; x mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
0 `' Q, G/ L7 u% o: Y mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
d- D4 k' T k( b$ c$ s: H mcasp->regs->XTDM = 0x00000003; // Slots 0,1; e( `" l4 a. y% y
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
9 j# L# e+ e' l0 }% Q- Y' T' V mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 |& h7 Q6 r1 \
! L4 d B2 {* ?) j/ Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN5 t3 A4 a( M; M Y$ s6 C5 J8 z% y; r
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
, w/ f, C* {; Q5 X4 J R mcasp->regs->PFUNC = 0; // All MCASPs
9 I# _4 a) D' w% K4 e1 E, P mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
, \1 O3 M: z% d5 @# Z$ q# x r5 F% K4 t; f8 |, j
mcasp->regs->DITCTL = 0x00000000; // Not used
8 H7 z B$ v9 t5 L+ ^% a mcasp->regs->DLBCTL = 0x00000000; // Not used; O( q0 Q) X C: I
mcasp->regs->AMUTE = 0x00000000; // Not used: f* z$ ?, w; \' E: F& p
5 r6 F& ]6 [/ l* q" A5 U$ N- e2 `# a
/* Starting sections of the McASP*/
l% S' m8 i* ?8 ^8 d3 p' { mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 \2 X# F( k8 H# L& F: ^( P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); + D6 ^/ `) S8 ~$ u
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
; Z1 C! a+ a5 W* R1 j/ ?- f; z; t0 O* f6 b while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
9 w5 Q7 h* b7 ?
( @! I9 u5 G) m9 P mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! ^! O% x; T& D7 z
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
6 e$ Y8 c7 _- `% ^. P9 x3 y mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + K/ _0 d6 F$ N) k& |" c' B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! v" h& s: X6 }8 j9 E8 ?. u# { p! _$ x* Y8 Y9 o+ d- k
mcasp->regs->XSTAT = 0x0000ffff; ' V, g# }2 A: o% x
mcasp->regs->RSTAT = 0x0000ffff;
( e* s# q: l! F2 @- ?
7 X" A6 [7 m1 Q& U& U- s5 Z; X) ^& T: R* b mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
/ X. v2 }& C+ l @5 ~! F" [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- \5 @. O3 h% Y7 X4 A mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 6 q6 z, p- M, l# F# p$ {* N+ X1 l
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );4 L6 c0 _+ u* ?" F
- I) H4 @# g/ `8 W
/* Write a 0, so that no underrun occurs after releasing the state machine */
; B2 k! {) S: n1 g* b. J mcasp->regs->XBUF5 = 0;, j+ }. G, S/ s5 q) I
mcasp->regs->RBUF0 = 0;9 U* G& ?$ l: ~0 _4 L
0 C" ]' j: }- m* T/ R2 s+ W4 j
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 i+ n! ?1 o7 P. S5 Z6 g( _
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
* @3 p8 @3 ?2 v( ~ mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ T1 |1 K& ]/ x" g! Q1 V4 U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );3 t' \# S* y5 G1 g$ ]7 d# U
9 I+ s# m4 `+ x6 z
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 [# y( W- u" d7 _- P- y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 i8 G0 ^$ E. b( }+ b
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
! l% @& V' ^! s; R$ `7 Z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
) q- ~& S2 `6 ^8 ?7 M7 a% }* o
1 S; X2 w- g3 i CSR = 0x0000;. N/ ^* e- I1 a3 B+ ]& b
INTC_INTMUX1 = 0x3d;
. b1 D" V! W8 \; S7 I' F ISTP = (unsigned int)vectors;
: n' b1 o5 G& ]# y% [( D2 T ICR = 0xFFF0; 5 P7 M3 C" Z; N% y
IER |= 0x12; ; c( x7 W& G& `( w
CSR |= 0x01; & ^! r& d9 h9 j/ g. w
$ n+ e& y6 |3 r2 W" w
8 C6 b% E# |8 q, e4 G/ K% _$ _& a- G# ~8 ^' D8 v& v
还有就是两个输入输出函数:
! y" b5 u. ~4 w& fvoid output_sample(Int32 out_data)
8 A; a3 X( p6 q8 J6 G* T{' }/ o+ k+ c" S0 ~
AIC31_data.uint = out_data; & n1 p/ s* G: O" f
MCASP1_XBUF5_32BIT = AIC31_data.uint;! B; P+ f; E9 @9 z$ Y3 }$ s
}
8 w0 U/ |2 X, G; h8 D' \6 p, W
' H" V2 w7 |4 L; Y) Y, iInt32 input_sample(void)1 O3 x0 E+ B5 u+ @# l! u
{ j; L/ A6 Y# w: s$ h6 Y+ ?
AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 P3 Q2 n4 K9 l5 p6 j, s return (AIC31_data.uint);( {9 x$ w9 ^# t# ]1 V) c
}4 E6 D# N' w' E, q9 V' m
5 F+ b, l$ y7 R( O7 u4 V
|
|