嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:4 P2 c9 x+ Q# p+ K& u
main文件:( l9 a# T0 y% E* `0 L
interrupt void interrupt4(void)  
7 [$ {' d8 X7 J  }  A/ r' n; K& ^{8 B% M/ l' h0 b! S0 S4 _3 _% v
  Uint32 sample;0 ]+ d1 p+ d8 K" R% W) W
7 X6 ]/ o, O' [
  sample = input_sample(); // read L + R samples from ADC+ p. E, ^; H( f( \2 ?/ R& h& r$ A- o
  output_sample(sample);   // write L + R samples to DAC   M. P3 g; I8 a5 `$ D1 U( ^, A
  return;% Q+ p" B; D8 N! z8 t
}
" A' V8 F  F5 ~9 p' A1 J+ D; f3 i' j
int main( void )$ X( z! d. ?, K- j
{
# a0 H/ r% Y9 ~, i4 |& r8 P# ~  X9 h
* c. l1 E2 d; E    /* Initialize BSL */$ A1 \; p7 U  _# ~( z0 @5 A! G
    EVMC6747_init( );& T# d4 H. a5 |
        /* Call evmc6747_intr function */8 k6 a  Y$ W( m% a
    aic3106_init( );* v' ~; N2 h; k1 Z6 q+ x3 P
        while(1);3 t! v+ Q5 U$ `0 S* F
}
$ o( o6 _- ~3 n! h9 M8 X) x8 j7 ^/ A7 l( e( U
. m  F! B9 p/ x7 t: ]7 `0 {
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
  y4 Z5 O" B5 X4 A/* Initialize MCASP1 */0 B, z# G3 j( {
    mcasp = &MCASP_MODULE_1;
; R4 P$ y9 `4 h: P0 l5 n) Y) J    mcasp->regs->GBLCTL  = 0;       // Reset0 P# @& X) w  f0 u3 ?) c; j
    mcasp->regs->RGBLCTL = 0;       // Reset RX$ P; g/ K3 f" z& P1 m0 G4 ?* c; n
    mcasp->regs->XGBLCTL = 0;       // Reset TX8 u7 Z2 f1 ?, t) N9 D
    mcasp->regs->PWRDEMU = 1;       // Free-running3 `+ p3 E! @" S; [' K& J7 ^
   // configure McASP0 receive registers9 E- `- a7 C* J) s$ Z  V
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
$ c! O& e- v% W' K    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus% d% ^. }7 l/ ^! q! w
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word1 j$ x7 D% k1 c' ~* C. x" y5 X
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
! U: ]( E0 P+ `/ K# B    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side); L" I" t( y4 ]+ S. X( u
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 Q8 J' U* Z, h+ f9 S- @    mcasp->regs->RINTCTL    = 0x00000000; // Not used4 J' w) W$ Y& o; U' C6 e  m, c1 x- j
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256: I6 f! _4 h  ]( a' p. ?

' _' ?5 B0 W7 Q: a+ L" `/ j    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
5 W5 x! ]/ s; [. t# d    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ u# s- V4 R8 k- K    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word$ Y; @$ H( \8 T! e# X
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-161 {& C) n2 [' K2 r( {& D% S
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
5 W) ~* S/ p6 ?6 Y) i/ O* D    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
' i: ^. ]$ v' D1 }9 B    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit* M9 [' x) V9 W6 w7 [( @( U
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
3 G% Q5 v' {- u: R( z5 Z) ?+ n! N% [% l' p8 ?  a  P5 `+ a
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN+ U. Z8 ]4 w  W% G3 ~( c
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
0 W& d* a: E0 J" w% J5 B    mcasp->regs->PFUNC      = 0;          // All MCASPs. K6 U) m7 I$ F5 l2 t
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX12 B: h8 o- h- n/ ~: o) I! N0 S8 j

0 C) }- i( }6 a" J* Q8 P. B    mcasp->regs->DITCTL     = 0x00000000; // Not used5 W: o  ~/ }( |7 L9 U; H
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
* ]- \; Z. q% Q6 ]    mcasp->regs->AMUTE      = 0x00000000; // Not used
& n+ c% u5 o: V  |% ]- x& f9 b) n1 [0 w6 k
/* Starting sections of the McASP*/
+ |: D8 h' N" ?; ~- h4 G5 `    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; . m2 A* P9 Y1 u$ S: D' o
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  2 s; S0 }8 C7 D. b* G( _
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ) c5 |) X# Q  S0 G8 F5 d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );& B+ n7 a# @' _! t$ J6 |  J

+ T3 F) v2 b5 c+ [    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
2 v- A' v7 T; m  W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
. u) F) {; a. U9 `  n8 v) X8 F$ y    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
7 q# o9 u" v$ b! n. B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );; x, }) Y- t5 ~4 f
8 @4 \5 b# W/ c9 z- r+ ~
    mcasp->regs->XSTAT = 0x0000ffff; $ B% u% i5 h* S8 v" e
    mcasp->regs->RSTAT = 0x0000ffff;   G, C; q4 m6 q/ ^
$ e$ }. w# T" a9 ~  p, W, v6 q7 U
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
* U( b5 n! m4 J    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# @( e+ W: o) }  c4 P& m) o8 ~    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 O2 f: x, H; n/ L* m% u; d/ W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
, \7 ~( E$ z, d8 P$ ]' F# X% f4 S
    /* Write a 0, so that no underrun occurs after releasing the state machine */
  p5 @3 c- Q  }5 }" A/ L1 W    mcasp->regs->XBUF5 = 0;" h: |1 S0 R4 b+ ?" i# b- W
    mcasp->regs->RBUF0 = 0;
  [! x' g: U8 g* v, x: I- c! u
. @* j" f7 S3 ^9 ]1 J  O    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 h7 k& [9 Z/ f& r% Y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
# v) t# A% v5 g/ X. D/ Z    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 8 Y# t' u# M8 ^. C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );' D. T  @3 m! z

5 @7 r6 N# x% R4 j: l9 B7 Q    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - e" `8 @, n* v! E! j9 w; N
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );5 J9 t4 G, v0 ~2 ~7 h  V' ?, o
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 k- ^. D7 h2 r1 K$ _% z7 Z4 ]& a    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ g' X$ |, I1 |; E
5 N) R8 |# C5 a$ `5 a8 }
    CSR = 0x0000;
2 u# w: d4 k& r# L+ H    INTC_INTMUX1 = 0x3d;
3 @7 {7 p; |8 U" g    ISTP = (unsigned int)vectors;6 b4 r( s/ \, t/ E
    ICR = 0xFFF0;  
& D9 G: p3 Q- b9 u% R! V# t    IER |= 0x12;  
. c2 Y( z+ g, {4 g- B6 K    CSR |= 0x01;  + w, Y7 b% L( `/ Z) m; Q
$ a* h1 z6 c1 P# `- m  K

0 U: j  i$ C  \+ N  M2 Z* ]/ @" A) a- W: A
还有就是两个输入输出函数:
2 W  q+ a: }' L1 j) \6 b" hvoid output_sample(Int32 out_data)
2 M3 ~# g) R; v7 P9 P+ j{5 b4 W6 g1 j/ o. m1 ]6 n0 X
  AIC31_data.uint = out_data;  
2 i- N+ t+ n+ e3 k6 U2 Z0 {! u  MCASP1_XBUF5_32BIT = AIC31_data.uint;# W, n0 `2 h5 W3 R/ ^
}0 M5 b  V5 S4 l# q* z  d& L3 s) L
$ i( H' N0 I" s: [* X+ h
Int32 input_sample(void)
- @1 Q1 F  P1 M) |8 [{  + X) v8 Y$ K, O) T
  AIC31_data.uint = MCASP1_RBUF0_32BIT;0 h* q% J; u  s: M+ ^1 Q' i5 \5 z
  return (AIC31_data.uint);
+ ]; t0 ?" C5 p1 I. m, s' M}
3 s& d* `" j1 I& h) p9 V
3 B# ~- R  ]& p6 ~+ b/ n
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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