|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:" @- g* w! k4 L
main文件:
) l$ ^ O) _) _! m M6 j( b* ~interrupt void interrupt4(void)
3 K8 h7 k5 i* k+ I4 a/ f{
' P/ X& {; Z7 F0 L Uint32 sample;
! y) e& U2 l8 @' N7 @% k! ?- p) e6 X
5 S( {$ n" \! s$ K sample = input_sample(); // read L + R samples from ADC1 [5 D# x6 ?& K% g4 ?4 e
output_sample(sample); // write L + R samples to DAC
2 R0 y) i& a0 _* ^7 D3 J return;( G) T4 L$ I3 A, n9 F9 C& v
}& d- q7 D1 F4 `' E/ ?7 s
" A. H& p8 d. T$ c
int main( void ). z3 a5 V6 \" L& u; H
{
% X+ J3 p: O$ t" U! a ]" O
: p1 ?2 c: U, k- e, y /* Initialize BSL */7 v, C2 z; b; B2 I# X4 P
EVMC6747_init( );
/ S8 H U. o4 a$ z: X /* Call evmc6747_intr function */
' g1 Q, E( o+ d8 O% l1 Z. s aic3106_init( );& D9 `; e4 K0 p- N
while(1);5 j' p w- f" U
}+ h# h: ~; ~! `; r! j
+ C" e" u) b9 k+ I+ |( I! K7 n1 ~7 W8 U, S
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题; _& A# h0 z$ g
/* Initialize MCASP1 */% b7 P5 A/ ^' D* m3 U# U
mcasp = &MCASP_MODULE_1;/ |7 ]& D# Z: x: J& e
mcasp->regs->GBLCTL = 0; // Reset/ p N6 Z1 n$ h# c4 y2 f; w
mcasp->regs->RGBLCTL = 0; // Reset RX
) a- H" H g. ~ mcasp->regs->XGBLCTL = 0; // Reset TX
7 Q8 F5 t' `) |- \7 ~1 N: z mcasp->regs->PWRDEMU = 1; // Free-running
* S9 y6 G$ f# V- h* i$ g // configure McASP0 receive registers
* w7 ?% d3 Z+ x# U, C mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used0 u0 Z1 B k0 A/ [4 O
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus* G3 z+ }# a$ j) s
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 g/ a7 Z- L* a+ `2 Y5 ^3 h" Y
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
* y: z+ t% u/ l7 X4 b& l6 g mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)4 W' V R0 i, O# X
mcasp->regs->RTDM = 0x00000003; // Slots 0,1
$ J/ K9 n& y; P' A/ r- O0 ? mcasp->regs->RINTCTL = 0x00000000; // Not used
5 f: i* p% O& z# b7 \ mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 ~9 [. J/ _) c6 P6 ~0 z% Q! p% I9 t p. Q4 U9 m
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
3 H9 @% D. D( J7 U% [3 M0 A; x mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) C1 o' [, W: U1 e6 d# n6 Z mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ l+ ?0 X$ H- N& S( @
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 y" n+ `) f' |7 H; q% p8 ?. s mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
6 }7 O& ~# e. V& @, D" h mcasp->regs->XTDM = 0x00000003; // Slots 0,1
, H/ j4 M. t7 a- T mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit0 \' F8 ]: D! W& j' v
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 z* G+ u( b6 V) q
; _3 Q6 }5 ^" Y. M
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
. [$ w. M. W+ }1 f mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT4 S; {. t! x; B; Z0 z; f: u0 L
mcasp->regs->PFUNC = 0; // All MCASPs
2 }: C+ o! v& ]4 G% ^) T mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
( j7 ^1 h9 G8 k4 [
( s* ~; g+ u! a) ` mcasp->regs->DITCTL = 0x00000000; // Not used: G4 d _' r6 }$ I3 g+ i
mcasp->regs->DLBCTL = 0x00000000; // Not used1 a1 q2 U+ r% [+ U6 U& B* w
mcasp->regs->AMUTE = 0x00000000; // Not used
; D/ j. o, c, _0 b# b. H
. [, O# B. E# o; z/* Starting sections of the McASP*/- p; x+ ^) g8 C" z7 z& b. v
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* X( x2 B% ~# w$ l1 P while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); * }$ j' a# z1 i$ @: J
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
, i; W/ y8 s2 \/ r3 n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );! O& j0 l/ G J& E% @+ }
! j C+ B. {( o: V; m. {
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ `8 ~3 g, ] Q) v5 @: J5 h' e' s
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ Z1 r1 B, V' a. k! t4 y% `
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; + }5 V( R8 _3 Y9 w2 s
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* M. Y4 K$ H4 M2 w4 b
( h4 w* T1 o6 \3 q( y mcasp->regs->XSTAT = 0x0000ffff;
s' `1 N7 a. V9 v4 H6 [0 | mcasp->regs->RSTAT = 0x0000ffff;
1 e) O5 r0 C! h4 t- q, f2 g& [. T/ c% d4 D5 R: K1 I3 m
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. ]& E: @. P4 T' ~: F3 g while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
1 s1 \6 ?, K* P4 x0 S mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; p2 ]2 p( d! B
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
7 b# p& q) N& x1 H1 b0 @
( ~( @3 P! C8 W' S6 j& K /* Write a 0, so that no underrun occurs after releasing the state machine */* [7 H, e C; f5 A/ `
mcasp->regs->XBUF5 = 0;2 c6 x3 y( R1 z; i# [
mcasp->regs->RBUF0 = 0;
6 E& @) X ]3 X _
{& V T4 u; ^: a% p1 w mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; " I% H1 B( y& u0 e& t
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );9 c8 h2 k" i7 d9 H; E2 ~
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- [6 }+ E9 Z6 R0 e/ I4 J: s' `- K5 f while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );8 y8 @7 a' }2 e8 x* D
3 b. ^" S. U5 S
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
, U* M* M3 q. I* v1 F6 D3 U while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 m, i2 S1 j$ v$ J% M! N/ j4 r mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ) _* i0 f! m, i1 J0 g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );5 |0 z5 L# m& F6 Z! H ?! I: s
& {9 o/ a% g( z; O, e& }
CSR = 0x0000;
6 k/ {% S% b' y. n1 X0 M d) N INTC_INTMUX1 = 0x3d;
- E9 r" V i& Y e Z* l2 V& i1 L5 G ISTP = (unsigned int)vectors;
0 f! ?% \8 O' y ICR = 0xFFF0; $ I0 ], V/ g! n! R! d3 \
IER |= 0x12;
% G' Y6 w- J1 u3 _3 K3 N CSR |= 0x01;
, H! Z1 p: N( o" L9 G- X5 _, g0 ~+ q
1 j- v% Y; F7 j8 U+ y" Q, h% w8 b* I! O! R; h
还有就是两个输入输出函数:
$ f3 l( [6 b5 svoid output_sample(Int32 out_data)2 G' z, [2 v' {2 G3 s
{4 H0 H, h) r3 U. u, ~; y4 \
AIC31_data.uint = out_data; # s3 H# C" u r1 w* z; g
MCASP1_XBUF5_32BIT = AIC31_data.uint;+ A g i: b' F. d
}
; f8 Q6 k: g+ l5 @: J' `7 q
9 G+ F6 J* w5 PInt32 input_sample(void), I2 I& y, P, Q$ x b
{ + b# l. V* D/ b) Y* r9 V& H" ~
AIC31_data.uint = MCASP1_RBUF0_32BIT;9 I4 J& f# y* k2 Q! u. L6 V- G4 ^8 ]
return (AIC31_data.uint);
4 }. X- n& D6 G+ F) A}4 h8 \9 c! T* M" v8 W
3 ?) r" @' i/ g% r3 m& a
|
|