标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页] 作者: yusijiangchengm 时间: 2016-3-15 16:07 标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 J3 y h5 t b* K% w) v
main文件:& b* h- |3 g* n( Y/ @7 {, t) M
interrupt void interrupt4(void) 6 U, ]* o5 `, h1 B' x# c
{ 8 t5 X- R3 q( {( L Uint32 sample; - B# T( J7 i) F2 V6 t! D9 t6 u ) H, ~. r2 F; r6 u! | sample = input_sample(); // read L + R samples from ADC 1 P5 Y+ r3 H- C) R$ U; W c; A" e output_sample(sample); // write L + R samples to DAC 6 m/ t% y1 d0 }# u: _& W! K$ \- F return;# D3 P/ B: G" U8 c/ N
} ' c" b4 f0 X, _9 D- A8 v2 D$ {+ S" \" }) \( s7 s$ @, A5 |
int main( void )/ \& F2 i) e6 I7 |' R
{$ a# Z. \! _+ O. m4 R4 }4 Z4 g% E
9 Z: x8 T$ f( \% B7 M
/* Initialize BSL */ 9 w T; p* q8 s6 b- g EVMC6747_init( );6 B4 d; N8 f/ {& Y l
/* Call evmc6747_intr function */* d! I7 ^% G( T6 y; [
aic3106_init( ); ) { B4 t( ~0 X$ p d while(1); & c- h, a% D( C0 i0 l4 W& T} , A+ L9 ?8 b5 G9 ~5 l7 x1 p ; [& c* U% j+ t% ^7 @5 ~# ~& b$ D+ m- C: |1 {9 b# B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 A* B0 v" ]( k1 [
/* Initialize MCASP1 */! q$ C7 J7 t; R( Z" \9 f4 m9 `
mcasp = &MCASP_MODULE_1;) i$ k# Q! {+ U# {$ A
mcasp->regs->GBLCTL = 0; // Reset+ i& @. d. a- [9 K3 O$ P+ e6 H( T
mcasp->regs->RGBLCTL = 0; // Reset RX ( a$ n5 I0 ~/ i* h0 a# E& o, N W mcasp->regs->XGBLCTL = 0; // Reset TX ; \" F3 v9 F5 R mcasp->regs->PWRDEMU = 1; // Free-running 6 s1 C* c& N2 m7 W p // configure McASP0 receive registers! N; L$ J0 C6 `) J4 ]5 Y: a
mcasp->regs->RMASK = 0xFFFFFFFF; // No padding used 6 G; [- F) V, p mcasp->regs->RFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus 5 b5 l# g; [0 d6 T7 N% i& q mcasp->regs->AFSRCTL = 0x00000112; // 2TDM, 1bit Falling, External FS, word; K" N1 b* [- S; x
mcasp->regs->ACLKRCTL = 0x000000AF; // Rising INTERNAL CLK,(from tx side) % _0 c' [$ w' i5 b* p) H& j mcasp->regs->AHCLKRCTL = 0x00000000; // INT CLK (from tx side). o8 c! i% C6 d* H. H5 I( r1 P
mcasp->regs->RTDM = 0x00000003; // Slots 0,1 I3 h9 ?% S: Q/ U" x4 M% e2 }& n8 V! i mcasp->regs->RINTCTL = 0x00000000; // Not used- X- {2 E1 M7 L2 \% T! `' v/ m, @
mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 / a& e+ [+ Z6 d5 L( T+ T7 ~6 N' |0 D! p1 D' n0 [$ v* P% \& V
mcasp->regs->XMASK = 0xFFFFFFFF; // No padding used 9 E, ]) Y. o5 m) T- x7 L1 j4 l mcasp->regs->XFMT = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus , m; p) v0 K5 {7 Z mcasp->regs->AFSXCTL = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word + b: f C1 B& H* d; S( G mcasp->regs->ACLKXCTL = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( H* N7 g3 v6 c- @
mcasp->regs->AHCLKXCTL = 0x00000000; // EXT CLK 5 J, v! A* u0 i% Q: \. q% | mcasp->regs->XTDM = 0x00000003; // Slots 0,1 3 p* q) V0 p3 E* ~' |- I4 b0 S% N$ [9 N mcasp->regs->XINTCTL = 0x00000020; // interrupt on transmit* g4 r. ]% [) D& m O: t
mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256 G- y8 b4 O- g0 Q% e6 r9 S
' a6 s" |* ]9 b' p mcasp->regs->SRCTL5 = 0x000D; // MCASP1.AXR1[5] --> DIN, @% C( s; y; u5 q# M& r" m, R7 C. @
mcasp->regs->SRCTL0 = 0x000E; // MCASP1.AXR1[0] <-- DOUT 6 v, G5 ?( P& t* A/ G+ t! i4 A' | mcasp->regs->PFUNC = 0; // All MCASPs ' D" J7 {' G* @: n7 W: l mcasp->regs->PDIR = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1 m, w0 U3 [: F6 s
y1 r& y. ?' G$ Z! A9 Q5 G
mcasp->regs->DITCTL = 0x00000000; // Not used 6 g5 I2 m# l4 h9 ?: n mcasp->regs->DLBCTL = 0x00000000; // Not used) ?# o3 g( p" n$ k/ M" p
mcasp->regs->AMUTE = 0x00000000; // Not used 5 E n% K; t* @# |9 u9 k# Y* ^+ ]9 T% z4 _/ Q: v4 {, p
/* Starting sections of the McASP*/) M$ A) M- V7 a2 g2 J! y' q# D: ~
mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 N8 ^+ m4 r. u9 `$ \8 r4 N
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON ); , R" @0 f# e H. X% F5 }& p9 ~
mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " x) A1 n" [* F, m
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON ); 8 R' e' `& F0 f4 `& D; H j, [2 X! M6 g, U mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; . c* f' s& G) h5 O while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 ~7 L) w `$ x
mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * d1 e9 I7 N- f0 ~. w( u% ^
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON ); 7 Q+ N. X. P; d; J% g) v 1 w) X2 \5 D6 D- z2 U# T7 f2 v( F mcasp->regs->XSTAT = 0x0000ffff; , [& F3 `& P: p- o% {; o mcasp->regs->RSTAT = 0x0000ffff; + k/ I+ n5 V/ z/ `4 C) c: D9 @3 f4 G9 M! t5 o0 B
mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; - z' ^- b5 n% m- v- g) X while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON ); - k" K" p5 W, K/ z0 K mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) ^2 e) I' O8 ^7 @) c5 ^' v7 t& C
while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 V3 a& B y( n% w! e6 w/ q s9 f
n1 n& p* B, b! v7 F% ?2 M /* Write a 0, so that no underrun occurs after releasing the state machine */ |2 Z4 [- j: {1 l
mcasp->regs->XBUF5 = 0;( Q' i5 x6 A8 q5 ?( c8 [ j
mcasp->regs->RBUF0 = 0;% L$ f/ e7 b x' L: M8 s
1 c- Y4 E* X! n/ h5 v/ D mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ; n. e5 h' Q3 R while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );1 E8 [( s# j' o0 Y& A
mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , T6 z/ W+ r1 V- F4 v; x' T while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON ); $ m) O' Q& }+ A% e 8 k: J/ ?/ c1 J mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , l$ B8 d" K+ V" b. o& y
while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON ); % y* [ T+ i( }! v' i$ q5 o mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % A5 t2 g4 h( N% V/ y while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON ); - ~8 P5 `3 b9 C$ e4 {; `( z! D& w# A 4 k' F! i' q: a CSR = 0x0000; ) e8 W- e# U6 @% l& s INTC_INTMUX1 = 0x3d; 2 _5 G3 S; O7 L$ j8 l% x ISTP = (unsigned int)vectors; ) i' }+ o* M2 ]/ b. t& n4 P ICR = 0xFFF0; J. E7 |" Y% d IER |= 0x12; ) I& k% y' h/ i, D( L7 l CSR |= 0x01; 7 n h& J. e/ W. ^
* q- t! m* c; p' e
4 Z+ C) F3 G, u6 f" Z$ k: V
3 u# ~( ~9 g* M9 s3 i
还有就是两个输入输出函数: 8 b3 o3 g4 k1 j. L+ ?% T' dvoid output_sample(Int32 out_data)% L3 ?) b4 p6 @' Y. S! o: l
{& }9 Y: q+ V" g4 i2 A0 c v* B) c
AIC31_data.uint = out_data; `7 g) k [& T MCASP1_XBUF5_32BIT = AIC31_data.uint;0 x! E Z y. O! R" n% s2 U* A
} / i: O, n' n7 p, y! n" y; N1 d M% J8 H+ }6 S" u3 ~6 n4 ~: N
Int32 input_sample(void)1 Y7 M+ _) o- D' r' h& M# F2 t
{ # y$ x& S, e8 k
AIC31_data.uint = MCASP1_RBUF0_32BIT; # J0 O+ d; K( [7 C return (AIC31_data.uint); ! d6 c7 p& E; S% p- h, V! K} , B" _6 @, `) V7 e T 7 `4 e1 N8 p6 ]) }' w作者: human 时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)