标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: & m& @( K6 t( W/ S% e! g7 Nmain文件: 6 w% ?+ X" n' a6 {2 hinterrupt void interrupt4(void) 2 y' n/ K& _& @1 {' U{% H: P% V: c4 v# ?, t4 z3 ]8 Y
Uint32 sample; ; g, ]4 o3 j. A. ^0 D6 z1 {) b ) p5 d! Z# m) r! _0 K, L& E/ { sample = input_sample(); // read L + R samples from ADC/ h$ L1 ?: i0 m% H& L! Z8 x
output_sample(sample); // write L + R samples to DAC 6 K t! l) [/ N K2 Y: q( p) [ return; , c ^- z! C0 \}% _; X/ D7 Z ~8 r
% G/ O; B7 q$ W+ h% m; b$ y [8 Wint main( void ) - G* n8 J! A2 H{ 2 ^- r/ s$ H4 o+ s4 K i' g( W L, ]; R /* Initialize BSL */ $ A- s: W- s Q- M* x E EVMC6747_init( );% R) R9 Z \1 N X2 G# M3 e
/* Call evmc6747_intr function */, K: e) u1 C" w+ `
aic3106_init( );- i7 } ^4 n0 q
while(1); ( G3 u* L* r$ }6 \} ; Q0 m' f2 e: }/ \9 o " ]+ p- R3 y+ x( v+ e" A6 w' ^" x i* }, ?
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题 * d# ^: o6 {5 e5 t3 d6 C/* Initialize MCASP1 */ + s+ V$ P, a2 Y* V6 u- F mcasp = &MCASP_MODULE_1;% @( p1 A3 [3 q* [( m" n; E
mcasp->regs->GBLCTL = 0; // Reset ) ^& G( i. m) l# r9 h( ~ mcasp->regs->RGBLCTL = 0; // Reset RX3 k! I: E) |8 @2 c5 d6 c
mcasp->regs->XGBLCTL = 0; // Reset TX + n+ O- `' Z5 {4 c* ` mcasp->regs->PWRDEMU = 1; // Free-running " N$ L7 D0 a j3 X9 d# |; N } // configure McASP0 receive registers0 K: R& ^2 }. n1 j: h
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used2 I9 Q2 Z/ t1 y7 C4 m
mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 4 |8 r; y. g! Y mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word" Y/ B$ z: J. [1 a0 x: O, _
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) , }( r: O- h4 ^: Z. Z" X, v: H o mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)& B( w; }& ^" B) R
mcasp->regs->RTDM = 0x00000003; // Slots 0,1 + V3 X; f1 l' p Z' _1 P mcasp->regs->RINTCTL = 0x00000000; // Not used3 i% Z2 p5 C( q0 B2 { ?$ j1 i6 B
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2568 \! H. G: ]: H) d# J
7 H: s4 g9 ]0 i+ t: U" m/ N9 l
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used ( g$ Z& y! l _( p+ W; E mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus ! z5 p5 B- z b mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word ( ^/ G, {" ^% d mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 M5 N: ]6 [7 s( }2 W8 s
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK9 I) E/ n) T! n
mcasp->regs->XTDM = 0x00000003; // Slots 0,1 * X% U ]) t! D" k mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit. z9 V7 |" a9 X6 n% c0 i
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 R8 y& ?7 s% e, k2 t! z) [
; ]- x3 J7 j& V# w; v mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN - Z; o( k" g& L+ R& L mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT7 i: j2 A" e { C. e% L
mcasp->regs->PFUNC = 0; // All MCASPs8 Z* ?: e+ c) r
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX17 S$ F( @, ]9 T
' m# G) d6 f& I: y, L mcasp->regs->DITCTL = 0x00000000; // Not used# N' I$ D0 V7 A- A
mcasp->regs->DLBCTL = 0x00000000; // Not used/ x$ Q5 `3 K! C' M4 M, S0 S* M
mcasp->regs->AMUTE = 0x00000000; // Not used: u" _$ G2 r; T" s& ^+ R
1 y% T: V. J8 @. Y1 n z f/* Starting sections of the McASP*/ : F1 j) T# r4 I' }" b3 @- @ mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 8 a! a$ V: A) X0 E( z7 u* k/ C; _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); - U) g' d3 ~" G y4 W; n0 K0 z. v$ ?
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & ]# [0 L2 u+ S5 \3 ?# Y& G( a
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 p" f6 T, J5 Y8 f
! e& B3 q, Y! T! t
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; ! y. d* ]1 L6 d% S9 l while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );- U: P" O& N! ?- V9 x0 e1 Z
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ) [9 d3 _2 n/ R5 a while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); , n- {- Y9 z; s7 }; V: ?. m i3 _0 i4 \2 F: j
mcasp->regs->XSTAT = 0x0000ffff; z4 [5 x j8 B% _
mcasp->regs->RSTAT = 0x0000ffff; 7 [1 _7 j$ ^4 e9 V6 p+ Y9 u r & f9 W7 w; [3 \1 R mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;- H: s: b4 [) I: i3 ]% C
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); . W9 V/ I7 V8 B/ u mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 h1 ~! H) P" x- e5 N& L
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );2 L, t" }2 H, A _( [
+ r: x( W8 o$ v% [1 D3 x8 ^
/* Write a 0, so that no underrun occurs after releasing the state machine */1 r: o3 a- t* [% m! j% X
mcasp->regs->XBUF5 = 0; 5 l# ^$ e0 ?# Q M2 F& ~- c mcasp->regs->RBUF0 = 0; # i' t0 c: Y- d& d: {, U- v 3 { d; n% q: q1 v mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; + j* _- a0 z: ~) w1 B2 _ while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON ); 0 N" R1 ?0 A" U: k0 l7 Z mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; j, |$ f7 [- `# H
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );5 [$ x6 S* a) L2 T# x. X
% d# S2 c2 o' s# `, J: H. W mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # M! Y7 C" z1 @, A' o% n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); 5 E5 v- x a t' N3 X mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 M3 w4 j" F2 m6 ]0 N0 e- i; ~ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );% }/ S- k/ R& O2 r5 v) S7 Y
1 u+ N- @6 m! [2 `+ q) A% ] CSR = 0x0000;3 p% j& a5 ~5 y- ~; V
INTC_INTMUX1 = 0x3d; ( [* P3 D3 | P ISTP = (unsigned int)vectors;2 k: w' ^0 R3 @" h
ICR = 0xFFF0; . I& ^! \; L9 h- B( i- G
IER |= 0x12; 5 Q/ |& Z+ E' s1 y CSR |= 0x01; 0 ?$ c* I( o' \& Z+ S, R( l ' q( _% H1 {) r ) G% o: Z* E. v: T- V 8 R7 @; S) E9 j% Y还有就是两个输入输出函数:. [% h9 l' \0 `. J9 i; [
void output_sample(Int32 out_data)$ T# f" L. e, `8 m' ?$ I* k3 D
{# I i, X1 q, M5 q9 V( S9 J2 j
AIC31_data.uint = out_data; , X# j; L5 o h* ]7 }. Q, [
MCASP1_XBUF5_32BIT = AIC31_data.uint;! Q+ D/ @7 p# ~! j; G' X
} ; E5 v6 c. T2 i; n P9 l0 e4 }% \2 R5 o
Int32 input_sample(void) % u2 [* S2 N0 p( h, S{ 1 G$ ^$ \; P+ j# ^ AIC31_data.uint = MCASP1_RBUF0_32BIT;5 g" E' m5 \' q3 a( H
return (AIC31_data.uint); s; c) G2 h1 h# F* q/ r} ; F0 B) c& n/ G( x; i, I + ?/ Q4 s! N* [8 P2 z9 q2 L- q作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)