标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: * @. n2 v v1 L/ Fmain文件:9 c1 C( W3 x+ Q" |9 o
interrupt void interrupt4(void) 0 L4 ?) p: v1 J* S+ ?
{3 {. n; E( |* f9 d% e6 Z' F8 y" U
Uint32 sample; 6 s2 u! l {6 a/ Q R! m $ q8 T: ^. `7 S& ]9 l sample = input_sample(); // read L + R samples from ADC+ j! Z& q. I+ W9 s: \; S( J
output_sample(sample); // write L + R samples to DAC 5 N& g; x( z8 Y. u6 w0 D
return; 3 C4 j/ `! u5 a! }3 k7 e. M}5 P F( S3 u. _: T5 _0 @7 ~
1 N! N/ V- P" R) l9 r: Vint main( void )) c9 v) x9 A9 G; s% F% c! ^
{ ; l1 k- g8 d( ]$ s& g* H' o# l/ ?+ O/ L* I% @+ v; _) s( K4 T
/* Initialize BSL */' V a: C- G( U% P* w
EVMC6747_init( ); 4 F) E2 E/ P5 }- d /* Call evmc6747_intr function */ 2 V+ f; j& H6 N5 O2 W& h! e$ W6 O aic3106_init( ); * t5 p+ ?( a9 I+ r' F- X while(1); 7 ?* h- w, B, }} * N% o0 I+ g& y9 g# i0 I z 5 L7 ^" s0 H9 V+ x- N$ g& u" \$ ]' B2 Z) l! }$ e1 K7 ?5 A5 U N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 W) V: u1 C8 Q# d5 I; R
/* Initialize MCASP1 */ ( M# ?. S: p6 y+ y- L) Q' c7 d mcasp = &MCASP_MODULE_1;4 I8 F; s( P8 x: W( H
mcasp->regs->GBLCTL = 0; // Reset 3 b8 G) f6 w% Z mcasp->regs->RGBLCTL = 0; // Reset RX / u+ ?8 Y0 ?/ q; Y9 U$ a% x' J9 X9 I mcasp->regs->XGBLCTL = 0; // Reset TX0 o" [/ D3 y J" T6 K0 O! p. b+ g
mcasp->regs->PWRDEMU = 1; // Free-running + E! C) |$ D* |8 T) w6 R: M0 D) a // configure McASP0 receive registers* \& w) I: T& B! T+ U) O; {
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used5 ^* l- [- I' j+ q+ w0 X, o4 I% Y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 2 M) z* C* Z4 X% L3 t mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word& z0 z% ]( |- D, v( q- }
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) & l4 y) p' h* A5 C; C( _) ` mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) # A) p' G& \' c7 u6 N) ^7 d mcasp->regs->RTDM = 0x00000003; // Slots 0,1! ~0 D+ p) X$ Z* m" c8 z( p
mcasp->regs->RINTCTL = 0x00000000; // Not used3 T$ w# c# _1 c
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 O0 n% j) ]" h# J7 e; Y; ]4 E/ |
* x- B- ^4 S9 H% j* @
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used : e ]7 A1 \3 R* L mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 7 }+ I+ W9 g# m' x, g mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word: _, Q/ A a% t. y( q
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 4 c7 D3 X" m4 [3 `5 I mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK * N7 x1 R2 d: u0 r mcasp->regs->XTDM = 0x00000003; // Slots 0,1 ' N' V$ z9 H2 T mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit8 } _! t) U- a; E2 |5 g
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 j$ v: g. t n% b" G' U% M- F
1 ?/ Q4 X( P( n, e mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN. k2 M: ^: E; V
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT# Y, K% I# d, q( `# o4 u
mcasp->regs->PFUNC = 0; // All MCASPs ! z _! d8 m% e0 Q mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 g2 |) i/ {( f/ ]. r4 `/ y5 }, t
4 d4 @6 n! T1 t0 [7 H1 o; t" g! |7 R
mcasp->regs->DITCTL = 0x00000000; // Not used ( L5 R# k& S6 V1 i mcasp->regs->DLBCTL = 0x00000000; // Not used! C( ]: T9 k D: n
mcasp->regs->AMUTE = 0x00000000; // Not used ' S: q9 p, Y/ d6 q2 m, S) L- V( Y1 P0 f- i. j0 o; y( a) {
/* Starting sections of the McASP*/3 I" O8 v' C+ n$ ^
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 3 w( p8 d/ I' b$ z& V8 c while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 5 a" Z. }$ h& ~; p
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; . @. F, ]1 v& i2 P6 J% [& L) X# n while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); ' z3 S" j1 B ]. b, E" g$ j7 C( E 3 E; Y( X+ _ J6 a mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 5 _' k9 T! y8 J$ V8 t9 R
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 V8 L" c% e0 D0 a
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 5 y2 C8 \0 h) Y$ g
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ Z$ f/ }. n: x+ O# ?# U
l* N) R- u) D, R& k' T6 f( Z
mcasp->regs->XSTAT = 0x0000ffff; ) e* Q, S8 T2 w, |9 |5 a mcasp->regs->RSTAT = 0x0000ffff; , y) |' w% Y: U Q! X1 l, l9 r3 K& O5 Y
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;7 {# q0 J" P- }7 L+ N# W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); 3 G# @- N5 h" ~2 K7 T4 j mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; , k! n8 X& T$ X' z while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );' D4 i. _* @% U" Q5 p
4 X1 g6 \: c2 q /* Write a 0, so that no underrun occurs after releasing the state machine */ % b. V3 g5 c5 y8 Z1 A* b# s mcasp->regs->XBUF5 = 0;0 K+ d5 d$ E% a, L" l) w% h
mcasp->regs->RBUF0 = 0;6 x6 g' m6 F! C6 J# d5 C. T, c0 F; l
3 |! B& A; \8 h# ^# Z8 F4 Z; R mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ' f" M6 Y7 _2 n* ~
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); " o* c C7 W+ F) R% H# B; j% L3 U, a mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; $ c0 z \+ p9 U# O- y( r/ L; O
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); ; s- m& q1 ?0 D , Q, Q3 T7 p$ E) @: T( @5 h" o mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ' ]4 V2 l' U* u3 o. v$ T; d9 y0 G
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( N1 P1 D X! l
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # w' Z# U' ]) C$ v1 T6 I
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );' R1 l$ y) |- U! i6 D* K
$ t( X- y H( z" L7 } CSR = 0x0000;: {) @ r# P, }& ]! _% x
INTC_INTMUX1 = 0x3d; & |/ D# }+ k8 X. U( H- q' d ISTP = (unsigned int)vectors;% H3 y7 j" M$ }& ?0 ? _
ICR = 0xFFF0; # T3 v3 W0 W% J9 P' g7 O: H0 G+ e
IER |= 0x12; - m2 A- H+ k P CSR |= 0x01; + o1 G7 C. F* ~! h/ v! D; s$ j# {. X
+ v( o- g, v0 m4 L
, n* t' G! Y1 i( X % s4 p! a' B0 t( C! f8 H$ ~ k还有就是两个输入输出函数: / p8 ~& ?, @1 b3 A) G7 J- Yvoid output_sample(Int32 out_data) 8 Q! d N2 b! v0 Q) Q$ q, u{ 6 D( b) ^2 F' O- {8 B AIC31_data.uint = out_data; 7 D' R R$ a" _9 Z
MCASP1_XBUF5_32BIT = AIC31_data.uint; & ?) d8 R1 J( @; |}, Q. ^: U3 ]2 w% a+ @; E- O
! [9 N. R" _- IInt32 input_sample(void)5 Z0 V. k T' I) ^3 B, J
{ ' P+ @$ @! Y0 q! Z2 V AIC31_data.uint = MCASP1_RBUF0_32BIT;- c% Z( v) e, D% W
return (AIC31_data.uint); ; `6 C; T$ n; `: v}, s7 v8 U w7 h0 I& d& t7 K: t s3 S
- d1 j. ]& ^; ~6 J作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)