嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:! h/ D$ [$ l# b- p* S; `; [/ d
main文件:9 f: V+ \+ Z* z! S; i- ]
interrupt void interrupt4(void)  
$ I1 e! ]; w9 q' J  t" P5 H& v0 O{
% y7 u0 D1 _; I# o. M  Uint32 sample;4 x( J* \. H6 j6 P5 n

6 |7 A1 c8 k4 V( N, m  sample = input_sample(); // read L + R samples from ADC( e2 D" @$ l3 g+ a
  output_sample(sample);   // write L + R samples to DAC # l- x7 D/ h* z$ `; d
  return;0 U1 |+ x5 c- u4 @
}
5 \# G1 l6 d7 J
# N: X9 ?4 Q0 k1 ]# {  sint main( void ). D$ H: T0 V- t
{$ D# S6 x+ v( \1 y! z/ h, G  a4 n
* v3 g) [/ F9 L2 R0 K# d
    /* Initialize BSL */3 H# d6 @" e% G1 V, t/ N
    EVMC6747_init( );. {( L6 ]/ _+ f( F- h
        /* Call evmc6747_intr function */4 b8 r! |% e$ Z8 U9 H7 j8 m6 @. m5 e
    aic3106_init( );# p& F) [4 D( h
        while(1);
4 g+ I) x- r1 Z: N" }( g0 j}# J) M- t) O, G& L- M8 `- X1 i
$ @4 Y4 Z" |; R
/ M, t0 T6 b0 E
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
6 p: t0 t7 ~: Y7 X/* Initialize MCASP1 */
& n  Q9 L$ B- A7 P    mcasp = &MCASP_MODULE_1;
  q' x0 ?2 M& |& u  l: q# h    mcasp->regs->GBLCTL  = 0;       // Reset
5 R3 R7 l% b- @: E" Q7 i% u  `! L    mcasp->regs->RGBLCTL = 0;       // Reset RX
# E! n6 x& f9 g" t/ q    mcasp->regs->XGBLCTL = 0;       // Reset TX
, Z6 z2 J3 c9 k" O1 K5 s    mcasp->regs->PWRDEMU = 1;       // Free-running3 z/ s5 P* B! @) f" c$ j
   // configure McASP0 receive registers0 \  Q3 K4 D- j9 u3 k
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
9 P( V% ^/ @* ^    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 ~/ \" j% P: O1 s
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
% V# V( ~4 Z3 K: }& V( k    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
  B+ Q. C3 {; N    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
( q3 r& I0 d$ Y! g8 G    mcasp->regs->RTDM       = 0x00000003; // Slots 0,12 h% a" B, \) Q# K
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
0 ?6 O6 G+ n  a3 Z2 G    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
& p3 i& {) j, x$ B
' B5 ?! J2 H. b4 ~4 a    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
$ J6 D9 J& g" ^% O4 I& P    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus" \0 S$ W( E, M% r, B% N( R
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word  t$ t1 b3 Z) P( h3 s- ?
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16. t( `# Q  ^4 F, S& q
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK! L1 \4 O" o: ~
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1% i$ D. d" i; Y- S8 s, @
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
5 g$ i$ S3 U8 |    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 M2 m! n$ e; `6 b1 A9 t% c6 M  y, S8 v+ R' }3 E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN" q+ r& m" a4 e; ~
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
5 |2 Y) k# [1 q& p/ p  u    mcasp->regs->PFUNC      = 0;          // All MCASPs  p" U8 w9 _% l2 \5 L- k) E
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" Y; b; L, C6 P# J+ O+ l) b  Z

. K9 b, F5 x, M1 D' K; t    mcasp->regs->DITCTL     = 0x00000000; // Not used
/ s/ [# D4 k: M$ }7 j    mcasp->regs->DLBCTL     = 0x00000000; // Not used
( e% s5 D- S" w- c/ y3 R% n& ]* m    mcasp->regs->AMUTE      = 0x00000000; // Not used
. g9 ^* V1 O! `# ?1 J& _! S0 O4 B5 i) t
/* Starting sections of the McASP*/+ [, D1 x7 K% d* E
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
* h7 z" ~: k/ A, l" [6 T  w' p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 R* n$ C5 E' m$ J6 z% X1 j; \/ E5 m    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
# z1 F0 U! L( h' t* s# j: ]+ X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );# _+ z' Q: [5 ]7 D0 C/ j

, }8 O7 w2 ]2 Q# b: n4 I. I; m    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 J/ m; |# T% V7 k0 O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! K/ H6 y# d: m( t- B- q: x* N) X    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
* t6 f: o: n/ I& f" C+ K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  L2 k4 d7 x& f7 U9 D
5 D  K. l  D$ {& S; S
    mcasp->regs->XSTAT = 0x0000ffff; $ j1 [# s2 e. o8 _( g; H; t
    mcasp->regs->RSTAT = 0x0000ffff; 8 q6 @$ ~3 D0 Y8 |8 x1 E, P6 w" t# m

3 o- T. r( ]& R! @$ V) h; k    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;! d8 y  k4 f0 ~# m3 X
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
, s5 l6 F8 L8 Q: v2 h    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 a9 F4 D* {' n+ j7 V8 I! M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
4 y' {9 P7 L0 F( v8 r& U' L+ W  e1 T; a& u& v
    /* Write a 0, so that no underrun occurs after releasing the state machine */+ A7 H! ]+ O4 v3 T& `9 O
    mcasp->regs->XBUF5 = 0;) Y0 D' z! z0 P  \+ V6 W+ g
    mcasp->regs->RBUF0 = 0;
2 @! O; n+ K2 ]9 h! p0 s
& w) X1 I. r+ u9 f" k2 a# v    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;   }: f6 f% v6 B. R' q  \
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' Y& x$ i' A$ b* ?6 W7 ^& y. r
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
9 O$ \& y+ n4 U5 b' L) o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );1 G& i) @: D0 }! Y4 k
7 C1 `: h$ _4 d6 y9 e
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , B7 N$ X7 i3 b5 u: A% o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
6 U# T5 U6 T9 f* S    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; + }( s; o# I  z4 N
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );2 K3 u" ^8 [) g0 ]" E- i
1 d7 a$ h( k$ b# _2 b0 |
    CSR = 0x0000;& X4 O6 ^  e$ C
    INTC_INTMUX1 = 0x3d;
) P9 |5 ^) w/ t0 ~& c8 p# J9 V4 V    ISTP = (unsigned int)vectors;
5 R+ b0 P5 \& ~' M* G    ICR = 0xFFF0;  * A8 K' R* {/ r# O7 c* V
    IER |= 0x12;  7 ]6 j1 v% j: }3 s8 W
    CSR |= 0x01;  
& m3 E0 U8 L4 c* s
* y0 g' j4 u( q& c' ]1 \- e$ D/ B% \* G
6 S; i/ ?# |; E# R
# C3 Q3 m5 j& F8 n* {- \, t, S还有就是两个输入输出函数:; t0 ?' y% ?# R2 ^' v
void output_sample(Int32 out_data). t9 p' E0 r! \0 S
{
, c. V  K2 Q" ?$ T$ O2 j  AIC31_data.uint = out_data;  7 M2 m& Q6 \* W
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
/ V; }) l" y- z+ I, O, R7 J8 t}" J6 m' K( R( W# C
2 A- U4 L0 C/ d; F
Int32 input_sample(void)8 M: @" W* t' ^& {$ e( i
{  / G" o  N1 D! d& n2 c
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
' O$ N" T* V2 P6 P6 O  return (AIC31_data.uint);
: o, o1 ^0 z2 E/ w9 v& V+ i}
& C( }( A& `) W: q# c5 ?! p' n" [3 }3 t! Y1 f. t

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




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