标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 X, L" B& [' F: w7 ?
main文件:( M3 n# k) u: r# { f, K
interrupt void interrupt4(void) 2 b6 n$ o& n- @
{# F; B( H' M. H# j8 O8 A! Y: ?) D
Uint32 sample;8 O3 y2 q: v p p5 N5 o9 Q0 m. R
, Y J+ P( y$ Z% O! l \ sample = input_sample(); // read L + R samples from ADC& v4 b8 z+ n P) f: o& K
output_sample(sample); // write L + R samples to DAC ' k; `; F! O6 i5 C. S4 {* ` return;3 z# U' a, i, ?3 z8 \
}4 v+ |6 H- b$ J& f! |+ v+ x( U {
$ R% S: G( z Wint main( void )9 Z3 T: W _5 ]( C5 j; f, u
{ " C5 m! V; F% X W/ f6 |; A d2 D- P+ @# s2 K
/* Initialize BSL */ ! G- K6 {) Y% \+ I) g1 p, F& P EVMC6747_init( );9 t0 a1 Y+ f. N( r' D9 y
/* Call evmc6747_intr function */ % M9 h( {! ], ~) |1 C- w: K2 b aic3106_init( );/ t, x/ [) H0 {+ G/ g1 y% X
while(1);( J/ [7 ~/ a% i: p5 g
}1 e' P- h- G1 A0 T7 P! k# O
5 H4 c" B, l( g$ a# c9 r5 m$ O) W" h
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ D+ W: H4 d6 T! n: d9 g9 `0 G
/* Initialize MCASP1 */6 a* g9 y; z' { h( z
mcasp = &MCASP_MODULE_1; J2 K' q; P5 H! `# x9 t7 y mcasp->regs->GBLCTL = 0; // Reset u+ h. M9 u6 i0 K3 D mcasp->regs->RGBLCTL = 0; // Reset RX ( D/ k r, ^ A' b5 n mcasp->regs->XGBLCTL = 0; // Reset TX ' a8 Z$ V7 _4 b6 f- ~ mcasp->regs->PWRDEMU = 1; // Free-running " y' A1 l$ W, E* J // configure McASP0 receive registers # X' O% J# a) s" ^ mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used; L& j# G F! q4 N
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus * ?: f7 {2 A/ G7 w+ f9 i mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word ) N4 o" F3 V4 t; R mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) ' h9 z( h& [6 p. P+ q+ R; G6 T mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) , \- }6 _4 h* t: N; W4 A3 F mcasp->regs->RTDM = 0x00000003; // Slots 0,1- k7 }9 j! U( x* a- ~
mcasp->regs->RINTCTL = 0x00000000; // Not used 5 n' F0 O5 }( t% X mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 5 y/ C* \4 F) h: `2 o . z2 r+ |- L1 c# h" r2 } mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used 3 [: A' r( t+ `1 } G5 ? mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 7 e, Y' f. _6 P: r8 d- Q! Y mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word ) @4 A/ R7 F, P. H8 Y% J mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 ( y4 |- z3 d, H mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK ; |0 j/ L! n9 B( E' q mcasp->regs->XTDM = 0x00000003; // Slots 0,1 , G$ a6 P3 C0 v! L! z mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit ( `; G2 ~, Y% H5 r! @0 ~ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2567 @8 y. } o2 r- p
8 m G, p; F; @ d
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN5 m. ~8 ~) ^7 L% g, v
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT E6 [) L8 s3 D f+ q7 n
mcasp->regs->PFUNC = 0; // All MCASPs 2 A" T5 A/ H* B* J$ U mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 & x" O/ J" u0 j8 m$ e }- C ( e' M' ]6 e6 [5 V! c mcasp->regs->DITCTL = 0x00000000; // Not used, X, A" Z5 r3 K" l7 n
mcasp->regs->DLBCTL = 0x00000000; // Not used" {( ^6 r3 m& r
mcasp->regs->AMUTE = 0x00000000; // Not used - n! i: k x$ K7 x5 f& d( S : p" ?' {8 K1 m, y) M/* Starting sections of the McASP*/ C! l4 p% X* B/ p. q3 o1 Q mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 ?, @6 ]6 i$ [: V# `# G: Q/ i. h! i: Z& d
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 1 w# T# [# j! F9 {" ]4 k: J- x mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 4 |4 A1 w& X+ B2 A while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); , \4 {5 A- H# A. M% o% j+ \7 W ( ]' q, `+ Y# x' e* M& _6 a mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ; j$ o" U, a: x0 l9 P. v while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 V( W8 r* H& ^" j7 X) E; W
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 r X Q9 w% B" P9 n: c p8 J; H while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); ! z; j2 o: ^7 m( I, w4 {8 A. M0 ^# ?- m* }
mcasp->regs->XSTAT = 0x0000ffff; ) F. X9 C! x' G, K7 A
mcasp->regs->RSTAT = 0x0000ffff; ; n8 A& }( M. w0 N' k: S $ m( Q/ s: S V7 g `5 |+ Y mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; / x* [+ C) p, ]# u while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); * D/ d5 `) {0 h' Y% w8 I mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 6 m; {7 x' u; K' C3 ?$ K while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );/ `% ~; p2 m* W
, [- p5 D. E/ d5 J /* Write a 0, so that no underrun occurs after releasing the state machine */1 @" [" ^9 ?1 E+ c3 m
mcasp->regs->XBUF5 = 0;5 W) e: o$ _% c% n% c, {% S+ e
mcasp->regs->RBUF0 = 0; 4 y# w1 H1 `9 v) p/ I9 w) t# r0 w% p& ~5 X/ R$ f* m3 O! G% V" z# r( o
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! p! B4 U. `; u1 [ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );3 O+ S4 w+ X' u( Q9 s5 s( u
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 2 q; ~+ Q2 F: x. s2 l; ?( O4 { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); 5 W5 D E9 { s' }2 ?6 I) s" j, R1 V- x4 D
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' j( y3 s$ [- F, ?
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); ]: f) J' f1 X
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; ' E( u& q4 n+ M V7 E2 N: F4 O; D while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); 9 V- }9 v5 E. M1 v; K& f6 P( C2 V6 }0 `6 h/ W `9 R" r0 p
CSR = 0x0000; . q h% U$ u3 g' k: N+ r INTC_INTMUX1 = 0x3d; : z4 e) V [, _; D3 d' i* [ ISTP = (unsigned int)vectors; ) P/ s f$ a7 P& D; r. u# I ICR = 0xFFF0; 5 M& B& E0 D6 G( R. n IER |= 0x12; 3 P# @' w6 L9 O6 X. ] CSR |= 0x01; 0 g9 U1 h0 l% S7 ~5 n' ?
" G3 C, ]. U( t+ Q) x* \1 e+ A " e/ X8 q: S: _: z" {6 ?* Q 7 H) K2 s+ X+ c; |8 I还有就是两个输入输出函数:1 F+ n' c0 e5 r
void output_sample(Int32 out_data) 4 |/ g$ h$ B n# u, T5 F) l- u{ * t9 ~/ A3 q6 b j; |& ]; z$ z: _ AIC31_data.uint = out_data; / p: J. X e; E0 R
MCASP1_XBUF5_32BIT = AIC31_data.uint; 7 i0 w' {% F# E K}9 W, h/ a& o3 g8 V# h) P7 e4 {
% O' a8 A; F9 H8 v% P& [9 C
Int32 input_sample(void)- B1 l8 C7 d/ N' {0 C0 D" K9 h
{ ' J, w5 K- P& R$ ` AIC31_data.uint = MCASP1_RBUF0_32BIT;1 P) b- A& q' `% X. C
return (AIC31_data.uint);6 o F$ }3 y! l) z: y8 u
}* X& Q9 x5 y( }9 ]9 H) g
8 E0 H, g, v% Y, S0 |' N* { 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)