|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# T$ K$ J, S5 t5 r7 K, x& \main文件:0 W4 j- y8 {( g Q% s
interrupt void interrupt4(void)
& K& p/ D! V$ I+ T7 {{
. ~% Q" N& ]2 A, } Uint32 sample;
! R" K: Z1 Y7 M6 ], R% \* f2 h7 j: d: B) q% o4 j! ^
sample = input_sample(); // read L + R samples from ADC
) n( g; R0 Y0 t/ \* g# `- p output_sample(sample); // write L + R samples to DAC
1 S' j7 f5 a2 m# h$ b) U9 H return;
( S- c6 d( d3 } |1 \9 W}9 S" i$ a& s7 V0 ]: P& J$ n: E8 e
" k+ t/ x w/ U- i. bint main( void )
8 N6 h( x% n O* s{5 r- u6 q2 I/ j5 k, ~6 ]+ ]* O. v1 d9 S
( O. y0 o: l" m; Q2 u
/* Initialize BSL */
' r, V' \0 d4 J7 @. i4 K0 H' B1 O3 W EVMC6747_init( );( [/ X8 p w' x- h$ A! X
/* Call evmc6747_intr function */
9 S9 m+ f6 Y. B aic3106_init( );# h3 p0 m: D% M. e& L, S% K
while(1);# [ L' z8 l2 ?) F8 }
}
2 O; p: B T+ Q, b/ }' ]
9 q" g( Q0 _4 \3 P6 G! j9 m5 M6 a, C. g+ v2 x! d
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题" J' |9 U b) w* w
/* Initialize MCASP1 */1 u( J9 P! u& c- ~
mcasp = &MCASP_MODULE_1;
' K; U6 O: P6 ~ mcasp->regs->GBLCTL = 0; // Reset7 i7 W* D/ R% w
mcasp->regs->RGBLCTL = 0; // Reset RX# t9 r7 U6 X8 e9 J
mcasp->regs->XGBLCTL = 0; // Reset TX
6 U/ q* B( A4 _5 i. T' }( B mcasp->regs->PWRDEMU = 1; // Free-running
6 M2 r0 d1 r1 A7 ]. N6 v // configure McASP0 receive registers' e/ z# U( k2 b1 F' b6 I* f+ p
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
! T9 j: n, h& ?* j mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) D3 H% w5 T2 S5 c/ S
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' a3 o( m- @" F( s' H% F5 L3 n mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. l& p, A5 O( V2 [5 ^; M( p& ? mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
: ^' q6 j0 l6 O% r1 r mcasp->regs->RTDM = 0x00000003; // Slots 0,18 T, i& I; m' p! o
mcasp->regs->RINTCTL = 0x00000000; // Not used0 v6 P; Q# e' u2 P w3 }; s) D8 b/ X
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256% ~- N( m0 E. \4 b
( \) K- b+ h* I2 m0 k mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
; }# `. R3 d& D; T$ Y mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus: `9 H! b& T2 _- d. x& A2 R( T
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word, ^" w) l4 b) z7 i' i6 A
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 j; r# ?9 e' _ d mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
" p/ Q# L8 X) d B- a8 y0 t mcasp->regs->XTDM = 0x00000003; // Slots 0,1
A+ a2 ?6 _( S5 i mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit3 o( b( V- }/ X! y ^# u
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: K: [7 p$ J2 S+ z! s' t' R3 p# y$ e! c# B$ ^3 g# g. |( }
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) X7 j, Z. U, n/ m mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
6 m' R; R0 u, O% y8 O mcasp->regs->PFUNC = 0; // All MCASPs6 G9 }5 @8 @* o2 J3 x9 Q a5 x
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: F! X; q$ F3 u) j% H
6 }/ a( @- N/ A1 u
mcasp->regs->DITCTL = 0x00000000; // Not used# k$ p7 u: x J6 K
mcasp->regs->DLBCTL = 0x00000000; // Not used3 Y( |. Z7 D4 t& m" d3 g8 [: g; e% U
mcasp->regs->AMUTE = 0x00000000; // Not used
X( d; {0 l+ A$ ]: q1 k7 g+ r4 T1 ^! g* |# X) `' G; O& z
/* Starting sections of the McASP*/# I* J! z7 \. o( v) t; w4 V8 x* z
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) V. _2 B2 i3 {) I% _8 b while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); ( n- @5 x$ p! ~+ G- Q( n3 H
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; / p! O+ m. U, ?/ J, f3 x$ h
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
f' m6 R- q2 }, ~- z" \+ w$ H b
: k& g% U+ i9 Y5 s mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ( ~' R, Z/ Y$ ?. Y6 N# t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); j3 y) R2 _( j7 u. o
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
Y5 X2 g# Y4 k0 s+ j; X while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );$ z/ \# e0 I: G# s0 ^* O1 N
2 G3 F4 t" G: C mcasp->regs->XSTAT = 0x0000ffff; ; S. g. q; n6 T
mcasp->regs->RSTAT = 0x0000ffff; + c. q7 n6 T7 I6 k
6 [$ m8 ~8 ~! S- a @1 c mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
) a( V# y3 f& m1 [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );' k+ ]- @+ L( F
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; - u. k& _7 V& T1 _
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
" ]3 f# S+ H# `- T5 h
- p& _3 S7 R( p /* Write a 0, so that no underrun occurs after releasing the state machine */
& v b# s4 h" z8 S: g mcasp->regs->XBUF5 = 0;5 P+ u- c& V$ S* j6 F& c
mcasp->regs->RBUF0 = 0;
* M2 M$ Z% B2 R- V- i B, `
2 v5 b9 k: f+ L P- ^ mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
! ?- R7 f8 A% X" y while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 n. @9 _/ {' Y& @0 y mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 i5 N* D$ C/ O3 u( V while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ N" {; K* e1 b j1 ]/ ~
- |6 W4 V- u Y0 X$ G" B mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ( A- N/ \% T8 M) W$ y9 e$ I l j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
' i: D1 `3 v6 q/ C# d: ]7 ?. x; E mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
) N! j: }: K" t/ \. U while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 G, i4 H7 Q4 u$ m+ ^7 `% s% h E
5 T3 z6 R/ ?+ w v) e6 }; ~
CSR = 0x0000;
$ R" b! T3 U( M9 c INTC_INTMUX1 = 0x3d;
* |5 G% v) J# s, t8 E ISTP = (unsigned int)vectors;
) t# D' [; v9 `; {( ? ICR = 0xFFF0; 2 s4 O! y) N4 C) G u7 J5 ?
IER |= 0x12;
U4 o6 o( ]7 D0 b+ ]5 L CSR |= 0x01; 4 o3 n8 }9 _7 l* r" _
9 E' h i. n7 u- J# ~
' |! _; R/ u5 m9 A- F% d/ Z
$ b4 W' f3 m+ X2 J/ e ], `6 q
还有就是两个输入输出函数:" d) J, u+ s% U8 K
void output_sample(Int32 out_data)) C7 r: d, L/ y
{
7 w" o& P9 u: d' T: x; K2 P1 i AIC31_data.uint = out_data; 1 T1 u0 x. ?" N5 c# h
MCASP1_XBUF5_32BIT = AIC31_data.uint;" L1 [( a2 s3 C4 o4 Y% q b
}
5 H. }/ Z: m4 `8 t- i3 r* g* k n8 q
Int32 input_sample(void)
0 r( I; P ?/ b: S4 j{ 8 b$ @! S7 S& ^) G3 m% Q: Y
AIC31_data.uint = MCASP1_RBUF0_32BIT;8 N o! |* y+ v2 \* k: G/ C. Q2 g( F. e
return (AIC31_data.uint);# V5 t/ \" z' \/ ?8 y8 r" x
}
3 A8 L9 }* v/ a& W4 y) l: P' M
* _. S- @! I* ^ |
|