嵌入式开发者社区

标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出 [打印本页]

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% `; K6 U9 \- P6 d) V6 [% w: wmain文件:
8 f  O( d" K; S& n) Y- Q. f. finterrupt void interrupt4(void)  / e& e- n2 N! A. `% v9 Q+ o
{
0 ]+ i# w! F; B! m  Uint32 sample;
- k. [) h( q( j% a
9 I; b# l( c( [. O0 t, o7 `# W, m6 ^  sample = input_sample(); // read L + R samples from ADC
7 d8 h* ?; W3 @' U  output_sample(sample);   // write L + R samples to DAC 5 }" T! v  y8 {0 Z& K* I3 O
  return;3 h$ f: o& Q( \* q2 m
}
8 V9 K8 ^! q! P
/ }+ c- d' d! S, fint main( void )
6 V$ {' `! @& P) {{
" m) B8 w. _+ j1 x+ l* H* k1 e3 F8 n5 c) k( X: p; R6 x
    /* Initialize BSL */( g& k1 V8 F( g0 |' ^9 W- Y
    EVMC6747_init( );4 L7 B) o3 |6 G, B. x' g
        /* Call evmc6747_intr function */
. t: B  F2 k8 t1 p; L0 o    aic3106_init( );
, N) ~$ ?  c5 g! ]. K0 |        while(1);1 A% f7 q3 _  w0 d# T* O
}" e; b% z" @; A7 S3 Q1 z9 {
  E! h0 |" P  k" v, }$ s
1 F; A7 A5 |' ^
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
5 @% i9 z0 H* ]' o/* Initialize MCASP1 */4 Y! b: s; i  V! g& F% Q- P
    mcasp = &MCASP_MODULE_1;7 A+ [2 c6 z/ I. x. v% A
    mcasp->regs->GBLCTL  = 0;       // Reset
6 }( h3 R/ u. a0 w1 K9 g    mcasp->regs->RGBLCTL = 0;       // Reset RX
) b9 u  |3 t' _; u5 b# R    mcasp->regs->XGBLCTL = 0;       // Reset TX. G: O7 l; X  n3 z7 ?, b: V
    mcasp->regs->PWRDEMU = 1;       // Free-running
! [6 A6 C4 }' g! H. F   // configure McASP0 receive registers6 d+ k5 z1 ?7 X7 p3 m9 G, m4 I
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
# N3 I  P4 R, }( t6 h  u- f0 I/ N    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 i% H- Z# d) y9 j
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
* q% a, O# F; l" K0 }! X; u/ X( J% o    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)' C/ B: D& N. b: F  q5 s
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)1 ?& Q, b$ h, L
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 ~  s2 L* |9 |# d" R7 C
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
' @) V- C  h0 F* B    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256( I3 x! c. e  \4 f
1 s3 z2 r& j1 ?* P+ F  P3 a
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used$ l: m5 e- @; ?
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! b4 s) K* I; o2 m    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word0 D2 _$ C$ F8 e5 }; v7 g
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16% P$ `6 p' g3 \3 S1 h
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK5 p9 U- F' z0 ^6 F. y
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
9 _" G$ ~: q: U7 Y8 H    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 z% A2 U! r  i    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" z) p6 \1 R' ^8 |$ l9 i8 `! A1 A( M# f& `# k
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
6 J3 E# |: M6 N; K/ O    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT. o6 g/ g( j  `7 u) [7 u2 m. n
    mcasp->regs->PFUNC      = 0;          // All MCASPs
* w! o$ q6 M; J# ^+ O    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 h% t: I7 g7 B8 e- S$ [7 q4 h
: W: ?- B9 f3 P6 W8 Y    mcasp->regs->DITCTL     = 0x00000000; // Not used4 r; d9 W2 T- C0 a. Q; j
    mcasp->regs->DLBCTL     = 0x00000000; // Not used! K- u! [, W/ z
    mcasp->regs->AMUTE      = 0x00000000; // Not used
9 X$ s" |$ H, M4 Q4 t# n; W" W) ]; U8 y  E* _9 e7 o" n
/* Starting sections of the McASP*/+ Z+ P# s- }0 Q; f' K
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 a0 m# Z1 Z; H! F2 h8 i    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
2 @, o. b7 l9 B) e    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
) `* Y6 _2 U: D8 q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );+ t! r, V. c6 e7 @
' V9 N! n% }5 {0 ?& L
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 M9 T( e+ B) q4 W& o6 T3 r* Y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 ^* O) }( x) t( M3 |8 ~( K
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; : A' u( q% |/ O. t! f5 x; j
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
6 Q$ y1 n3 f$ v, l. O3 U
( W; j8 _6 q: q! l    mcasp->regs->XSTAT = 0x0000ffff;
* N: H! T+ r0 _5 M  `% [" J    mcasp->regs->RSTAT = 0x0000ffff; ! P- ?$ A8 r+ P5 i5 M
& o! S: [; P; E
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;' W9 x* [- y) ^6 r/ o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# A3 W$ l! s4 Z$ k
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 c2 z7 I1 Z5 l3 o2 l; Q- n  R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 k- f. F8 H: T3 ~" F8 G8 N4 k7 Q2 J4 o8 h) q' F' O' L( \) n8 @, T- w
    /* Write a 0, so that no underrun occurs after releasing the state machine */
: ?9 [$ h1 s0 o' a! A    mcasp->regs->XBUF5 = 0;
0 @+ Z& j' q6 d    mcasp->regs->RBUF0 = 0;
2 R0 D6 ^. H+ Q+ F6 n, t2 Q5 P" s3 Z, f2 g) b* v+ X+ D' M' j
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 7 P4 h- H# E% {  Y& u
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! o! M, U; ~, m$ k) m7 m8 c( n
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 R8 U+ i9 ^1 e& h- a7 k4 |    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ {0 }3 t2 u* x! O& t# ?9 t& C  k& }
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
) b/ r6 Z" Z8 t( d9 d    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( d$ x- N1 c' L0 F; U
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
* w2 q& o( P  b$ M    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- {3 J- g$ ?! T. ]
& B+ ?* d) w! ^1 c" S    CSR = 0x0000;
! U3 D, |) C1 }& |" C    INTC_INTMUX1 = 0x3d;% T7 A" }: g: F! E; V
    ISTP = (unsigned int)vectors;- ]% w5 W4 B* G7 L5 X; u3 s
    ICR = 0xFFF0;  2 o2 O& Y8 c  p% t
    IER |= 0x12;  
* L/ @1 k) q& u    CSR |= 0x01;  
$ J, b" `9 _2 e" T, J  L# q8 x' f- i) A( W9 c" x

& T7 ?9 Y; q5 C* _5 [
0 q$ Y6 t( H7 O9 `还有就是两个输入输出函数:
; l5 x. T  b( @" w  v$ ~9 u2 X" [7 ^void output_sample(Int32 out_data): o" H8 f  v5 C) l* }% c3 D; ~! ^
{) R2 z) A! ^, [9 P! m$ n" c
  AIC31_data.uint = out_data;  " q- V- B3 p# E
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
, C4 O2 K6 @# f- s$ s2 R& E% I* E}
2 O; u. Z0 a" W7 N7 u0 ~2 |: F6 r( Y: {9 F0 N5 ?/ D, l2 O. @. ?; {
Int32 input_sample(void)9 W7 G& p  D/ T) ?- D" M
{  
" }  u  ]2 V& q  C7 M, @( P  AIC31_data.uint = MCASP1_RBUF0_32BIT;
; J( u! N9 j, b  return (AIC31_data.uint);. }8 \- d% N4 }; p+ v
}
. s$ K5 M. O: K3 p4 k$ Q5 x8 B4 I
1 R- }9 k6 \8 r8 d& z" A
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4