|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:: w' k# \( Q4 _& A
main文件:
& u* k2 w. c# Z+ x# b/ U6 k$ vinterrupt void interrupt4(void)
) `9 ?; `' h$ j( V: `{
; p% k- c" F9 ] z: @% V8 h Uint32 sample;/ P. i u9 l: @; l9 i
2 f A$ V I$ k3 ~* Z6 \5 j4 M: P
sample = input_sample(); // read L + R samples from ADC
, Q( \$ U$ K* X7 z z output_sample(sample); // write L + R samples to DAC ! C3 T2 I& J* c6 T
return;% q ]; F1 h- \& Y9 n' ?
}: j* j, A: T" L8 Z
- J. U9 Y! }* M; }9 `int main( void )
& @" x. e& y2 z: O{5 J1 ^3 G) E1 C2 |+ C) e. ^
$ k9 A0 C, [& c$ r* R" j0 `
/* Initialize BSL */. C# v0 ~+ J2 W6 J' j
EVMC6747_init( );( F+ c: Y% y; G; \
/* Call evmc6747_intr function */
9 a( J& f8 p1 Z* U aic3106_init( );
" H3 \ ^# V8 u+ h+ b. C/ L while(1);( V2 p3 `; Q4 x. t
}
# ]: ], Z$ {. O7 G( b1 }$ M9 |$ x2 j, h; d8 d+ V! k
1 P0 j; ]" h; v7 @8 }; w) e
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 _5 T9 \* X3 j2 t( v
/* Initialize MCASP1 */" r) Q0 W4 g! _( g# f: b
mcasp = &MCASP_MODULE_1;1 a$ T# Z! o/ q3 K, n3 i7 M
mcasp->regs->GBLCTL = 0; // Reset- ]6 s7 u2 b: ]& ~% R( |
mcasp->regs->RGBLCTL = 0; // Reset RX
" R% f5 R$ f ] i4 F mcasp->regs->XGBLCTL = 0; // Reset TX
" x. Z3 i* k* | mcasp->regs->PWRDEMU = 1; // Free-running8 q6 w- E8 J6 U: g9 x. B4 \' |
// configure McASP0 receive registers0 U, H" q; G+ ~: x/ h0 M- H4 F
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
7 d3 i* ]$ e$ x, x# u( b2 \ mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus. M9 i8 v, x/ p( J8 R- q1 ?
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word( X) v) k9 q$ t$ S* @
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)3 ^' ^6 B- r0 g1 {: f& Z4 p, I
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
3 N# H7 \4 S+ X) U0 w' [+ X! a# Q mcasp->regs->RTDM = 0x00000003; // Slots 0,18 h) F' P9 o* H7 W: ~' A" e
mcasp->regs->RINTCTL = 0x00000000; // Not used
2 x9 b9 d/ p! s( @5 c- ? mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 i' ?; @" B3 B9 U$ B3 h: U8 y& [; o0 ]
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
' a$ v6 `3 U8 y9 n) K mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
3 K1 K6 F0 v$ O' x mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
' v5 Z% A, P: D" L' o3 h mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 E5 U# Q1 e7 s# I' P
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
) u ?# o$ G. k" G { mcasp->regs->XTDM = 0x00000003; // Slots 0,1
w: F: d( W- d( N mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
' a' P* V3 g* u6 z* v mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 o' W9 f. k0 q% `) g" y5 s/ W5 @# s" N% y0 a( I" R
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
: w9 Z' n, c' k( Y mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT8 X+ n8 l" N T6 D+ M
mcasp->regs->PFUNC = 0; // All MCASPs
/ m) g$ O: W U" ^, [ mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
5 K5 s: t" H6 `: R2 U% h( y6 V0 F3 h5 |* q. y) m, c+ z
mcasp->regs->DITCTL = 0x00000000; // Not used" m; i; i- x4 x2 i) k
mcasp->regs->DLBCTL = 0x00000000; // Not used
' h2 e F/ ]4 @) w, t% R mcasp->regs->AMUTE = 0x00000000; // Not used- {; p: D* W! K+ f+ C
8 i/ m& \ H4 G' b! a* Y8 A/* Starting sections of the McASP*/- `0 ~4 m" o0 T: o9 C
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 3 `' C! ^+ }! T. S: Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 _9 s z% j+ u* u# z mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
3 |6 L% x {8 T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. T2 N. t) N6 s& g+ w
2 d: r3 p. F+ B X: t# g9 ~. I) E mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 1 f# Q; X2 H. P
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
% E. D' O7 g( x; N3 }+ }# d4 T mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # h5 _6 D5 T# U! O1 h( b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );5 P7 R0 O E7 k3 }' {
T/ J2 U3 ^0 s6 J1 m3 I
mcasp->regs->XSTAT = 0x0000ffff; 1 h2 q9 _+ r1 B1 g' ?% \+ F
mcasp->regs->RSTAT = 0x0000ffff; * j" j5 @2 u) w& B' d
& K' T# Y8 o" K2 ?* e1 e mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 V3 {, u. f L5 G8 F$ r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 b( P1 l6 L' E4 y: g2 d
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 C$ k* o5 i8 `: Z' G7 j
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
- t% S: c* G$ t3 H3 v/ x7 I- [( E( u( R+ c" w5 ?+ G4 k! S
/* Write a 0, so that no underrun occurs after releasing the state machine */
8 o; E% @$ w* v# i" t mcasp->regs->XBUF5 = 0;
0 a) d; G6 F9 f4 w: D, E mcasp->regs->RBUF0 = 0;& o* D+ `& F T- v4 P
8 ?8 Z8 U. {# g. M( `4 S" S9 o% F, Q
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # ]0 \8 |% [0 }; L2 {, H1 }
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 k/ K& ]; f& v% m7 z. ]% c
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 s( u4 L1 m Z! y7 z" @
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
# u5 u5 D O9 z( l0 W9 @' n# v' k7 P* U' y4 g
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 7 S: ]( s' l3 t0 A8 m1 b, C0 Q4 s: j
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 {$ j* k' T% s. y2 \ mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + q% `8 `8 _8 l, N0 I0 n+ N
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" r+ K- j d6 r' m" s5 G
6 Y4 x7 u* g5 G5 a2 S CSR = 0x0000;
z* ^& x. C) U& C INTC_INTMUX1 = 0x3d;
; f5 ` H: z) `6 p# A- G* d ISTP = (unsigned int)vectors;% U/ w- d" }) U: [& v ~) s/ c
ICR = 0xFFF0; * g5 C+ b/ T* r" Y# v o( L: K
IER |= 0x12; 3 Y$ l1 h- Z6 t. L9 n4 o
CSR |= 0x01;
) V8 ^* C, r' k" G/ Q9 W2 d4 R& C
. S. C1 u. W) H5 A/ r* }" Q
( y$ K5 F. d* Y! a; k' k2 L& n2 s( ^3 x6 \- C3 Q
还有就是两个输入输出函数:
% |+ |0 W" W( R0 Wvoid output_sample(Int32 out_data)- m r" J; i9 P
{. j, }- r# W D( ?! [3 x
AIC31_data.uint = out_data; 7 I. d; x! b$ u- ], X" a! g
MCASP1_XBUF5_32BIT = AIC31_data.uint;. q1 c3 `3 |2 E0 I/ d
}
* K" ^$ m+ W0 o `: P% H1 H: M- ^) m5 z& S
Int32 input_sample(void)1 q) P L) ^8 l& C$ q( h4 ~# k
{ 6 w2 k# f& }" P5 b
AIC31_data.uint = MCASP1_RBUF0_32BIT;
* g8 D, [9 ]5 G D0 Y( O return (AIC31_data.uint);6 H: a8 O- a/ S( Z! X
}
w/ j$ [( q& ?6 l" q" Z: F+ ~/ n
|
|