标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: % _2 W/ A6 X4 w, l' m! wmain文件: 9 G) I/ g6 d6 H% L. ^3 A& Z* v# finterrupt void interrupt4(void) K- e! D# H% K
{ 5 S9 m3 [% U/ F( Q l9 x* z" Y# G" I Uint32 sample; 1 ~7 k; F) ]. v# v- j( E, Y. k3 f9 J ) Z6 w2 M4 ~) m sample = input_sample(); // read L + R samples from ADC , E% G( O& q/ [8 z) i8 E# F" d9 R output_sample(sample); // write L + R samples to DAC 9 P, ^9 C3 I/ K# X
return; , U$ D3 z+ m$ x5 O* G} - [* L$ S6 n- R3 d7 m* f % R( g& b8 ?0 C+ o6 y1 rint main( void ) ! W ], |5 F: r- x* V{ # @* g' S# `# \8 h- W6 Z # d* r. W6 s: s% h" f6 K" y7 ? /* Initialize BSL */: U- G% C: O: @( m5 t! w' c
EVMC6747_init( ); ' R2 Z# d3 o7 ~) u: G; U, F6 {. y) W /* Call evmc6747_intr function */2 D& P" P( j, A
aic3106_init( ); ) G i; `; P. G& ?8 J }; Z9 @ while(1);# ?" c5 [) A' H$ l! j
} ; @7 |9 Y9 ?/ W1 ]7 t 2 d. _) K' f- a+ X" q2 l3 ]# U& R9 h) M$ B5 v- ]. E) N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 @3 F) R& |3 t1 y
/* Initialize MCASP1 */ g+ r$ z8 [- u9 S
mcasp = &MCASP_MODULE_1;( y$ Y) _5 |+ L r5 r' l
mcasp->regs->GBLCTL = 0; // Reset' e4 d8 ]1 g3 B0 r2 f* x
mcasp->regs->RGBLCTL = 0; // Reset RX [; n& {( _: ~" d' v
mcasp->regs->XGBLCTL = 0; // Reset TX / [0 l# l, Q; |; _) l! r9 |: F3 P mcasp->regs->PWRDEMU = 1; // Free-running2 p8 N* @8 `6 g" X! |
// configure McASP0 receive registers 2 L; X3 N- t0 r! K/ O mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used, R. I5 y' o. M, E, y
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus ; J& |8 y8 k4 v* ~1 h- d+ q& P mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word , `; B5 r6 i$ S mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) , R% q3 u( u Q h; C- C- F5 f mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side) ) D: d' U& i; e9 m3 k) ? mcasp->regs->RTDM = 0x00000003; // Slots 0,1 2 {' P% H5 c ?! \, K) Y8 [ mcasp->regs->RINTCTL = 0x00000000; // Not used - |( d. {3 `; b4 Y& C mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& w3 R) a+ u; O* T7 p
& j. h2 L0 W& K* } S3 S mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used # N& M6 e" }! t6 O2 [4 B( ] mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus ! t" a9 {% A3 [5 T P5 l1 D mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 R' [9 Q( L) }1 d) j/ m
mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16 7 P3 H# i- I* t% v' G mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK+ f. v& V: C3 U% n. a& i
mcasp->regs->XTDM = 0x00000003; // Slots 0,1 m& m- Z! Q5 T4 o$ r. B7 s mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit 4 z4 n( J5 o( @$ v: v4 e4 ^ mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; ?+ K1 |+ a# j) W* H$ l# Y
0 S1 z) s( S% z9 `- f) m8 R mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN , F3 |* X6 q: ~/ S; V mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT# u4 i5 \5 |3 d" Z+ c0 X! N* l. n4 @4 O
mcasp->regs->PFUNC = 0; // All MCASPs2 L1 l4 B& W+ r2 w! Z' Z% j- E3 E2 h+ w
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' P* }+ b2 }% l5 J2 E2 O
# B: D) ?0 k. R N4 E, ~ mcasp->regs->DITCTL = 0x00000000; // Not used 7 A; L. @2 X+ e" l$ [; t. ~ mcasp->regs->DLBCTL = 0x00000000; // Not used0 c) v* i2 Q' j7 A8 t4 S
mcasp->regs->AMUTE = 0x00000000; // Not used/ Q6 u& p! O; ^* k: e
8 L4 l7 X/ K" U$ R$ i6 R1 X2 O
/* Starting sections of the McASP*/ ) q% D5 I1 t# i5 U% E mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , F5 s+ x0 E: O) K) ` T
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); 8 R8 W' F& U8 x# O0 g# u
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # L; K: \* f5 C0 X
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); & K: v, g6 s. Y0 Z( S! G1 e5 l+ t: l( W7 }% J
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; # r% }( |% u' T# b9 N3 A while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON ); 4 V0 ^( {7 @1 b- e' H' ]/ ^ mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; . a; m6 C1 g9 @; c
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); 4 A( p5 ` v" j1 x1 K( i0 d " B; p3 i8 o: c2 n mcasp->regs->XSTAT = 0x0000ffff; # t$ C9 `) j* _* [# Q
mcasp->regs->RSTAT = 0x0000ffff; : i" ]% B; @6 q6 x7 g5 U# `0 n0 H4 X8 o; J, y! r% U8 F
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; ' H8 q% B, Z7 J8 e; Y2 S# t. H while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); : ]0 k& [6 O! I9 v0 @ mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 2 d8 y1 B% |9 G |( I8 f4 { while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% H$ z; X/ B# m& t
6 D# `8 C, m" ^3 B& f) i6 j ? /* Write a 0, so that no underrun occurs after releasing the state machine */ 4 p' J) r7 i; k' W mcasp->regs->XBUF5 = 0; , @3 F# y' F: {- }/ u3 w mcasp->regs->RBUF0 = 0;$ I2 {3 }) d5 }4 T1 ?) n
6 D, @ I4 ~ l3 U5 A; j3 {+ r, H mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % A! m, C V/ c( o/ \; Q4 u0 ?+ r
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 G5 i' w3 `& M0 p" j, `: `- k
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; - s- n9 [# v: }8 A0 N9 H1 b1 H) B while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); , s/ X! Y4 R1 C9 L. L& @* F# S, s5 r3 e# z; k% ]
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - {1 U: Q7 j. F5 a% O0 W
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); . k3 p9 N; l: k: L. a) m( m mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 7 n$ t0 e% l9 _( v4 b
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" i: q0 p i7 v6 L0 |- t7 d
" s5 @, a1 E) W8 L& ?4 C# I$ p% \ CSR = 0x0000;7 l" g; s1 a) H/ W1 X! z, m$ F
INTC_INTMUX1 = 0x3d; : {3 D' v* F" t6 k ISTP = (unsigned int)vectors; - T$ R/ M$ p6 h" [# b5 \7 Y% a: r ICR = 0xFFF0; , t, |- z8 I% o7 Y+ Z. n& e$ z- d3 A IER |= 0x12; ) B, j% c; J# k4 T' a' Z9 ~
CSR |= 0x01; ; y+ e5 e7 j5 c+ g
+ W0 p5 [3 [' W. D : r" s& Q: j! w ; f/ u2 b. H( \8 a+ F: A还有就是两个输入输出函数:/ x# ?3 J# D8 w
void output_sample(Int32 out_data) 2 {' o6 Z; m! V+ c9 e{6 @0 k) J3 r _( r
AIC31_data.uint = out_data; 5 m4 |" F& i& T/ j
MCASP1_XBUF5_32BIT = AIC31_data.uint;& V' w+ ~6 f! Z5 z+ F- Q
}+ b/ h. B0 z8 U) n/ ?3 a) Q
7 O2 G$ V6 @) ?1 f0 a/ s( o _" v* I
Int32 input_sample(void) $ x- g+ M( g; d, _4 b/ b- W{ ) A& g/ d/ c7 K- @" W AIC31_data.uint = MCASP1_RBUF0_32BIT;- ~7 C/ @/ W* x: a7 q5 |8 {1 C/ p
return (AIC31_data.uint); * z- r% P+ Y( a ]# ?2 P7 Z6 H} + Q0 k1 E# F5 u% ^) Z; |' `! \5 ]" P* J; X1 [ 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)