|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! b2 A! b" c y& `. m, B2 I% s! U
main文件:/ f2 W+ |9 v0 _$ x: }0 A M/ C( }& M
interrupt void interrupt4(void) 0 ~- E+ h2 z. \! N& T! T5 z) i' W
{- W( i) T1 G8 p( P: Y
Uint32 sample;9 x4 i, G h" C4 s5 o8 {
! O' M' k' `: C4 }9 t0 r9 P
sample = input_sample(); // read L + R samples from ADC
8 W' l* X" M% w( |3 Z output_sample(sample); // write L + R samples to DAC
1 @3 s2 r: p2 U return;
* \1 j1 A, ]; G: d& Y' F9 A# L}
, p+ }) t) W0 K5 B1 a' v) v2 ]$ `9 w
int main( void )
6 L( F! Z% y# i{6 Q% F, }" `# h3 M
$ K0 X3 R' V$ c I' _, d
/* Initialize BSL */
( |/ z+ l4 h" Z EVMC6747_init( );3 d9 p0 e! I: \6 X) |
/* Call evmc6747_intr function */& C; q0 [# m$ K$ H* D
aic3106_init( );0 R( \% L, j7 k8 l( u7 n) F
while(1);+ G' i4 y' w3 T, [
}
) t7 k' x8 j% ~4 E. E4 C5 ?+ D3 b$ q
& c& P: P2 t; C$ v l# M9 ~aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ x, X" F: P5 S9 f+ G8 O
/* Initialize MCASP1 */
$ x) Q9 K* b+ N" O mcasp = &MCASP_MODULE_1;
* c0 L* E" b6 N* q" @1 @ mcasp->regs->GBLCTL = 0; // Reset$ D5 _5 P% Q# z' d% v
mcasp->regs->RGBLCTL = 0; // Reset RX8 t @- O( m& U! {7 {) }
mcasp->regs->XGBLCTL = 0; // Reset TX; e' W! Q. V3 L# |7 Z% e) H& ]
mcasp->regs->PWRDEMU = 1; // Free-running
. j w- V5 r# J // configure McASP0 receive registers
7 |5 p% i' l# K6 t mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
& R0 ~# m! m, E5 e; x4 k, ^ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 z$ n, e6 l- j0 q7 q# D$ n; x2 _
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! ]/ z _$ B/ e! w
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ `: d; b' _/ l6 ]
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)7 o: h& x- }! A* n3 V2 U3 N7 C+ T
mcasp->regs->RTDM = 0x00000003; // Slots 0,1; [2 c6 x" l! A- q
mcasp->regs->RINTCTL = 0x00000000; // Not used
1 C, Q( K; X; h( w% {& `3 C mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 L F" t1 a h: o* f& i( S
! K) p! c2 Z d" h5 F N; Z mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 j# |' O9 ~# R' [7 j mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
6 p' h T5 Y/ Q5 ~( b* F; K$ c0 x9 K6 y mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word( Q& }$ R. c- Q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# Y* k8 Y. Z. n! }$ _) N& O mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
4 X9 [/ [ L7 c8 C7 S% p mcasp->regs->XTDM = 0x00000003; // Slots 0,1
( q0 T: \2 q9 x" m% u8 {8 w mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
) a8 U8 T) ?8 q% i9 u mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256- J: v% r e4 v& |5 b9 |
2 ?7 s. \0 K! ]1 n) \0 I" E mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN+ X: Q9 P& |+ Y
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT/ x8 @) n. I# A% K7 k. B6 u
mcasp->regs->PFUNC = 0; // All MCASPs
D. Y8 Q$ p1 K* n3 n o/ Y+ y. w mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1: h% P' J* Z2 R$ s4 r0 m
4 j- x9 \! J7 U/ Y" v- f2 O
mcasp->regs->DITCTL = 0x00000000; // Not used
& o% A4 u/ b9 A& m8 b. r mcasp->regs->DLBCTL = 0x00000000; // Not used* ]6 i C$ O5 |
mcasp->regs->AMUTE = 0x00000000; // Not used8 Q$ N$ F' R+ Q
' \, {5 y3 J1 ?& c) k
/* Starting sections of the McASP*/: R% J6 [, e- ]" _* u! U
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
: W- h1 v' M9 |7 P# w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 6 r% }! @" N' e& ^: f# [. ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
2 n; z+ i( H' }5 r while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );/ ]% G8 F' K$ i
9 Z, u5 m8 W1 ^/ F. l4 k# l8 \7 \ mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . ]/ z* o) B( w
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );4 {0 v; } B% J( e
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ H. D. `) ~7 R$ d& R) T j3 \% g while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );" f, V8 o. Z& R% n6 J9 S0 |
. `5 h0 J! D2 S: q1 b. l4 F! r mcasp->regs->XSTAT = 0x0000ffff; 7 |- k D7 o8 b. e4 r0 g5 `
mcasp->regs->RSTAT = 0x0000ffff;
5 o- v) v- o( x) S& d
% }. g V- C( R5 i# R mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% |( Q5 Y5 G$ W$ Z/ e while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; h$ V1 B. L1 r( H/ ` mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
1 \! a/ a+ V0 F. n0 }) o while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' b) b( E5 Z% [" Z y. [6 W7 T
+ u) w! P! B9 W% e* |6 V /* Write a 0, so that no underrun occurs after releasing the state machine */
, B; B, Q, J" f5 z+ q mcasp->regs->XBUF5 = 0;, q8 x3 H5 R2 i. j0 P
mcasp->regs->RBUF0 = 0;. Q9 j+ I" g3 X" T
" j. j( a r T. w( I; P8 ^
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! h+ h& a0 y3 i6 l2 F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
0 |& A. Q) Y9 ]5 l; {! N$ ~8 `. W mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
6 Y, c8 X! p- `$ m while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 E, D6 t% ? {: f& d0 \% J7 N. Y6 C5 r
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
4 T: c: D8 i6 m" [" m while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ B( X" G9 r" F1 E% U mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 A/ e; L9 c! @: k& \0 q: E while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
7 c% y4 h' z$ U8 E* R4 y; B( I$ X8 R
CSR = 0x0000;
; O6 v- F* l9 \- k+ O9 l8 x& H INTC_INTMUX1 = 0x3d;' W9 V/ u" y3 n" a/ p. ]. U
ISTP = (unsigned int)vectors;3 ?8 Z% m; u; b
ICR = 0xFFF0;
! D6 Y: v" j/ E0 b' b IER |= 0x12; ) K( i# q" b2 }
CSR |= 0x01; 2 i3 r2 J) n- I# q3 i, @4 d
7 \% G0 X/ F0 Y+ R" |
' n) k( t0 B ]. j$ U7 G) g. V$ e$ n! `/ A
还有就是两个输入输出函数:+ ]5 L8 s5 m# t) v5 n
void output_sample(Int32 out_data)" ]( J' h" ?! A) |5 G
{* z; Z. C4 T, D `1 j
AIC31_data.uint = out_data; ' Y" Q" E& V; _0 r- f% W
MCASP1_XBUF5_32BIT = AIC31_data.uint;( T8 s" W9 \2 g; I
}* B: d( b$ D) M2 f' w t4 j9 ^
c7 ~4 N; D4 {8 r0 Q* L" N# [
Int32 input_sample(void)+ r9 ^! n0 k+ V% Q) r7 I9 U
{ 1 e3 D2 k3 i: G2 z5 a7 {' G
AIC31_data.uint = MCASP1_RBUF0_32BIT; u) S! g" U. `( F: F2 w
return (AIC31_data.uint);# }1 G: W8 F5 X
}
4 W/ _9 N- V% `/ R0 V6 k# }' k# o% Q8 s7 ?* N
|
|