嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
. k& H8 g, L( R0 [( Jmain文件:; z* [  X: ~8 ?$ L$ m
interrupt void interrupt4(void)  - t$ K9 n' [% ~9 j- W
{
% b. M, ~! a0 |  Uint32 sample;
0 d4 {4 O. q* `. \1 t1 Z. V
" V$ F  m, @) D  ^  sample = input_sample(); // read L + R samples from ADC/ Z* q$ i- J6 Z' I
  output_sample(sample);   // write L + R samples to DAC , d2 X  q. n& E4 v1 d. ?7 b
  return;+ X% {: G) x( Y" a4 f% S3 I( j
}  |9 m, J  v2 _

2 x1 V5 r& m6 L" y7 [7 y; Qint main( void )
; S( y7 x# q$ l) g3 F{
" B( i. T3 n  K$ y* A: B- [9 H! q4 f8 \( _. \
    /* Initialize BSL */
4 H+ t% M: _' c) T    EVMC6747_init( );
' Y) A! K5 Q. W, c* k/ W        /* Call evmc6747_intr function */
' a* ^# m, }* D9 j    aic3106_init( );6 s6 y0 a( B& z
        while(1);
2 q9 L5 X1 M- d) F9 ]: s- _0 V9 _( g}
2 o3 b5 ?. Z0 a& S( _; l) ~* Z
$ e; }* x% Y  u5 L, Q+ s! k
2 w- H* x, m) y# i5 |& M+ G7 baic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题% T8 K- V' y  b& h( H2 U, L
/* Initialize MCASP1 */. y5 i" ^- w9 @& `3 d
    mcasp = &MCASP_MODULE_1;  P) Y& ?. B* H5 \: o- E  b
    mcasp->regs->GBLCTL  = 0;       // Reset9 `8 J2 T$ G5 L4 L! J
    mcasp->regs->RGBLCTL = 0;       // Reset RX
: ?+ I- ^# ]5 S% \, ]5 C" c    mcasp->regs->XGBLCTL = 0;       // Reset TX
, B. o, r) m. m4 @) b- F1 K- z. T    mcasp->regs->PWRDEMU = 1;       // Free-running
, ^& Z- S# G; H4 F8 F   // configure McASP0 receive registers
! [5 W* h: B" N) j/ q+ d0 }% S3 T    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
( S0 x' T  {* r/ s    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus/ B( ~7 J. |/ v9 Q( J% ^1 i: p
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
' L  H+ C) c+ j9 y    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
: C  M/ z- M" q& c  W" j9 E' J    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)+ ?8 |9 }2 S; b/ X6 m
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,18 b7 S) `" @* V8 `
    mcasp->regs->RINTCTL    = 0x00000000; // Not used. K& N' s' H% P
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# T3 N. n. P6 b

+ D5 u% a% Q4 {" B* e! C$ h; c    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used! v+ k4 e$ g# A$ {, b
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! F- P8 }( r0 J. C1 P    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word/ {1 F* X  J+ O0 x
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 m9 P  K, v+ {1 [6 t    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK* N! z- m  i! K2 k' t( Z
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
9 n) V% d* p* g% f, B# [8 G. j    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
* D) s: ]) m% T    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" K2 @+ ?) G0 M4 |/ E: k' P6 `! V& S' A: p1 c% V
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN( Y. W. a" C3 W2 O5 R4 k
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
  `& ^1 ?6 g/ ?2 _# ]    mcasp->regs->PFUNC      = 0;          // All MCASPs
+ {0 z- U) Y8 ]5 f9 ~  g2 Q- q* u    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1, A1 W( `' M+ v# I; S( \

& y9 Q1 X3 q2 r3 y0 m    mcasp->regs->DITCTL     = 0x00000000; // Not used7 H+ X/ @5 D" ?" y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
+ N2 Z  L  X, M; T) P    mcasp->regs->AMUTE      = 0x00000000; // Not used
7 l7 {% g( \# j" u4 ]
! O) G( E' U7 ]9 y. T" ?6 i+ p- h7 B/* Starting sections of the McASP*/
5 D2 r. U7 p. R! `, o7 O* |  @    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; * r/ o1 u: O! v8 ^) {% A: F
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
, O7 f/ e+ t$ R: p  B  L7 [    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;   l$ n. t: q; W: Q4 z  B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );  b. X. j1 `9 k3 U7 _- Q) q" a
" v8 p3 Q$ m( Z. p9 S
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
8 s) \' j: m1 W# Z  G    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );& m  L4 O* j: O+ Q
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; & O  w8 a. j/ Z8 W0 x" B
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
! V6 X: ]$ d7 q5 r9 r- _$ r3 M# U1 k8 ?" o/ n' [* r" c9 B
    mcasp->regs->XSTAT = 0x0000ffff;
. k/ v1 U2 t9 e! e; r0 h# C    mcasp->regs->RSTAT = 0x0000ffff;
. j* p- z' C, B$ ], E  M# ~% a" U: F9 ]- T  a! X# b
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
. A& u) a9 G+ g6 t8 M! _+ Z    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );$ H) l: y$ M  Z# Q, r' ~" ]! y
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
3 n3 |6 I# g& R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) u3 J3 E4 c& D* V5 e: ?2 l. i! ]1 Z: s/ z) L
    /* Write a 0, so that no underrun occurs after releasing the state machine */
" a9 Y% n6 G3 w2 F3 x2 L    mcasp->regs->XBUF5 = 0;
8 p& F4 I4 ], m1 ~/ U; q' q: y    mcasp->regs->RBUF0 = 0;# V- U9 x2 f9 k
; |7 a1 ^+ \2 ]/ T
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; 4 q" W6 N! @( ~' a0 N9 h. O4 f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
/ U3 B  a. q: e+ t2 B    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; , g" e) J( ]( v! j7 n/ _' y" v+ M
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
( w! g  Q- R6 i$ |( y- P) T6 M9 r2 T) Y9 |( g+ n- \$ I
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 8 K/ ^8 G( m& M6 h
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );- @( E$ b' D3 h1 f& T' U1 X
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
7 d2 {2 k# j2 d0 m4 `' ^# I( n    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
, N- Y- m7 U9 [; m
6 C* M& d# m+ l0 \8 [+ x& V9 q    CSR = 0x0000;# u+ j4 s% v; @1 y) ?# E; v$ _
    INTC_INTMUX1 = 0x3d;
0 w* f4 @- k- a$ |& J& a    ISTP = (unsigned int)vectors;7 o& V( I, A0 J% L$ N* |% M+ j$ A% A, ?
    ICR = 0xFFF0;  ( S( ]0 G# R% V3 @. r
    IER |= 0x12;  7 k3 d' r. g: i6 w& e
    CSR |= 0x01;  2 K) s2 U% i1 M2 H8 y
' E5 ^3 v, \3 u4 [

- ]5 Q' r" C$ `
. z! W/ B1 H+ z2 {还有就是两个输入输出函数:
+ ?5 `# B' X: P+ y6 t' d  g+ ovoid output_sample(Int32 out_data)
/ q6 L0 x0 {6 }4 j{
  y( Y: t* @: t& b9 C2 D6 w  AIC31_data.uint = out_data;  
5 ^; o0 z- _0 U$ S' Z3 L4 G0 a  MCASP1_XBUF5_32BIT = AIC31_data.uint;8 `1 r. w* B5 Y6 k! }9 z
}
) A' G" X+ b1 [7 m. m
6 x* F" L& r# DInt32 input_sample(void); d3 m! |; W1 F/ G
{  
( b$ ^# y. v# v9 P; e) F  AIC31_data.uint = MCASP1_RBUF0_32BIT;! G/ D4 w- M* b2 X) r
  return (AIC31_data.uint);+ F( v4 ~& [0 k  }& \
}
, N8 q- h1 `' h5 E7 m, v* e* l" V  q) w1 q! V3 v# F7 Q

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




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