嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
8 b. ]+ u# E/ O! F" B* imain文件:# [- Z+ F% a5 Y- P$ j
interrupt void interrupt4(void)  
6 s9 y# G7 I; a: O{  ?0 I' o# L) o8 N: H& |
  Uint32 sample;
. z+ N, y3 g& }' \& a9 @1 G) l0 x# S0 T0 K1 Q- R+ H
  sample = input_sample(); // read L + R samples from ADC
( X- }5 W" t5 ]& e2 P  output_sample(sample);   // write L + R samples to DAC
9 s/ _$ M' p4 H: X0 F$ ]* i/ _  return;; f, _2 y& ]: M1 j; s
}
% L) j5 d8 z% Y, j7 g4 y9 t  ^! `; a+ U5 w
int main( void )1 J4 E- d5 w$ a5 E6 q
{& N( `3 t/ e; U; w6 f
% ]* t  y  ~5 D1 D
    /* Initialize BSL */
& t& I+ H+ o  A% D/ C    EVMC6747_init( );
3 x6 w  z; T& p0 P2 f        /* Call evmc6747_intr function */
2 A, r. S, U$ ], a+ X    aic3106_init( );8 ?2 |$ e0 y5 u
        while(1);+ H; }" a+ Y9 @- ?
}
& B; |: g1 N; W9 w1 s2 t8 L; ~# _
) C. X& j+ Q0 E$ _9 [* e. r- Y3 t1 k8 y3 k
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题( u( _% _$ P. Y2 H. M5 e
/* Initialize MCASP1 */, l! v4 g* {3 z7 G: _
    mcasp = &MCASP_MODULE_1;9 W1 U; r7 U/ D: ~
    mcasp->regs->GBLCTL  = 0;       // Reset& z3 |; q( V! o3 ^
    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 O6 J; g( a  e! x' m; ^    mcasp->regs->XGBLCTL = 0;       // Reset TX
0 Z$ H4 V1 l0 l, y# B/ }7 X4 ^    mcasp->regs->PWRDEMU = 1;       // Free-running# T3 M6 S4 ~/ Y; ~/ r/ X3 W
   // configure McASP0 receive registers: x  P" x. ~. v: ~" b& P  W
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
% y8 I# |, H( l" M3 n* H/ e    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
% R- g# m2 f. c8 @( {1 z5 w$ k    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 k, [5 j6 U% m; L    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
/ L$ n6 E* y6 d, Q    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
4 t/ y3 `8 X! Y1 F, l% O    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
) ^1 b5 h/ T+ `* ?) w$ o    mcasp->regs->RINTCTL    = 0x00000000; // Not used  m( e( G, ?: @6 b6 l8 ?3 Q. }
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2561 c' J6 q! t( w  ~; S
" @* y) [2 n9 ]. G
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used8 R6 {$ i' M$ B1 B1 e1 J
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% M4 w! @# G- f/ k) q+ q2 L; x8 |; P
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 X' a4 `& I! u. F  X; M    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
$ p. y  P& a; a: o& y8 t' H    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK7 R) F3 ~% c# v/ F
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
. p  y$ f; s* m, [4 `    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
) O, S; D7 }8 }, M& V8 O  g    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# G% D* [7 ^  U/ V# o. Z

  _1 W3 L) B  @    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN/ s& q( q$ S3 v3 s6 U! _
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
4 O9 c# Y  }" `2 v. n    mcasp->regs->PFUNC      = 0;          // All MCASPs
1 |- S, x( i6 s' V    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
/ N" c$ r! U& `. s8 k- A6 t! g5 R+ }/ w, `, G$ W
    mcasp->regs->DITCTL     = 0x00000000; // Not used
' ~4 V' j0 b; @/ N' C+ d- ^9 o( N! ^( n    mcasp->regs->DLBCTL     = 0x00000000; // Not used
5 {* k4 ^4 }, x* X, o+ X" v    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 J# Y4 O! p, Q
6 J$ F2 x3 v# N5 N7 Y/* Starting sections of the McASP*/6 {( N( j  \7 `7 z  W- ~% q' Z6 l' Y
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;   G( M- ?2 j2 }1 k
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
( q+ N& K- Y" t" n7 A4 b% M8 `    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
/ l! X8 ]. g* V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
7 W2 ?4 N. d6 f1 c% F; Y, A) `% i6 _  r% u4 M
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 4 |( ~* ~, v- K: W3 B. ]+ V! H
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );2 i% a$ U1 t9 F9 D* a/ a
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
1 `9 v. h5 M, a/ Z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! u+ D1 g2 p1 T; @( Q7 s: Q0 a6 q5 i$ b  _' w- R
    mcasp->regs->XSTAT = 0x0000ffff;
, [+ v9 P. ?% E  P3 W5 C! t    mcasp->regs->RSTAT = 0x0000ffff;
. ~1 R& j3 ]% e8 k% U- w$ l2 t" y% d* {$ W
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;5 g( F0 ~9 X% l3 N) ?  l6 O
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );( ?4 Z, F) R& ~; N. ]6 k) k
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ' T4 c% r" i: |) Y/ w+ n9 Z+ e$ `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );0 Z% Q/ l+ G2 R

) C7 u; M7 H4 A4 ?    /* Write a 0, so that no underrun occurs after releasing the state machine */* q6 B" n( }- j4 P
    mcasp->regs->XBUF5 = 0;  }$ }* a% Z$ }6 i1 n/ ~
    mcasp->regs->RBUF0 = 0;3 H6 C# W2 g8 w$ k, B9 R  }2 ~
% S$ o. z/ _# I. f" m
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; - ?7 E7 v+ K5 q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );. m! R0 `$ `) t7 G, h; @
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , H. D* K  |4 o! H! ?% l9 V
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
9 }; N% t2 S! ^( A+ k9 `8 u6 b) q8 K: n1 }: v. G1 t. e
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# f# B% B( c) F8 o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );, h  e# @" m# D6 d
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;   m& |. H3 n" ^, z2 q
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 X; ~) Z2 p& W$ Y4 c- R: Z: q# \" k8 p6 v! e# f) N
    CSR = 0x0000;
  D' J( v& h' q" W    INTC_INTMUX1 = 0x3d;4 z6 W! ]8 o4 S2 Y) Q/ P' Z
    ISTP = (unsigned int)vectors;  b6 F* ?8 ~! ^! q. [' a! L# M
    ICR = 0xFFF0;  
+ \  J6 K7 y  c9 R8 w    IER |= 0x12;  
7 Z5 q# \$ A5 a& \. V! b    CSR |= 0x01;  ; e; h& J+ f% @; A2 q

9 |/ O( `! G* h$ w' l! F
3 x$ ?  B$ s! {7 _- e+ j0 l6 _. y6 S) w& {1 u$ }) s+ i
还有就是两个输入输出函数:
$ |2 K' }3 A. {9 |! t; P7 Avoid output_sample(Int32 out_data)
, A" g" x' j! y  M, O{( t8 p1 ]5 ~# H+ S1 m
  AIC31_data.uint = out_data;  * T+ ]) L1 Q+ t) ]8 Q
  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 o2 V% f8 ^8 g7 \, [/ N3 |
}
) L" i' \- W- w! e5 V' \
! r2 `- o# p( j' \Int32 input_sample(void)
4 C+ B' F- w2 G  y9 T5 O$ L{  3 a$ C! W" x* ~$ |* \, |/ L6 o
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
# T2 y/ o% H/ E  ^6 `6 _4 C. g  return (AIC31_data.uint);, K1 B1 V2 I% q  O
}
0 u8 @0 J4 d2 N+ }
7 }! H/ ]+ z9 u8 B# t0 D$ o
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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