嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
: ?, h% \/ Q- Z) m1 gmain文件:( {1 K4 T  q1 o
interrupt void interrupt4(void)  
6 w- I. ~- h8 h2 _1 R/ L{7 A) d: N9 p) P3 {) l5 o
  Uint32 sample;
& M. Y/ c3 C- j% v
4 |/ N4 `3 B( W' ~- k  sample = input_sample(); // read L + R samples from ADC
" B- o& _" G0 E# |& M5 ]( @  output_sample(sample);   // write L + R samples to DAC ( L4 a& ~( a/ I% z
  return;' Y, ?# w  n2 N7 n
}
$ r9 k& _9 Q; k9 w. O+ T1 [: h0 I: O4 v" R/ D% M7 u+ h
int main( void )  E9 P( o/ |# j1 m2 ^
{. ?! C2 }0 X. @% F: ?; [& u

8 E6 c/ T* M* I2 Q' A! `% F/ L    /* Initialize BSL */
  k( f5 t6 o1 A) C! \3 Q! n8 _( s& V    EVMC6747_init( );9 K1 q2 w/ C/ S) E( ^
        /* Call evmc6747_intr function */
) H4 H% e0 u$ R, }0 E! J    aic3106_init( );1 |+ E. `# i3 ?' W
        while(1);
/ h8 t2 F& o5 o$ y) y}
& @7 V7 ^% {( @0 g0 }& P7 J3 G' d* Q, V/ b8 I9 K
) J6 m) w0 o! k% d! o
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
  E( D; i1 E& d8 a( i/ W$ O/ t/* Initialize MCASP1 */
6 B9 I5 a( x1 c6 Z9 E( C    mcasp = &MCASP_MODULE_1;
; ~% c' m8 k& Y3 b$ u    mcasp->regs->GBLCTL  = 0;       // Reset
3 H/ m( m4 I+ o1 C$ S' m    mcasp->regs->RGBLCTL = 0;       // Reset RX
: V) u! P, A- ~1 @    mcasp->regs->XGBLCTL = 0;       // Reset TX/ ]4 W$ R+ \% c" e5 J' a
    mcasp->regs->PWRDEMU = 1;       // Free-running
- Z# y- r6 p+ f8 Z" {7 l5 ]   // configure McASP0 receive registers
7 S# J, P! h  T6 M! d    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
" Q4 W# F4 L) r  D0 Z% @; L    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus- O) `3 f$ A5 _! J' [9 ~
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word, Z: j; l& w1 Z' d/ d( |" v
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 r1 x8 r& E/ s5 T    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
7 e2 k: }+ d1 }/ D    mcasp->regs->RTDM       = 0x00000003; // Slots 0,10 ^) U4 H3 n7 k( y( m6 d* @
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
+ `0 K' m) p' `    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256) o; |$ o, j4 P2 X$ l2 j: t* r% T
; Y2 y  C) u/ C. Y
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used% m, p8 j( B: l
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 _/ Z9 Z1 e2 S- ?+ `( P    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
6 ^+ i2 ^) }( M/ O2 V" ^5 v$ P    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-160 ?. }( m5 u5 D: ^! K
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
- b! J3 e( z6 [% l( h& S    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
1 t2 `: B3 B2 h0 Y4 I    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
5 F$ E1 O( ^& N. r$ R  k    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256! m. C2 e, z% @2 o1 Q3 S

9 h5 M0 I7 |8 K    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
& h+ v$ E+ B6 Y3 d2 `& K" f    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT& E& n3 p, O0 l! Q, \2 [% l
    mcasp->regs->PFUNC      = 0;          // All MCASPs
8 c. A9 H8 z0 x1 J# g    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
: L6 [* {( w4 l6 Z+ _
9 Q$ R$ x$ ~: x: z    mcasp->regs->DITCTL     = 0x00000000; // Not used
% P; u6 W9 y$ S" b! b& ^+ r    mcasp->regs->DLBCTL     = 0x00000000; // Not used6 m) h- \0 z. Y8 t* n' f8 Q
    mcasp->regs->AMUTE      = 0x00000000; // Not used
' [! h+ s: _$ J3 y! \0 R
) k$ \$ y& s3 {/* Starting sections of the McASP*/4 C2 N1 y% W7 B. L- u0 B
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- h: a! m, x  D' `0 F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
- Q2 z- G  e" N* ~7 u9 n    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; M( M7 l1 b9 y7 P3 m7 P
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );( j! k0 O6 I) D2 b+ _7 c
/ l$ N2 G, E' q: e
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 X% a' I- c% }1 w% V    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );+ n5 p5 J% ]7 x
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
% j, Y# I3 }* B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );) o. a) r& @7 `# k9 ]5 k+ d

8 f) p; ]' T/ i/ V! T    mcasp->regs->XSTAT = 0x0000ffff; $ y6 U( L/ }/ Z
    mcasp->regs->RSTAT = 0x0000ffff; ) E' v+ O7 ^8 F# D
( y5 r! s  O$ u3 U
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 Y2 T: b( d5 P1 N1 i8 o. l" W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ V; }, x8 e- s- L% y5 G  F, J
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 5 H( M9 I/ ?  @
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* ?' }# b" h: l: z" B0 `( {5 N" U: x, Y" z$ n/ T# f- Y
    /* Write a 0, so that no underrun occurs after releasing the state machine */4 o3 e" E. {( ~! E$ \8 @
    mcasp->regs->XBUF5 = 0;; D! h8 e! B" Q, K! |
    mcasp->regs->RBUF0 = 0;
3 v* ?3 L9 Y( L: l
4 J/ n* V' |: x    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
9 t# U: j3 l( y4 c, C# N1 W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# H6 i2 t& S& U    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 6 q7 }0 q! A& E7 `, R' i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
* m; O4 O1 o2 y1 z5 p% a6 p7 |
  Y! `! i# O2 d9 ^! ~2 Z    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 9 |7 D2 g$ e0 X+ q& {4 |
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, B; ]( E) c: C/ b3 [$ |
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 2 e& i+ N3 U: t/ i1 V
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );. v9 y9 }  p2 e) w' Q" ]- H

& |( T% u( V0 z, S5 ]- s8 z5 u4 x1 d    CSR = 0x0000;5 {1 ]0 J* R/ ?
    INTC_INTMUX1 = 0x3d;
3 l$ {) m9 [* ^    ISTP = (unsigned int)vectors;
! r. {$ X8 ?: K) R# ~    ICR = 0xFFF0;  ; s5 t) e' W" f( Y  P
    IER |= 0x12;  * J/ N, x7 O; i$ G, N
    CSR |= 0x01;  
' v4 W% \& L/ n
& c8 l/ c1 W8 ^& p# B; g) |0 V6 v. a5 X# X) k3 \+ z% s* d% N# _
# w# M9 Q# M; U" T0 {' N
还有就是两个输入输出函数:
: Y0 }: k  H5 Y5 \2 h2 jvoid output_sample(Int32 out_data)
( f) F' J( j. [+ _% J{
! j* K0 ^$ r$ m8 E/ q  AIC31_data.uint = out_data;  9 ^1 U& ?% C. s  L) Z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;* d: R5 b, Y( X( v, h6 q- r
}. P- F. e% H2 V" p+ F/ t
) b& Q  A  w& K
Int32 input_sample(void)
! [+ ]* o5 }! z# x" W{  5 r$ `9 Z$ a4 v- e  ?8 b) E
  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ q5 `1 G: ?2 N" J. v3 g4 F
  return (AIC31_data.uint);/ q& Q+ n; G8 o& T- j
}
/ E) }8 }% I( w' `, h  O& N& X# c7 R3 x( V5 F& x

作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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