|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% ^& R; ^6 c k( _main文件:, C( u$ b9 m; k% ?$ N D2 Z2 F# ~
interrupt void interrupt4(void) 3 f+ z2 _$ u3 O( n0 o
{+ c& U+ ?- H7 D
Uint32 sample;7 \+ \" T& ~8 t5 {9 V% j
' E5 i" t# s" A" h2 {* ?( a. t
sample = input_sample(); // read L + R samples from ADC, k, C3 Y: Q8 v, H4 o9 R5 v( J* R
output_sample(sample); // write L + R samples to DAC 4 G/ _9 n% E( `. Z
return;+ ] o( k! w, l1 k4 E: S; Z f" x* L
}; g3 V" {5 Q6 M, r. S
* b2 q0 l' g6 m9 q3 L
int main( void )* q3 C- V Z# |. p
{
& h0 U8 g6 O3 I+ g) A" a
& P" A) H( A6 A% C1 B9 f3 @ /* Initialize BSL */' Q9 h0 i j; r2 Y& ~
EVMC6747_init( );! `. |9 Y% O+ t( C
/* Call evmc6747_intr function */5 s, c! { D# k7 M9 w! i' s0 z
aic3106_init( );
; C3 C* q9 H, F while(1);
( b: {$ p4 R$ H5 K" R( I) G5 k, L" c}0 Z( {1 `" J; M l" D
& u6 P0 s: I3 q! m7 r! h
; N8 a. e9 G2 K8 w9 J
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% Y# [" B3 ~5 ?% \1 o9 e
/* Initialize MCASP1 */, A& q1 H. i6 K. u
mcasp = &MCASP_MODULE_1;/ w! l! i% y' q- Q" B3 y8 B! j/ R
mcasp->regs->GBLCTL = 0; // Reset
/ ]1 H3 {* b& e0 l# ?" N/ X8 N mcasp->regs->RGBLCTL = 0; // Reset RX
2 h0 N Q% R; v( M0 i9 y { mcasp->regs->XGBLCTL = 0; // Reset TX) g8 |7 _3 e2 Y1 X6 g
mcasp->regs->PWRDEMU = 1; // Free-running
3 u" _9 A4 f5 q$ v: o7 b // configure McASP0 receive registers/ r% t. p$ E7 G9 B) b; ^
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used4 {" t5 J& C2 R5 [2 L
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 B5 s' T1 B" u mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word) o2 D' ~9 w, G2 q: `
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 ?5 ^: f, \: k& m, g: U mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)3 c# w+ ]/ q, N; W9 \& ?- o
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
: Z+ m: W# S! L Y! S$ }- ~: | mcasp->regs->RINTCTL = 0x00000000; // Not used( P3 @* w# x c( w% F
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 N' U" E$ ]2 K5 ?3 i8 t( W1 x; l- v0 G
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used" \: E& t; N& p
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 G) l2 V- s5 O
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word" D6 K: U7 z' K: C( K
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
9 [& K# m% `; N9 { mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK+ [3 w# l4 F4 l, L, a- A$ _
mcasp->regs->XTDM = 0x00000003; // Slots 0,1$ N7 |7 ^4 g, q3 W( R
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit
( R' w E/ p# _1 U mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& Z; m* D8 a( T- C
1 b3 j0 z$ I e7 A' ~/ L9 y7 Y
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN) `1 M5 }& I+ e' _1 n* C1 b
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT' m3 h$ T: ]) i
mcasp->regs->PFUNC = 0; // All MCASPs
5 R: O4 d# J+ S# I l mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX10 A0 }. v: @; d7 F
. u/ Y) E1 M) f/ q- q: i
mcasp->regs->DITCTL = 0x00000000; // Not used5 G2 }+ H! Z4 u; q# E/ N' Y) w
mcasp->regs->DLBCTL = 0x00000000; // Not used5 q& V3 P, Z9 [6 ?4 l2 b
mcasp->regs->AMUTE = 0x00000000; // Not used
: x3 W" D$ k- u$ v* v9 _" P% I6 N& h5 ?
/* Starting sections of the McASP*/ {4 {2 W0 O6 S; E! W8 j
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; @8 z$ u) [" O* E; y3 u
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); / E" i6 p4 O) i- c' ]6 t; C: R
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 L% l1 U, h3 f
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
$ K" @* X7 L$ m) m& d$ X; X( }- P7 ?8 X6 [
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ; s/ h* o5 n4 X3 x7 @8 C7 J" R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ ^5 Y$ J' l, E1 ~) h% z% ^+ D
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ; g" J6 J& D) P/ G1 R9 G. g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! x" M q& |; B. w# H6 y H7 r1 W; _1 a: b N0 I9 O, v' h
mcasp->regs->XSTAT = 0x0000ffff;
6 L) a0 b- v3 V4 M/ m8 R- r, p mcasp->regs->RSTAT = 0x0000ffff; : O8 ` `/ l3 y, ]0 a
5 C- h6 p9 b5 s! h
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
% j5 }1 \# C+ V# q6 Q6 N while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 X g! k U% Z4 u
mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
) Z" E+ g$ Z! g0 ?: A# _4 | while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );7 b' w' j4 t# B* w c% f
9 \ G. {. Q! p% c3 O5 W /* Write a 0, so that no underrun occurs after releasing the state machine */
7 c# ^0 [) b: c8 ^( Z* T& k# w# n/ } mcasp->regs->XBUF5 = 0;
' ?! V: [& p; z4 i mcasp->regs->RBUF0 = 0;# u: w8 p/ V. M5 ]
! o( l+ N3 P& [1 e mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; Z$ ?# `8 \. {4 ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );; `2 a: m; q/ g. U9 A
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
}5 N& D9 Z; `* Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 C8 R8 j/ y2 E- c
( {" \; W, p E* W) Q4 _2 |$ I mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
2 e5 E8 v' S s H' d while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );1 _% G7 \" N$ Z* r6 G) z: I: E$ w
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
v$ g w6 _% W- N6 T2 Q. N+ K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! z; n9 i" b: H" J- a9 R+ w5 _$ w( r) T ^7 T
CSR = 0x0000;0 K8 Y [6 W- l/ o
INTC_INTMUX1 = 0x3d;
; G4 B7 R% ]5 J) a ISTP = (unsigned int)vectors;9 ^" T N" c/ }+ J0 c0 c6 h
ICR = 0xFFF0; , j, n/ Z) C$ w& |$ D- _- x1 Q
IER |= 0x12;
& s! ?: s7 j( N$ k" X5 r( j CSR |= 0x01; ! b4 d( M/ n2 F% c/ t
5 {. C" y( P7 E
) ?4 M; ?8 L+ W1 A+ q* T$ ~ d
" v; [2 X5 @! |1 }
还有就是两个输入输出函数:2 l o6 i8 V+ s+ q
void output_sample(Int32 out_data)
7 q5 L+ e5 a, G9 H+ a! L{$ V! ]4 a5 c/ V) k5 z; s: Y: E
AIC31_data.uint = out_data; & F# G7 f$ b3 f( @8 I
MCASP1_XBUF5_32BIT = AIC31_data.uint;
. q4 ^, V" I( z2 P2 _9 Z* K* K}1 F% ?0 v1 |7 S3 t
0 [* [$ y( v) g0 M Y& S/ NInt32 input_sample(void)& h8 {/ ^9 X& K* q6 _8 C: Z! ?
{ - s }9 N0 f% Y- y% O
AIC31_data.uint = MCASP1_RBUF0_32BIT;4 X/ r8 }- q5 k6 N5 G0 x1 {
return (AIC31_data.uint);. t- G8 s" M+ m6 h
}5 a- q5 R: w+ Z
* d @6 ^" l. C" P5 e3 y- ` M |
|