标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序: 7 B( a& N E, y+ G9 tmain文件:" S, [+ A4 ]* W% @" p& n
interrupt void interrupt4(void) ) M1 k1 c5 z8 y2 `{ ) v2 U# n' l' P( v Uint32 sample; ' g' k0 v/ _6 m3 w M/ S ) D/ L* D6 E) o* C) g) j sample = input_sample(); // read L + R samples from ADC ) { t8 {$ _. g* z r3 w/ I output_sample(sample); // write L + R samples to DAC 7 ?6 l+ s$ r' @$ v
return; 2 j8 i$ G; Q3 J0 T H: N& ~/ M7 ^} 3 q7 N0 Q @5 v( u$ g3 B" [4 D, c+ `, T! ^* ~
int main( void )/ [( M. e# b5 q1 \" ]% H2 y
{5 C$ W. V/ c: y+ H. p4 C" g
/ M- f9 T8 x$ R* S /* Initialize BSL */ L/ i( v: _& |( d' h
EVMC6747_init( );8 q! B2 ^! D+ b3 J b9 J
/* Call evmc6747_intr function */ I' x0 A% Y, |0 ] o( `: N4 z aic3106_init( ); 8 }/ p1 [$ S% o7 f8 d0 Y while(1);" V" _2 ?! e$ W' Q1 g
}8 V- W& R* r! O6 R- u' a
# _7 d$ J, J9 h9 E3 ], U ! F7 @# `# a/ u9 l% `1 G2 Aaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题& ?$ }+ M" d* W
/* Initialize MCASP1 */, y7 {$ X3 G v. P& p
mcasp = &MCASP_MODULE_1; x: _ _, U, p' {7 ^2 d+ r. `# G! h
mcasp->regs->GBLCTL = 0; // Reset* O1 c: f- K! D8 w
mcasp->regs->RGBLCTL = 0; // Reset RX : j1 T1 e+ t5 u& q( E mcasp->regs->XGBLCTL = 0; // Reset TX 3 n& {7 T/ {/ j, V9 p- L8 t+ O mcasp->regs->PWRDEMU = 1; // Free-running 1 V' J5 S9 O' ] // configure McASP0 receive registers0 I: E x w2 ~4 \" Y1 `
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used : w8 K6 F C! p6 K mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus+ v4 V6 F4 V4 I3 _& p# O
mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word' m/ }' ?7 z$ W8 L/ O# ]
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) 5 }$ [ |& t4 a, \+ G7 P mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side)$ g# R( l7 Q V1 C5 h( {6 h
mcasp->regs->RTDM = 0x00000003; // Slots 0,15 @- Q1 b' F) \( h; w8 Z7 w. h( Q6 f! z
mcasp->regs->RINTCTL = 0x00000000; // Not used5 k" \9 w% o7 z& N4 M; t' g( J
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! ^1 j0 K* z8 g; V# ]1 X0 }7 X' h
+ Q4 Y4 N/ C4 D) {& u' a
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used/ g2 v; P9 y! Z. Y+ Y4 l
mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus1 q; P( X8 D. F* @
mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word & D, e6 q( D+ ~ s" Y- { [, I3 E mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% {% C! g5 o1 T3 P* P( w
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK ! y# V) P) A% C( d mcasp->regs->XTDM = 0x00000003; // Slots 0,1/ s$ J* R4 u/ J3 O7 b- D6 F
mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit , S; |2 {1 K' G- E+ n; Q" Z b7 q mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 \ K* x' f6 W1 J( H. K* Q; ^5 i m( y; A. p% m
mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN; H, w; R, c0 q' O* v& \2 n
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT |" Q$ u1 Y9 b5 a+ l) w mcasp->regs->PFUNC = 0; // All MCASPs8 R' H$ {7 Y! W/ y5 ~; y" d
mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 e8 A( W! h+ p5 ]
: ]- {* G6 {: S" Q% F' n5 w6 e9 N5 x mcasp->regs->DITCTL = 0x00000000; // Not used # h) J& V5 s( G mcasp->regs->DLBCTL = 0x00000000; // Not used 3 v: Y- p, d5 X. C mcasp->regs->AMUTE = 0x00000000; // Not used8 I7 \4 r7 P c. _) L9 K5 y
. H4 M$ M7 `( C5 q0 i4 m3 i6 K K/* Starting sections of the McASP*/ : f7 w C( N Z7 O# w mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; - C4 v: i$ a: ~! {# \2 H' S
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); % F% @: j4 a7 u; J* s$ I
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ' N/ [# i, G+ t0 ^* p* X+ N) Y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );2 K+ O: L" v) `) ^
/ `" \, e. G5 J7 i4 b
mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; / J1 \0 q) M7 O9 t* n
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ Z" x6 k; n0 i. S5 @
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; ( |. L# B# B# q: P _ while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );# R" @1 ]7 g7 S1 S# f, @
0 ]+ _$ _. _+ M$ a6 q( |# z mcasp->regs->XSTAT = 0x0000ffff; / k9 u! B" V6 H. Y8 H* Z1 x
mcasp->regs->RSTAT = 0x0000ffff; # R9 g0 E, q6 P; x
' z$ X+ B8 T/ O# F P! ~% R/ D {
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 w h/ _8 ?6 W" o
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); / a4 O3 i% p) D' e5 ]2 F4 T8 K mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 r8 U' F! z5 j while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON ); + } V- y9 p, G p6 c) v0 G 2 C/ U' A: Q8 e9 f; k: | /* Write a 0, so that no underrun occurs after releasing the state machine */ / T) a( z7 K0 O/ |0 [" H# s" r) L mcasp->regs->XBUF5 = 0;2 ?% z6 o9 P c4 b. r0 G. u/ u! t
mcasp->regs->RBUF0 = 0; & f" {0 c3 I) h/ E5 I* F6 p- _. S$ i2 m, }5 h7 W& c
mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 8 L" f# V# Q" b. `) I/ X
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );0 X9 C* B4 K8 o4 E3 ~# q. Y" Q2 `
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 0 B+ {. S8 z, S/ `# ~, ]/ g while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );2 B& C9 W; A. S F/ m
% ^5 e' l4 I! S/ P2 Z/ v
mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 1 G, b! x2 D: Q- t7 a' a while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );3 k; u( u; ?8 [$ X$ Y1 c- e
mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 8 L6 r. X+ O3 L: @0 ~' ? while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );: G9 g8 y( U$ Z, i. r3 `4 [: P
! a: q2 _, G6 N6 U) l4 g
CSR = 0x0000; " T/ f+ p4 ?( {# _( P INTC_INTMUX1 = 0x3d; `2 q" Z5 Q* S7 Y1 B# \, ]! L ISTP = (unsigned int)vectors; . o7 J" o3 |4 {/ z0 k ICR = 0xFFF0; ! d0 ?1 T3 f: y$ T" B IER |= 0x12; 3 k0 d- c" k% ], i* \
CSR |= 0x01; - n* R" A: g7 q4 S0 @! V- P- R7 N% X2 f! ~% t O
# m' `5 P" S) m: k: a " |& K, i4 ~3 t, c( E* L还有就是两个输入输出函数:; s& M$ d6 |6 H7 d) F
void output_sample(Int32 out_data) : _2 r4 y5 \* J. Y9 V; ?{ / G3 [& |( t) K4 W AIC31_data.uint = out_data; / F2 M4 m h! E! z# L
MCASP1_XBUF5_32BIT = AIC31_data.uint; $ j' w% M& B% P$ ]# m! O* `}3 m4 o B; O2 f5 b
: G. p" G C, @4 e% e# ?
Int32 input_sample(void), P" [8 a0 N/ k7 c/ v, o* [
{ 7 D2 r. {5 l1 W; q: o/ V AIC31_data.uint = MCASP1_RBUF0_32BIT;7 u ]4 \8 f3 z+ g- ~4 u, z: P, J' Q6 o
return (AIC31_data.uint); $ s' p# Z: W+ s9 v} 7 h2 W% P6 z+ ^5 b; h- f" Y9 z, Q. ?% k* h 作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)