|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:( x. {3 p3 z% d; R
main文件:: |2 z0 I: I1 K' ?. |) ~
interrupt void interrupt4(void)
0 j: ^ n6 X' T{- `+ A) a: [1 ~0 C% X
Uint32 sample;- v: ~% V0 y7 ?: x/ B
' s! D- X; R9 Q- N& [ d sample = input_sample(); // read L + R samples from ADC
' t3 {$ `* N0 M output_sample(sample); // write L + R samples to DAC
3 k; I9 A7 ^3 @6 [ return;$ y; R6 Y- P/ n" M0 X j y
}
+ O- c% b6 X& w6 ~
; C0 g# R& _5 X f/ v. dint main( void ). w5 j$ z, h# z5 ]: \$ l q% W* y$ X3 N5 Q
{$ V0 d& ^: @9 t. D9 T; a
7 C0 P% ^- l9 Z) w ~% _
/* Initialize BSL */
1 m7 ^5 \ K! G- c6 { EVMC6747_init( );
& F" `" Q& s P; M; a- H2 E8 c7 V /* Call evmc6747_intr function */- ^$ u* A8 M' h) [4 j \
aic3106_init( );) C/ m" z# v* h6 k" H% ]" D3 N
while(1);) s# t& ?- t$ }
}
4 r+ I% m1 a* V" b) P. [- \3 l( z2 L; q) u" u5 i
" f7 H1 p2 `/ I# L4 c5 R& G8 ?; P
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
+ T6 ]# |! j! |; r: y$ M/* Initialize MCASP1 */
Y2 F' l# i- @4 A2 K- i) k4 ] mcasp = &MCASP_MODULE_1;
% w: ^5 d* e m0 f% x! y mcasp->regs->GBLCTL = 0; // Reset
# E; ?6 D4 c; H) o mcasp->regs->RGBLCTL = 0; // Reset RX
% {. n% E# H8 [9 E4 X" ? mcasp->regs->XGBLCTL = 0; // Reset TX
5 ?7 L+ u3 O7 K7 w% ] mcasp->regs->PWRDEMU = 1; // Free-running8 \2 ]) ^7 I+ d# P, p) c
// configure McASP0 receive registers
$ h* n, B0 \, i% r9 _; m mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used& m0 m4 h- c- g/ Z# l
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus' l: E4 Y4 M. Q- x5 q
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
) `% C: j+ J5 P mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)9 x' v3 G/ V5 F/ ~; o8 ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
4 o0 b0 u q/ ^3 E/ k$ ]( e, E: B0 b; F mcasp->regs->RTDM = 0x00000003; // Slots 0,16 B O% m, D) d
mcasp->regs->RINTCTL = 0x00000000; // Not used
3 J* d% `, n- D* | mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 [1 l( d2 m. ~" c
; `3 ^% Z& s$ ^0 Y _0 F, W E
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
* i% F% H. c2 z3 d9 Z# j mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. _# H: [5 N6 @2 y mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word& n0 H' U* M6 \6 c' H, V( K3 V
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
# k/ L, u M- l) F3 P8 r6 j mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK+ K- h$ g% H H7 L
mcasp->regs->XTDM = 0x00000003; // Slots 0,1
7 f4 S! p6 A; Z6 n' b3 J mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit+ j/ e9 _, b" m
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
4 P) V$ e. m/ `0 `. U% ?9 N( N' s
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 d3 F8 P9 M' c$ y8 ~ mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
& p7 V. h- ]/ }7 a. j; R mcasp->regs->PFUNC = 0; // All MCASPs) j6 o& l- V" y. L1 f
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1/ J! u) j/ W, E% O
1 Q x$ u- D( z, M% D% ^ mcasp->regs->DITCTL = 0x00000000; // Not used
) R! X8 Y8 |$ Y4 c. U; A% S mcasp->regs->DLBCTL = 0x00000000; // Not used
; K- {3 k) j' K* ~+ q4 ^- s6 }7 M+ C6 P mcasp->regs->AMUTE = 0x00000000; // Not used8 w4 n" s8 C& n
( u4 I8 B$ s; }
/* Starting sections of the McASP*/$ u5 V9 a" v, b9 U7 D
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , l1 S0 W& m( ~/ R9 w' g3 v
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 2 p: h+ x- q% C- G% e' |- B- a" N$ J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 7 y9 |0 ~" r& Z G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );: Z1 M4 R8 g, f- n6 e# X8 a1 t' ~
& \/ J& q3 T9 J
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) k3 e. v+ U1 g z. @+ _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
^6 ~% L' W, Y Y) U mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
$ e! P8 J4 C1 `; t while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );* P% F8 R% d$ k9 H+ _
- [0 T+ j* H& Q W* t) O( Y, q2 ^) c: D
mcasp->regs->XSTAT = 0x0000ffff;
! d8 N* g; C! ~$ h% \& \( Y: K mcasp->regs->RSTAT = 0x0000ffff;
' V/ v& N9 b0 m5 O1 P" m& @* ^- d, g- Q5 Q
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 S$ q# ]3 _5 D7 ~' p4 l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );" m! B" ^4 v: T3 Z9 D; {& ~2 g" P
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
; d2 d5 w" x5 t" J/ N* L3 g1 A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );; G1 ]5 }0 J2 h! O
8 ?9 [' p S( m6 l+ R+ O; _" \5 ^ /* Write a 0, so that no underrun occurs after releasing the state machine */
) z( M8 |* c/ v% m1 }6 [' _ mcasp->regs->XBUF5 = 0;2 D8 Y7 A1 L- X
mcasp->regs->RBUF0 = 0;1 d- }' L/ \! z9 i
" ~. j& P! }0 T; n mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 ?# P- z) g3 d* i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
, c# P' @1 G: ~) W! v) h mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 `' t! @* V+ _' v8 J$ e
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );- ?4 j5 w, y% |5 @# W4 m
3 h0 K, Y: z$ `. H3 i; {& \ mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & v0 q) F1 S1 m! C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
0 C D7 c6 ?8 k mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # d8 L$ i1 r3 U( y, Q( V2 v
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
e7 p* M8 ~( ~ a+ a( N) P& m4 a1 I q9 C; c- |
CSR = 0x0000;
6 B9 F1 t( I C# G: n+ U; w INTC_INTMUX1 = 0x3d;
2 L, b9 p/ g! Z* r7 s2 b' r ISTP = (unsigned int)vectors;8 R( g3 i9 y& Z' F
ICR = 0xFFF0; ' u2 h- P) {, ^; q5 P$ O( `3 O
IER |= 0x12; 7 x4 @1 p1 s& o: i
CSR |= 0x01;
( ]# _' }% n4 w, j/ x$ k6 z4 u) p7 X, y
9 ~/ z5 M _; O* [* J& ]' _4 }9 G
! `- p" T8 l& r: z. O0 x
还有就是两个输入输出函数:
- b9 d' I/ u/ b8 g0 J% p* E) rvoid output_sample(Int32 out_data)
/ ?, Z* o3 L( z7 P }, Y( B) z{( _' }: ]7 z2 I
AIC31_data.uint = out_data;
; ^$ h# L& k( ?- F& i% M MCASP1_XBUF5_32BIT = AIC31_data.uint;
% W% ]- b+ G/ [6 y; I}
) p2 t4 t- H& _3 O$ x2 f) f. U, O, | N
Int32 input_sample(void)
4 {" J. e/ L9 b4 r* @4 z) x{
. Z# R: V8 i" z6 p) W AIC31_data.uint = MCASP1_RBUF0_32BIT;# `" K1 b( l& b% h8 z9 D3 s8 G! w# U
return (AIC31_data.uint);
/ H2 ^5 J% W( g! w6 z}' b( p+ p4 N/ D3 E6 [) i0 l1 b
& u( n- c, i; r; `4 q U! `
|
|