|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ R5 s r' l: f* K/ omain文件:
b2 Q# s% _" O/ winterrupt void interrupt4(void) : g* Q( b G$ s1 Q9 f
{
' J' B( q, K5 g- @; t2 L) X Uint32 sample;+ d9 W0 j/ i+ t( W, h* @+ X
: t( r; k5 Q4 a5 D! m9 x7 J( m
sample = input_sample(); // read L + R samples from ADC
- `# [- K# A) O output_sample(sample); // write L + R samples to DAC 4 [ e) n8 x0 n( n6 p+ H+ U
return; h3 O( M& t& z% A& y) t* Z
}
& j* v# l& ? W, X% l; U
8 F/ l7 Q. X! d$ [9 Y" @6 cint main( void )
" u2 K' d) p o. D: @{
@( ^& K( e& r6 V* n9 M! u8 C, \' d! ?9 s
/* Initialize BSL */
" H! ]5 k, {( {$ ^ ? EVMC6747_init( );
$ N& O$ ?+ h2 X8 t) F /* Call evmc6747_intr function */
! h7 _' G# a" p% e' r( K6 f+ s) i" Y* J aic3106_init( );3 \' e1 h0 H# R$ K' a2 o$ \! q
while(1);
, \, L& @/ P. B}: Q' {( s) Q9 P* b$ @
8 X ?3 |8 c l! q# A% j" Z& c0 r- U9 c1 i# \: x! c8 i) Z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题: p. u+ A3 t ?7 n# u" C
/* Initialize MCASP1 */8 R+ u6 I4 s; \8 a5 r# b+ u
mcasp = &MCASP_MODULE_1;. Q; `4 s0 U8 V+ {
mcasp->regs->GBLCTL = 0; // Reset
: A) ]* d) H: f& o+ J, ^ mcasp->regs->RGBLCTL = 0; // Reset RX
6 r& H1 W" U, | mcasp->regs->XGBLCTL = 0; // Reset TX
) u) T, T3 ]6 t k9 W mcasp->regs->PWRDEMU = 1; // Free-running; p8 H/ u+ E7 p% z
// configure McASP0 receive registers
8 R5 {! r5 g; `4 Y! a* w mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used
$ o0 |8 `0 D& ?0 l mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ ~/ Y: v! x2 f, \ ?8 g. i' E7 p$ p mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
( ?; R: F3 e% f3 W. p mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
7 X5 p: k0 [8 C4 C mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)' }# b% B# a! l, v+ T# E- R2 u' L
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 d6 C; m+ ?4 b1 v( U* c
mcasp->regs->RINTCTL = 0x00000000; // Not used
/ O( {* J4 F r" J mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 h; u, L/ v, E& u/ v5 m8 ^
7 R0 ]$ p6 t! b+ K7 h mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used/ r7 u" |6 x2 o
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 F" N) F% o8 n mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word5 \2 g7 Y; o: t O+ g, R3 C
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
! P( f! ]0 z* C1 x& f1 R mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK
/ s" V' U3 [* K1 [" Z$ b mcasp->regs->XTDM = 0x00000003; // Slots 0,12 U6 R- a* Q% N% L0 @0 D5 ]
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit, G9 U. g5 M4 B7 V/ Q& z J* Y
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2569 B- ] E& `/ o
# Z, M. N% a* X8 @ mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
) [: E! k' z; o0 m$ a6 c mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT S( R- \8 _0 t# X: j; J
mcasp->regs->PFUNC = 0; // All MCASPs
! B0 B+ r( r+ U; |! z3 [5 M mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
1 R9 y# {4 m2 u1 u( ^) L i8 w1 _9 S1 z8 [& k1 q% m0 Q
mcasp->regs->DITCTL = 0x00000000; // Not used
( v4 S& ]- S; k' { mcasp->regs->DLBCTL = 0x00000000; // Not used
7 K* m" d& X" f( J# g. B8 l mcasp->regs->AMUTE = 0x00000000; // Not used
9 `* k0 X1 o; `' A* _: P6 h H5 q, u9 ~: B# `8 o5 f" a( G0 n
/* Starting sections of the McASP*/
8 `5 @4 A4 ^6 q( A: R mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 z. K7 G/ ^% L0 E; L# a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); # S1 i: P. H( x6 @6 \/ ?
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) {1 C% a( l8 O" p. i' O- D, Y& L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
/ i# C( h( \" ]5 Z
# P0 ~' X- z* m mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
0 ~ ^$ Q8 p: |" f while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
5 F+ ~8 Z P5 Q1 }5 w2 \8 i6 I2 ~ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 H- O- r3 o# s. c while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );+ M6 y) t0 o5 `4 J. A
0 [) J2 r+ t8 }+ Q T( L" Q6 V
mcasp->regs->XSTAT = 0x0000ffff; ' ^, K Q# I! W) Q" p- l+ p4 \
mcasp->regs->RSTAT = 0x0000ffff;
3 K) R" S6 E0 B8 n+ M$ q: e) }$ W: s2 T v
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' a1 G9 A, D( d: B: o while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
Y# @$ [4 p) [ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
& M9 x# b6 j' w) ~: a' R while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: w1 e; c- m# t
d+ p6 t, s1 t$ t; D /* Write a 0, so that no underrun occurs after releasing the state machine */, s1 A, g, y( v2 j. n
mcasp->regs->XBUF5 = 0;5 w" [' Q( T; z* ]8 p: V
mcasp->regs->RBUF0 = 0;, [8 W" L" t1 ?4 w) d/ x
0 d* v, n0 c- B9 @6 ` mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 0 b+ G1 v" ]# Y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );6 ^. C* X9 S: B! m+ Y2 D& Q2 ?; g
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
! h& s! A( Y& D/ g: i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, j. y& N' ]1 `
8 i& O' N$ ~2 i1 q mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ; @ l( n9 M! m; i
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- `' F" P/ @1 F/ n
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; & M- ^2 L! I' h% g1 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); N$ B6 w8 v% O' r N% E0 |3 N
9 l; q9 F8 \$ t ?. ?) O CSR = 0x0000;, u& S. O2 m4 l X9 i. P5 Y8 v
INTC_INTMUX1 = 0x3d;- M. z' N" v8 Q- W2 i
ISTP = (unsigned int)vectors;% Y! G% ]- p( }, J
ICR = 0xFFF0;
3 g0 I& g& I4 A5 w7 M/ @3 O/ }5 f6 F IER |= 0x12;
2 O: k6 G: w' u& r# q CSR |= 0x01; - ]$ [# `2 D9 I6 {! @
; d M- e9 Y' |3 F- o' g* Z! N0 E9 A5 g
3 q, `( t7 T+ a+ @) ?( c还有就是两个输入输出函数:
# n" i8 a/ g& Q# ]- s' |void output_sample(Int32 out_data)
5 R; S% P3 Y0 m: u{! G. n) l& n Z* m4 P, I- P
AIC31_data.uint = out_data; ' o, F- I/ F+ ~% Y" H8 p
MCASP1_XBUF5_32BIT = AIC31_data.uint;
8 Z9 W& A$ k, Y) A, \4 T}
5 t9 v& {9 _" w9 ^1 y' ~3 ?$ i9 D! D. l
Int32 input_sample(void)
% G( d( I7 z9 e% w/ u{
8 b. B9 P7 }! K1 X8 ~2 n AIC31_data.uint = MCASP1_RBUF0_32BIT;, ]! V. s+ m* ^* s; C# |4 f
return (AIC31_data.uint);: W( Z' P; `) V
}% m' j( R6 a+ k6 t
+ t4 d7 |+ X4 k' H9 N& G
|
|