|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:' w- j3 v% S+ x; U2 [- W$ }
main文件:6 H, c8 C& T/ W4 }+ F' r% K2 K
interrupt void interrupt4(void) ) R" D. {: {! n+ b W+ t) m" ?1 M- V X
{
4 c+ q8 z) C# H; @0 | Uint32 sample;$ s' k4 V, `! P( v9 d9 n
! a9 k8 ]0 m# K1 v+ r
sample = input_sample(); // read L + R samples from ADC2 f! o0 N& o7 c* A% q$ k, k2 G- U
output_sample(sample); // write L + R samples to DAC 5 j! w' r* b* R( |1 U7 q$ x
return;
( R: g( J/ I" e3 g$ |) o}' C% V& F- T3 `9 H0 M4 v9 S
, S5 N/ x+ C! zint main( void )
, h$ y. C2 _4 |% o/ ?{' I1 F M- m+ n4 Y; a4 g( i
) b5 k7 T+ s( W( G. C /* Initialize BSL */- \- J% `, o0 r- @5 u8 }
EVMC6747_init( );# |# _* l) E4 S# E
/* Call evmc6747_intr function */! m& Q& Q* h9 }$ }' ^1 K. t3 b
aic3106_init( );9 q' d0 l2 @! \" |
while(1);8 h2 z8 U/ R2 a. t. c5 B K; A
}& c2 l1 l6 V8 t
3 T) I3 W' u5 ^. [; c8 d4 j+ ?7 \. r" H" x2 j
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题; B1 t: d) f- g7 g. L% x( Z2 y
/* Initialize MCASP1 */
- G" |& I9 s" g7 P/ @ mcasp = &MCASP_MODULE_1;
; W7 ], I: E0 Q' J: r: M* [) Q' V mcasp->regs->GBLCTL = 0; // Reset
5 h. Q s. |- N* Y' Q/ z2 _ mcasp->regs->RGBLCTL = 0; // Reset RX
+ G d% [4 B; f. e( G) ? mcasp->regs->XGBLCTL = 0; // Reset TX
- p* ^- Q& K0 t4 b" y" H mcasp->regs->PWRDEMU = 1; // Free-running
: k7 E" u" R4 }% S // configure McASP0 receive registers2 t: U) g# l' X r7 ]3 \
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used z$ X: u: Q9 ^) ?
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; U2 d, v: e S0 X2 C. P
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word, H3 `# q4 i' v7 u
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ g6 G1 V$ H! W3 R/ _ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 E4 }. B z( E' Z7 v mcasp->regs->RTDM = 0x00000003; // Slots 0,12 T- m* e& _" W. O9 k0 U' l
mcasp->regs->RINTCTL = 0x00000000; // Not used
- M6 ~% H* X( L2 Y9 C: }9 X mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
% p, A f! U2 L S a$ a ?6 F+ ?- ~: b- i/ Q' s8 v0 B
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used+ [3 ~. X0 F+ o! O) e, y/ c
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ t8 j3 P$ r) y; L5 e$ p mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
: A3 P. l3 d. p5 T4 S' O8 U mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16$ V R& R/ Y! Y7 l
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK2 H8 T* {# c* `0 ^/ ^) {0 m
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
1 F& v! `$ i7 h5 |) q( `5 w mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit. j/ ]* e* {1 Y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& G, q# W! Z8 I1 ]
' O* R3 o+ P2 Z W/ V' i2 b9 r
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
! _% @2 C/ q4 q3 e mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT$ _6 ~9 E- _* v8 x" j' K
mcasp->regs->PFUNC = 0; // All MCASPs9 Y+ O% F2 d( j" `4 \
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 M0 b @, a) ~; I" B& T$ k/ G9 g3 s# T; {' n
mcasp->regs->DITCTL = 0x00000000; // Not used
! [# x' k5 r# ~ mcasp->regs->DLBCTL = 0x00000000; // Not used2 ^8 S U# A: X# Q
mcasp->regs->AMUTE = 0x00000000; // Not used
6 E/ f4 t2 A& L; {9 z, G- p+ Z4 I* l% G* l7 M' m7 F
/* Starting sections of the McASP*/4 Y1 i8 P, k& ^6 A
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; % Q( K6 o& t- v. v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
/ s `' g$ o8 \% u4 n mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) m6 i" i1 }& R; L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );8 g" H- a; p5 E6 f+ X8 K; T7 B' J
% ]8 s' X" U- c( I- c: w" | mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) \5 O/ G/ e: q& x! k! _# f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );5 c# Z( z! ~5 u
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # m/ o% y( f/ V" S
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* J9 i/ l9 a, `- @3 e E% e
' m- w2 a$ l; V9 ~
mcasp->regs->XSTAT = 0x0000ffff;
7 O" N( H+ k2 W* I5 z mcasp->regs->RSTAT = 0x0000ffff;
- P% K6 y% q* d! @, ~6 z7 L0 ?
% @' `" Y) |: r mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ d% D+ K& s' Z6 s1 w while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) g/ T* u# ^( D4 R/ a& u C% @4 w) m
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
* k( N# @" W% m0 G* F! O1 n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; c# o% ?/ K7 g
* D4 q, Q2 h$ i /* Write a 0, so that no underrun occurs after releasing the state machine */
+ M8 {/ R8 d; g" Z mcasp->regs->XBUF5 = 0;& R, _: u0 Z! j5 w- c
mcasp->regs->RBUF0 = 0;
3 h C4 j$ Y. R: q2 s, Y1 w0 H: D P* Z0 @5 b, S1 g
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 1 R, |0 x& R( |8 e& F
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
' A5 q$ N' w5 U9 j mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
$ N' y% B: E3 f/ A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ S* C, e& ^& S% R" F1 a3 l
1 w g7 K( A- G. v* |6 T4 Y/ L- \+ B mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 V- x% x5 k) q9 K- o S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! F% j3 ]' c0 v: f2 f' t0 q! ` mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( H' r# O8 x- X8 B" [4 e" A
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );& Z p! m x5 r" V' R, F
1 E2 @6 e/ w. U h* R! h
CSR = 0x0000;6 b3 d3 |% G# U. W" D! R
INTC_INTMUX1 = 0x3d;- F( Q2 G# O0 ^) H
ISTP = (unsigned int)vectors;
9 _1 c" w5 A" K; X$ r; k7 a ICR = 0xFFF0;
4 q1 M8 R/ m6 H0 Y9 I5 L IER |= 0x12; & e- C- r9 x4 W# d; Y, h/ n7 v; W; t
CSR |= 0x01;
2 @1 k# i" f9 G
+ m$ l) t* Q! }4 \) H7 Q; e) C% o; M% o
% R: c5 B6 z0 v# b! O还有就是两个输入输出函数:/ [( f, a0 g, f
void output_sample(Int32 out_data)
3 y1 s A. O! o{& b$ @8 | g! ~) |7 u2 ^0 O+ k8 Z
AIC31_data.uint = out_data; 9 l& M8 d: u& {, z9 D6 f0 V! k3 o% T
MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 [0 M0 p2 S' S8 i: {& t}: u. q+ n; I4 j% e
3 `4 o. v& u Y8 T( mInt32 input_sample(void)
9 I: ^9 e, ~$ B+ L) R{ $ }+ v0 ^% K+ }6 X
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* T4 Y" T; @( f5 S# Q return (AIC31_data.uint);1 @3 A( Q S8 A4 l
}
* d8 z1 m! O, Q4 ~9 e) A2 ^0 I" C! C6 U% M
|
|