嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* |4 I9 `$ u8 `2 o) C0 K4 ~
main文件:
* N+ e) S4 U: C- e. u' pinterrupt void interrupt4(void)  $ Z: w9 {6 S/ V
{3 F- y, u1 R( A
  Uint32 sample;
3 s) o2 \- J+ c" D
4 ]8 p1 e! e7 D2 [- B  sample = input_sample(); // read L + R samples from ADC! i+ U5 _* v. M# _/ ~* G1 r  x; E
  output_sample(sample);   // write L + R samples to DAC ) W& d1 T! s! z& m. L
  return;/ z$ z# N9 C+ h: E
}
& k- Y$ Z0 u1 ?1 r
2 i& h2 l) t  @* h8 R  ~$ ^9 ?int main( void )' z: S. Q! z" w5 n  d
{
4 m) k+ X3 t( v5 a! K& v8 t1 a7 t7 P$ r6 D! a  X! u. i
    /* Initialize BSL */- e# j% X2 r$ H/ L, s
    EVMC6747_init( );' K7 [: q4 W. J* F8 F# _
        /* Call evmc6747_intr function */7 @" C3 X( L* x* g+ J
    aic3106_init( );
+ P+ G% W! K3 I8 E        while(1);, ~4 s9 s/ g4 i' j4 Q
}! q) y3 R+ [& h: k# g3 q9 q

7 ^& }# ?9 `! x2 i4 R( x
& x4 f7 Q; r8 d$ u4 U* z* ]aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' V2 Q+ D& V. T+ f% I
/* Initialize MCASP1 */
: N. _- m  a5 o: \  @  [    mcasp = &MCASP_MODULE_1;. ^3 e" x5 v( X6 l
    mcasp->regs->GBLCTL  = 0;       // Reset
. |* A1 @4 R0 h  {' b8 S    mcasp->regs->RGBLCTL = 0;       // Reset RX- {! Z4 e  L- q4 ]
    mcasp->regs->XGBLCTL = 0;       // Reset TX% r. F  z/ }! w) e
    mcasp->regs->PWRDEMU = 1;       // Free-running0 b; L3 t; C! j8 Z6 X
   // configure McASP0 receive registers
! l) d- L$ v% L6 b+ ~, M' J3 F1 m    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
! ?! f  W3 F) Q" U    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. \: u2 ]( H- {, I! U& u    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! \" t& K6 |5 N7 d+ [) J* J* z    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side): S8 m( k) C7 b- n0 e
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)0 G" W! a4 Z7 e, {& d
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1( x  o! t$ d  P: E( g3 w
    mcasp->regs->RINTCTL    = 0x00000000; // Not used/ H6 E! m2 u& F0 U. G
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& M. t% }3 W, x! H+ G
7 z8 E+ y# l, D  o8 a. G$ X
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! v& l7 I. h2 B/ a
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, U7 h: X( @! w* O2 a    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& j( x' C) J6 s. P) H% m; ]    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16" j7 A( r' j5 N- ?/ @
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# P/ U/ t6 r6 U; M4 W3 g, b
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
5 V# U; W1 b& A/ M: g& @# ~1 H    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
2 p" J! A/ u; y0 G/ P3 {! r0 c    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
2 B6 ~6 \* T# N5 d5 A7 p" G4 w3 h9 b
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
3 G: O+ c9 K( Z. f' f/ m    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT" M( X- p/ C) Q9 N( W+ D' N
    mcasp->regs->PFUNC      = 0;          // All MCASPs* D5 s& A. p2 K0 l  v+ c
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1# z6 Z9 F; S7 v% O# z
" ~( J3 [' U, c& l
    mcasp->regs->DITCTL     = 0x00000000; // Not used
3 J, Z; n; f% D3 Q. |1 v+ T/ o    mcasp->regs->DLBCTL     = 0x00000000; // Not used. ?0 w! S: O+ t: c7 s
    mcasp->regs->AMUTE      = 0x00000000; // Not used
/ b7 `" F  k. `) s0 B3 q" Q' ]
5 \- X" |# j7 B/* Starting sections of the McASP*/
& }% S/ N' t3 |: T" h- c    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 @! U# N  D- a5 ?# i4 O+ \& g2 D
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) X9 R0 c. [  e: ^* ~& q    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; & _$ q2 F, k" f
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 t% e; n2 O% R  T  p+ p2 J( I+ S  r' L. P( o  @- k
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 ]6 ?: ]: O! P: M# b6 {  S( P
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );* Q% n: A3 U% z- |6 i- _1 V
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ x: b) g+ k* e5 L/ Y1 X3 ~2 Z    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
& `6 |& v, ]/ {) G3 k, u: X( Q0 N# w/ S& |8 x, }4 b. R
    mcasp->regs->XSTAT = 0x0000ffff; ( i( Z( i1 Z* A) V
    mcasp->regs->RSTAT = 0x0000ffff; * H& i! [+ C8 N3 \2 g/ p- ~

$ d2 f' w5 u; m2 P( {' P1 n4 K    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
  l# W2 M1 H1 I9 y$ c( M7 C    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );) {+ e, j7 t& R& C
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 8 o! l7 `* |1 L) s. ]9 o) _
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 @, ^( r! _5 ~5 T4 o
: l: @( a# P% x( ^
    /* Write a 0, so that no underrun occurs after releasing the state machine */
' C! Q6 F# z2 H' Y7 k% {  c    mcasp->regs->XBUF5 = 0;
* B5 x: Y- n. O% C8 T    mcasp->regs->RBUF0 = 0;
& m* l& ^0 {9 z2 N, g; u) U* ~! @# W( C0 j2 x; m* Q
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; : ?- E" x7 L% n" J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# y& V5 u: b/ ]+ w* K8 Q    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
( A9 |# x/ ?* ]# e# L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
/ K8 T; q6 O6 e* J* P( ~0 U9 S; ^0 r* _2 [
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
5 J) E4 N3 f0 a7 ?$ Y2 I9 i% E4 o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. d1 C. a/ e8 y    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
; z) J1 f1 I- e6 Y2 f6 a  _    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
0 r* r1 j" S8 \  `+ P" ^0 Y, D6 C) x4 L  u4 `
    CSR = 0x0000;, i' X/ ~. b) d; C
    INTC_INTMUX1 = 0x3d;
' b" `5 E7 i/ ]    ISTP = (unsigned int)vectors;) j/ t6 s. I* x8 {
    ICR = 0xFFF0;  
" T% }& _4 G# r, h0 w    IER |= 0x12;  9 @3 c! S/ s0 a- V- [+ Z+ \
    CSR |= 0x01;  * Z! `/ E+ u% @. C/ u; z
$ [, \$ @" e  A% }. Y
6 V" z# ~0 e! F! a& [/ s

+ Z5 }  a3 Q+ u  C$ ]" |还有就是两个输入输出函数:
1 ^+ S% x5 X1 v- U- Vvoid output_sample(Int32 out_data)
. o, ]+ B5 A4 J) h+ [2 g* g, f; P{
8 U* [9 u3 B8 {0 P$ i  AIC31_data.uint = out_data;  - o9 y; r& j. S
  MCASP1_XBUF5_32BIT = AIC31_data.uint;1 o6 e5 P8 c( E$ ?* `7 I
}- m* o9 f, A% x/ m7 A9 X! v: ?6 {
+ H+ T9 ]4 _% C- I
Int32 input_sample(void)
8 Q6 v) z/ [4 e- |$ @* v{  7 ~0 P& b4 E9 g1 P7 y* I- N
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
$ o  B. S6 a# j! R" d, }9 Z9 }  return (AIC31_data.uint);
9 @# g2 q7 |7 P0 x7 W}9 C+ `; E5 B( V( B- L* r7 w
$ j% M9 h/ B5 t8 K/ u

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




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