|
|
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:. |6 E( _6 V: w2 S2 ]2 Y: l4 Y
main文件:) a! v5 a5 e* L1 h" @# d+ _
interrupt void interrupt4(void)
2 f, @, D4 Q2 c1 @% k{
# l: L/ x+ b& m1 p$ j$ ?' T; ` Uint32 sample; G" T8 `+ J3 t2 E3 W" D! p0 A. s
7 H' z9 w- l3 C) t r+ K9 C# W- p sample = input_sample(); // read L + R samples from ADC
, I. P7 K9 @/ F' Q' N# z5 k output_sample(sample); // write L + R samples to DAC
: ^1 h, R! {8 x3 w+ [6 o return;3 N- I+ E. M0 w& E- m
}$ F4 b* B5 M9 i7 L8 p0 J$ |
5 R: h5 M& _1 e9 q4 s3 T$ Gint main( void )7 R+ J+ R b1 V9 j# n6 P; ~0 f) N
{/ f* ~( [. {7 `" ?
, A7 j. c) ~' d+ I /* Initialize BSL */0 ]' b, ?% W% r9 D$ t1 s% ?
EVMC6747_init( );* j9 V6 C7 U; S, V1 @
/* Call evmc6747_intr function */6 I5 ? Y2 k* q% I1 x, Y
aic3106_init( );; t* e& X4 h2 Z. j( Z
while(1);1 F" f' o* l# s( d8 p
}
: G8 v" }: |8 J
) H8 {9 y0 r5 q) d1 k; ~$ \
9 H) d' Y; d/ c- l& t% g& ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
* l7 W+ W) U& {# d) D% L/* Initialize MCASP1 */0 r+ e' \- P5 u0 E& z; W
mcasp = &MCASP_MODULE_1;
' s3 Q8 h& `0 C mcasp->regs->GBLCTL = 0; // Reset
- A; f* L* L7 Z$ K( s( G mcasp->regs->RGBLCTL = 0; // Reset RX
& v" l- |0 W/ ?4 X* _+ Z! b mcasp->regs->XGBLCTL = 0; // Reset TX
/ a! h* s' l9 x8 ~ mcasp->regs->PWRDEMU = 1; // Free-running) B# d' M3 q: x% r) Z
// configure McASP0 receive registers; w* h5 P# E7 ~( ]: k0 ]& [
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used$ f" {. R3 p6 t( a1 ?8 J
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
$ E2 _3 _& v$ G( _ g% h mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word
: B# y3 _/ b" N/ b# u0 w; o2 J mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side)7 t. w" w% i' U1 j+ |: I; U4 ?
mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)
( K4 s! b4 O8 {. w2 c. ~ mcasp->regs->RTDM = 0x00000003; // Slots 0,1
1 v1 ?1 u. i, \ N* @3 P" x mcasp->regs->RINTCTL = 0x00000000; // Not used& _5 ]; i1 A; i- a! F
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 M( p3 A- t( f$ u) c) v" R; T3 v" M
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used
/ t( m. t# u; i5 X0 H' ` mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
: p, F% J* |& h mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
( E3 s5 i& N3 [2 w( W5 l5 A mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-169 z$ K6 y1 v c
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK, q( E' O# w$ z3 K( ^
mcasp->regs->XTDM = 0x00000003; // Slots 0,1& }& s5 k( d0 e
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit- J/ `1 r5 F( R0 e6 X5 z3 _
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2562 V7 Y2 b6 b2 c h1 |; A, N" \
+ N. ]: X* j2 t mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN
0 x: h6 c4 s( R mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT
1 a6 F* d8 S% p8 B mcasp->regs->PFUNC = 0; // All MCASPs9 w+ F/ b$ z2 |' m. H% e
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1% [) U, Z, T0 S$ {. x9 T
6 F. v0 ^: f1 A, N; s2 W mcasp->regs->DITCTL = 0x00000000; // Not used& \- _: h& r# b0 r$ B
mcasp->regs->DLBCTL = 0x00000000; // Not used1 M, e+ g6 H* T% d
mcasp->regs->AMUTE = 0x00000000; // Not used ?$ Q7 ^0 T* V1 v) E7 x! n% q
* W9 M" C- f2 V; `( ~/ t* ~) m: X
/* Starting sections of the McASP*/% c) T( u& G% j
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
' w6 m6 z" h$ ~2 C" t while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );
7 Q: c& _: s7 u' L8 }! t mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; F& R9 [1 e6 w8 Z$ R, x1 O& G
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& Z# Z8 z8 F3 M% K2 w1 z* @' y3 _5 w, s0 v- A
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . z+ w5 o, |3 w9 U
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );( X% ?1 g M! g3 v+ S
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ~/ v; p' K; X7 B' D
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); l' X" c3 Y, V
1 t ~) D' j: w; k- {8 s
mcasp->regs->XSTAT = 0x0000ffff; 8 s+ h. Q7 l$ r' m& l, [. u; a
mcasp->regs->RSTAT = 0x0000ffff;
, @2 ^9 N6 l# j/ ?& j d: H6 t5 _ f% E/ ?; L# w2 I& S
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ D, y3 v% ?" W# L( w* F3 x' r while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
8 [# W" T' _% W mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
- ^8 z1 @6 l$ y, [' T3 @; _' i while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 h2 {3 L" _0 I' @/ k( h/ p9 [) [$ ]
/* Write a 0, so that no underrun occurs after releasing the state machine */
2 X! c& R( b) X9 [9 N/ V mcasp->regs->XBUF5 = 0;- |* l4 n& J% N. g7 O. ^3 P J8 B
mcasp->regs->RBUF0 = 0;( B% V5 `) h2 F5 q6 P& J0 t4 c+ ?
. p. s/ x! V6 b
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , D2 _: x& N; [, @
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
$ m: J1 v0 P' P. W; u8 v8 } E mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 g4 W4 a7 @. v4 X3 L while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
6 n& a. }5 L2 F: k! H- b3 _1 ?
' J! {7 Z( q1 n+ } mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
s6 L+ W( I% R7 x while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
4 {2 ^! x5 p9 y, s! P mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ( A+ p6 l! A$ {, ^+ M R6 }
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ C' G4 O: C5 v9 i$ n- C, b' U
! _* z& ?( _* ?" g CSR = 0x0000;: `% @3 G$ m9 `
INTC_INTMUX1 = 0x3d;8 p, E9 _" A9 N: m9 W
ISTP = (unsigned int)vectors;
7 {+ `3 e2 x$ m ICR = 0xFFF0; / p) R9 \! t. s; z2 ?0 \
IER |= 0x12;
( T I1 ^" z+ s& q CSR |= 0x01; R9 E6 q' |* {! ~# H9 m! }- x4 h0 v
; H- u w y: N8 |3 P; G
P0 G% j8 m& `* ^6 C8 W) c
0 W$ T5 \0 r7 o C5 K
还有就是两个输入输出函数:& T& I ~" F# q
void output_sample(Int32 out_data)
8 Z6 U0 H/ [1 z. @6 n- s8 \7 r& k{8 m* @; k" N& T0 g% C
AIC31_data.uint = out_data; 9 `* J- Y, h( p# K
MCASP1_XBUF5_32BIT = AIC31_data.uint;, M: l+ n4 ^! S$ q: L4 ?
}
- {/ _7 N) H) h1 h. w* q, \4 _: R' M* @8 k+ x+ J, r6 v
Int32 input_sample(void): n! t+ S4 m3 y7 ~/ ]/ V: x- r
{
0 Y' o5 {8 t1 v: h) @ AIC31_data.uint = MCASP1_RBUF0_32BIT;2 ~% y" @! d7 D( y# \; M$ x
return (AIC31_data.uint);
- e6 q, G3 ~- C* ]! \. X}
6 r2 `/ j2 |6 M% B( Q
7 C: [9 v/ E7 z, E! o% v& l |
|