|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:% y9 O/ ]# L: f' B
main文件:8 c8 G6 ?1 N! q; {3 c( p. M& z. Y7 K
interrupt void interrupt4(void) 6 V( X1 i7 q8 A; r [, d
{
7 G& Z' c. G8 S7 T! [! x Uint32 sample;9 X K1 ^! Q( M% U: `
" O, U" H$ |) Q: B: E d3 b3 T
sample = input_sample(); // read L + R samples from ADC
- ?& s# o1 I8 R% ]$ z output_sample(sample); // write L + R samples to DAC 6 X D% l' |; l" }& i' u& @
return;5 w9 Q. M; @" z& K* m
}6 I* c2 f9 r; W, ?; P
! O" Q, V: R8 C: G! Yint main( void )
8 i& T9 F* [* ?% E{
: `/ z7 K9 ~- M9 [: k- L! i
0 k* i; b# B) s0 ?( V$ M /* Initialize BSL */( h0 D* c$ ^* n6 p) x( n& l
EVMC6747_init( );7 l4 L8 l+ u: A
/* Call evmc6747_intr function */- s+ f8 s( D; O9 o# p
aic3106_init( );; p5 G2 `6 k; T* s( r0 d; P- @
while(1);# I% X, G8 p+ N3 H/ l% I( t
}# p+ i/ v2 X, N: k6 E
9 i6 [- U) o* k9 T" U/ k' K7 T9 d. K0 d2 P8 B1 r! K' o! ~! U
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
' E- }+ o+ e/ g& o L: C0 |/* Initialize MCASP1 */9 F' q P$ o( i) A% E* v! W2 {6 q% n
mcasp = &MCASP_MODULE_1;
: w/ P+ b7 D& M( ~$ [ mcasp->regs->GBLCTL = 0; // Reset
# c. Z+ Q4 U# ?" { X mcasp->regs->RGBLCTL = 0; // Reset RX
' V- |: m0 d; P( D5 a8 r mcasp->regs->XGBLCTL = 0; // Reset TX7 x, R j ?9 D* Y2 X
mcasp->regs->PWRDEMU = 1; // Free-running
7 w6 @, f, Y1 ? // configure McASP0 receive registers7 Q4 Z$ E0 n4 ]3 h/ E( R! {4 y- G" M
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
5 ~& A4 t# w+ Q: }+ U$ [ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus4 J" P! B9 @: S( ^* j& Y5 U
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word! S) F% I+ v+ N2 \$ j8 g
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: D# W0 u! ~9 ]3 @ mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)2 w3 r& N4 \" e% @- O
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
3 W5 h% f( v: k3 M2 Y9 x5 e mcasp->regs->RINTCTL = 0x00000000; // Not used8 A+ ?( \0 n* b% U5 y, i+ H
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
+ u- c* n- i1 G3 h8 _" ~5 V# J; k, s5 a8 [) ]( Q
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used. D' E0 I$ f) K) G
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- Z) v8 ~, `/ m8 f1 l; r
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# \ A1 h* k$ J mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
& ^, Z0 w" z- a2 b/ R/ b mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
: Y# x' @; O' E) l6 D mcasp->regs->XTDM = 0x00000003; // Slots 0,1' N; [, s0 d# Q4 v5 @" k7 e& x
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
$ u6 [$ t; _* d2 P8 W mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( b2 }* @+ J" X8 f2 O; o( A
, \7 c0 E6 ~ d2 [+ X mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
5 {" ^' K" ^. M6 }! M& B mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT% M+ w( J0 Z/ Q! w
mcasp->regs->PFUNC = 0; // All MCASPs
0 d! }+ N. C1 R7 ?$ K mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 i! }/ k. t: e$ P/ D: M) h3 }3 i" k
0 B+ |7 \( f3 B4 T8 p1 l6 j+ q N mcasp->regs->DITCTL = 0x00000000; // Not used5 y, m" J( n$ X& f
mcasp->regs->DLBCTL = 0x00000000; // Not used1 ]$ L2 p5 O( N8 y: T2 N
mcasp->regs->AMUTE = 0x00000000; // Not used
3 g4 `7 u2 s3 o% N/ L" B) \
7 W/ s1 I; ?6 I: Q1 T+ W! ^, Z/* Starting sections of the McASP*/
- q0 w( G" c: u mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; f) W9 s8 i4 m# s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 9 A+ o7 j' z9 c1 A; R, C# Q ^
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 2 ~" U. y6 r" C! T4 r) c+ w
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; F8 C: N0 M d+ i6 H1 l8 E I' b- s, K4 J8 c
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 0 J% _+ r0 e! e# T O
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: J+ u+ ~, \: m; c mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' _6 f- r7 m3 M while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );0 Z# l& o$ ~( k! y! A
- `. @" O) v( z2 O6 x! k2 x mcasp->regs->XSTAT = 0x0000ffff; 4 Z3 [5 U" Z- J, K) S
mcasp->regs->RSTAT = 0x0000ffff;
7 Y' l+ m; |- o$ u) s& f4 z0 d# u; m
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ v# C. i) i% f! z while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );% c- W+ O3 k* s) I3 |: B
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) ^2 S) \9 a6 \$ E9 ] while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );3 ^8 u& r% b9 u4 r# Q5 C
; q$ @! C7 O7 S: [; }
/* Write a 0, so that no underrun occurs after releasing the state machine */
: M8 m9 E! r5 Z$ t5 ?; @ mcasp->regs->XBUF5 = 0;
4 Z, Q8 a) f/ o0 s; t+ f mcasp->regs->RBUF0 = 0;
$ D0 C( G! u+ S; |' p& d+ g1 V. D/ \% m2 l- `
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 3 Y% ?6 n5 h1 d; c! r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
! K, |4 e8 L4 ]" ]! I9 i2 \$ z9 c9 O mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ' \+ y1 i- x& r! d1 G: ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );, {8 w- Q" O) P% W' s% _
- O8 ]/ `7 r( y$ y, d mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; " D- L- j" s! a0 B
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );* W9 R# V( D8 U; q& T8 Q3 ?. L% s: `
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
6 K8 ]5 V) i s" M1 h- E& j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
& u4 K+ v4 F7 s
2 _5 L( \4 B" W2 Q$ z; a9 b CSR = 0x0000;
; X0 ?, E: p' b5 K$ D5 d$ [ INTC_INTMUX1 = 0x3d;
+ ^$ ]3 @1 w: r! l; N+ g1 E( L ISTP = (unsigned int)vectors;) o# j8 t- J/ q8 G0 D
ICR = 0xFFF0; 3 g0 N: s1 }+ k1 J1 f: p. f7 c
IER |= 0x12;
+ E( B% [' v) N* [: r4 z CSR |= 0x01;
0 a; x. K. A) I! C
) O7 V& l; c# }% ^, W7 w
, Y: [7 F! W4 }0 v: T8 m( m) {( C9 y$ s6 `+ g$ f
还有就是两个输入输出函数:
& Y* Q7 u& u7 L) L3 evoid output_sample(Int32 out_data)& u T+ n! ?1 P2 G( v3 r: c# Z
{
% N: V6 P [3 P- D- u AIC31_data.uint = out_data;
( P# D! M* n7 g% u" h MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 l7 O }: Y5 m0 q}
7 R3 V% E+ i. U7 K& g% G5 o5 v' R# G* R* B' t7 S
Int32 input_sample(void), k* f' E I) Q/ K% d+ L
{ ! A: e5 L% k1 I: z
AIC31_data.uint = MCASP1_RBUF0_32BIT;
( w& {* t, F$ D; [' z, M return (AIC31_data.uint);
! G2 u O; _) x. o}, z ~7 A! l6 k& {2 {8 w
% M& C7 k' j' m c) q) e7 K |
|