嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
, ^# B' h2 s0 h) m1 C! ~main文件:  m8 R8 }& p. |, e, ?5 q
interrupt void interrupt4(void)  - @7 Z' ^/ ?2 Z6 R
{" w3 f- I  C* r$ P5 }% O
  Uint32 sample;
8 d1 z1 b" G( G$ x  K9 N0 v! x8 k* C
7 g" A. Q5 q7 s9 p$ v# C5 l5 g  sample = input_sample(); // read L + R samples from ADC* D% i* Y3 @5 n" A" H; |% |+ V2 q1 A
  output_sample(sample);   // write L + R samples to DAC . }/ e% ?& k. @6 Y
  return;
( \$ L- w5 c/ p% |* Z}
3 g4 [+ s# \! O) F2 a
+ L) J/ n" f2 ]! S" d( R" mint main( void )
; z2 E8 @- x" R1 S0 p{  |  B, l; |) h6 y

9 m5 c4 d" O% E" {    /* Initialize BSL */% u/ F0 I! B4 M! V- f8 B7 s" @
    EVMC6747_init( );1 j( }9 v5 z9 B
        /* Call evmc6747_intr function */
' b) x: d/ \+ G9 b1 P    aic3106_init( );  i. Q7 R' A7 b& ^( m
        while(1);9 v- Z8 X  a/ P5 M$ d1 \
}
; @5 g& Z1 s9 \6 D2 h* C% F
6 L4 C# {# o1 H% ~% y
; v0 |! L; q7 i) [5 Yaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
7 V/ Z; S3 l* |. l! S6 K1 ?: u/* Initialize MCASP1 */
3 w* V. Y+ F# z- P6 [2 E3 a0 g) y    mcasp = &MCASP_MODULE_1;+ y) \1 o- K- K) K; j" ]1 ], ]7 ^  [! M
    mcasp->regs->GBLCTL  = 0;       // Reset
# P, w; ~0 o2 d: v    mcasp->regs->RGBLCTL = 0;       // Reset RX4 S0 R# c- z' c3 N. v! j
    mcasp->regs->XGBLCTL = 0;       // Reset TX8 u; y* v6 ?) @; X9 H" S
    mcasp->regs->PWRDEMU = 1;       // Free-running5 c+ X, w1 K& t/ ]3 g2 ^4 T) ^: }
   // configure McASP0 receive registers
2 X! w( j4 u% ?6 N, Z    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used8 @1 `- l/ p8 Y% T% M( p
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 l1 K* j! X6 i' K+ H0 O6 W$ s2 A7 e    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
7 R. \8 ?7 m! l) F4 r$ \$ i# \    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
( ]2 C( ?6 U2 N% ]& {7 [    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)! Q# Q) z9 q! }/ H+ P: o
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 b+ D7 S2 d1 _. {6 s
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
' T/ {0 C7 o; j+ f/ N2 h. Z    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ Z, X% f4 V, m3 y, U7 \/ J) b3 ~5 h$ a! E
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used$ {& Z9 y- j/ N6 N) |
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
  d( l* m, e  z3 H$ K    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
& [2 S  X3 J; k. x  |: G% H    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
' F# d( m) V$ Z; z! R; r8 ^# ]    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK- V, _7 P; B8 t1 c1 G% F. ]; L( k
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,17 Q# j9 n, \5 D/ W* \
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
. |, o% _7 F7 e+ z) U' e. V    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* K, i4 S! n7 E! @6 U% O4 s# [* n! @3 w  a
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN" n7 H0 ^/ R7 }  @6 p5 ^0 k, t/ m
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
, o. p; h5 ]: P0 X6 J    mcasp->regs->PFUNC      = 0;          // All MCASPs; c% \1 n) y2 D6 J+ S7 x
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1! I) V, A2 t7 d- P) d$ Z$ e9 U
7 @- L8 k( y6 W1 s- q7 b
    mcasp->regs->DITCTL     = 0x00000000; // Not used7 r: I5 y( B& x. x; J4 |
    mcasp->regs->DLBCTL     = 0x00000000; // Not used7 t3 P( `( o1 v0 ?
    mcasp->regs->AMUTE      = 0x00000000; // Not used
" |: {, v1 n8 L; e( i& ]: {7 j3 ]# u, ~' G5 l
/* Starting sections of the McASP*/
% X! D. @. f4 s" ^) a    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ; X3 q. ]6 u! i7 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  + H) N/ f: T8 v% R7 A9 M& G
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 T1 B! I1 j3 @$ g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 r8 o, M' N. f0 Q. a1 C

  z! o& b! ^. X$ x    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 8 t2 H) U9 U! T; k) e; l! d
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );8 c+ A1 W2 C5 c# e, N
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
' |/ o' l4 [. _5 C. i6 r    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  W' X6 \6 y" Y# V8 Z
% v! r% b) t& F1 O" r7 K& j
    mcasp->regs->XSTAT = 0x0000ffff; 7 b- p2 T1 r" F
    mcasp->regs->RSTAT = 0x0000ffff;
, r( `/ C1 g7 p7 l
; E4 i) P7 z- H, _3 L% O( f    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;: l  [, u9 C; V8 r3 z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; K5 r3 J+ H! j$ u    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 j4 s1 t* c3 n" n; I    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
/ e  w* n7 n' t: [$ V9 H& K+ f5 m# B6 N1 I
    /* Write a 0, so that no underrun occurs after releasing the state machine */
, w' U  i: f. i6 v  p9 \% X" ?    mcasp->regs->XBUF5 = 0;
* W3 K5 D" j+ v% P( h$ I5 U    mcasp->regs->RBUF0 = 0;
) J2 V' f" J5 N
9 f2 D5 w8 b( h    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
7 q0 x# |5 _4 c/ x3 D    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );3 `2 t& [/ x# d. Y" b: h7 L; z
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 Y( d2 }6 ~6 n5 Y2 ~2 }' o
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 I4 d: F, O6 b4 X
/ Z) Q0 Q! D. L3 {3 ?* m    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 S9 {; x; }  @2 v$ ?0 [. q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( Z0 o- F" G- c6 _$ ^
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; - t/ L$ j1 Y1 V' z# M$ J; p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
+ X5 q" Y2 e! }" d  @4 ^3 u% T* R3 }; |7 h" U6 ^. J6 V
    CSR = 0x0000;
' T+ h  }  f" r. a    INTC_INTMUX1 = 0x3d;
4 P4 E. k8 t  N) K& V/ n    ISTP = (unsigned int)vectors;
2 m* e8 p) U0 [    ICR = 0xFFF0;  
" Q  n" u; z9 ^3 l/ S( p    IER |= 0x12;  
# P* ?! z& d' r) x/ m. I    CSR |= 0x01;  : C$ u- A5 Q1 e& D
, s/ X& R9 i7 g* s$ `2 E  V

# F! m; ~9 X4 U* b2 M, D( \4 C! `* m
还有就是两个输入输出函数:
" P( m( R# M! @& ^void output_sample(Int32 out_data)
+ a' a6 p8 L6 N( ~2 T, A{
9 n8 L! g4 m. D4 _, ?/ w& f  AIC31_data.uint = out_data;  
0 u+ L& D3 L* z3 I9 ]2 k7 B/ i  MCASP1_XBUF5_32BIT = AIC31_data.uint;
% T( C$ y% ^% U$ r}
8 [2 O+ s& _& Z, y4 B/ `$ O. z. h) A. y+ V
Int32 input_sample(void)) W8 d$ |- M3 G6 Q) y* X/ M
{  7 s- u! Q/ J* g% z- B! E
  AIC31_data.uint = MCASP1_RBUF0_32BIT;* ^; a/ W7 w& h1 z3 i
  return (AIC31_data.uint);. r. o6 Q9 M' c: C
}
7 O7 n1 h5 ~; G( X. c8 @# v; s

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




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