嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:$ V: p+ J% \' ~( V  f
main文件:  O; F* E# U$ n$ z4 u( f% l' K
interrupt void interrupt4(void)  " A) U4 m' y0 [6 ?  ]5 W
{" K1 \3 P5 X5 k4 z7 n8 ]* g! J
  Uint32 sample;! B; Y+ T+ @2 ^* Z8 s; l
! T# F$ X: `- M9 o3 O! @: x
  sample = input_sample(); // read L + R samples from ADC
9 }4 Y- X; M1 ?. K$ p. c  output_sample(sample);   // write L + R samples to DAC
' a& H- W! u2 D5 ]  return;
0 S7 Y: ^+ k( ~* n2 b}
  l/ q3 A/ d- M. p8 A+ o! m6 I6 i( J" }* O' ^7 N- t
int main( void ): s8 A, c4 A9 o
{: l4 s9 N  B7 o, Z: j" V, D% E; W
* |! l7 X* K- ~- r- q7 N
    /* Initialize BSL */
8 v2 X, d3 S6 k, ]: v( N# }    EVMC6747_init( );5 S' ~! a6 m; D6 B3 g
        /* Call evmc6747_intr function */% H3 E( J. h6 ?' T
    aic3106_init( );% z! A6 l: s+ u+ g2 v9 l
        while(1);+ r: _8 b  `. r  v& w3 ]* A
}* X& k* e+ [& W+ s# G
0 G; @5 T' Q* t- j9 ^2 W$ U3 k* A

! n2 i9 B7 {/ e% n/ t' zaic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题/ `; G; _7 ]3 B& w, T, G
/* Initialize MCASP1 */
3 q+ E3 m* d( z7 h/ \4 u0 [# U    mcasp = &MCASP_MODULE_1;
" J1 R; |" x- x3 v, F    mcasp->regs->GBLCTL  = 0;       // Reset
7 u+ ?+ {" o0 O9 l2 \    mcasp->regs->RGBLCTL = 0;       // Reset RX
3 ^5 g8 d- w& }/ h    mcasp->regs->XGBLCTL = 0;       // Reset TX; ^& t$ `0 u5 a" g5 d0 ^
    mcasp->regs->PWRDEMU = 1;       // Free-running
& f; ?( d  B: r: K   // configure McASP0 receive registers
5 o; y( w% o/ X1 n6 R3 ~# D    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
0 R! u  @6 ]9 B; d; Y) D0 M: J    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
/ o: Q/ k& `  ^+ i. x    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 N* J2 z. ?  f" g; z$ `
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side); _9 N% _, b9 m
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
3 a7 ]" V* H) h' d2 q/ C    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 N% d$ Q/ ^) d3 ?$ t& ]
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
- e4 ~- n/ _: E2 t, S    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
6 C% J+ y( v& v& Z) F7 `; B" t& d+ T; V7 Z% u* _! N' g3 Y1 ^
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
. I- J; L2 Z- |9 p- G2 M+ B" S6 G( N    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
( M6 U9 ~- l$ `. k    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word# Q9 Q3 Z. A! W0 N: K" ?
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-162 K* @+ e% e/ b1 \2 d
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK3 U2 v' f3 B- y; V
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1; Y1 I$ p$ m( A; @
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 d* Y0 {8 u0 g6 {( N    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256$ ^' I6 A( P$ o/ Y/ d

5 v) R! x* Z4 e6 A( I3 ^3 ]    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN: P/ _6 @) ^* P& z2 R2 j
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT( m& H! G  C! b5 I
    mcasp->regs->PFUNC      = 0;          // All MCASPs
& }) A) m+ i& _0 y) A  b    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
" ?/ a$ n4 z/ `* O) ]
; t) K+ a. g* B( r  h, p! ~  \  J0 \    mcasp->regs->DITCTL     = 0x00000000; // Not used
4 f. p/ |% F1 z; ~5 b0 {    mcasp->regs->DLBCTL     = 0x00000000; // Not used
, L( \  [  ~  A# Z% Y* P- q) G8 }    mcasp->regs->AMUTE      = 0x00000000; // Not used
+ x. _, f$ _6 C0 D: j% W0 f& n- i' p( L/ a
/* Starting sections of the McASP*/
) _1 z7 U& B, B8 P6 x4 n' F    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; " q% y" l& s$ F! R( {* X9 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
- C  S4 `4 o. Q9 N; d/ t    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
* A: V+ Y5 @4 i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
* z3 \. v, q6 E8 L) R6 Q* _' B! S5 C/ j9 p$ l
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; % d. @9 t  w! V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
8 ?9 F, @( ]* _1 [% g8 L    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; / D5 S; }# H0 v+ j9 X5 d
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
; ^& ~; w3 i1 W8 a0 m7 ~+ y, M: A/ J! ~# c- ]! I$ D
    mcasp->regs->XSTAT = 0x0000ffff;
% l4 M4 }5 T+ o' X    mcasp->regs->RSTAT = 0x0000ffff; # P! Y7 N2 n  a+ }5 F0 c

7 J8 W4 p1 r# {* Y& q% P    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
$ B5 C  M7 A+ i8 r( K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );0 V4 J, o4 w0 O
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
' C; b. B' v4 u  f! w. D# C    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
5 f/ r* D/ V8 ?6 Z6 `
; }4 e, l8 z' r& F% P2 F' R+ t2 m    /* Write a 0, so that no underrun occurs after releasing the state machine */1 D: T- f& W- n% \8 e0 y
    mcasp->regs->XBUF5 = 0;
+ U8 X1 \, t* s1 G    mcasp->regs->RBUF0 = 0;
' g, V( J! P% k* E1 Y- U
- S  b7 M  K  E. i  F; v5 G# A    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
- ^- \. [4 l) j  H6 [8 F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
5 R/ Y; B( v3 a7 y' E    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
: k/ f. t) s( @+ F7 F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );( ?* l! ~1 Q  B* `! w5 r
) L8 q, @" l6 w* q0 i; Z& b1 B1 \; k- n
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 0 W; p. L9 f& x* \; O4 N0 H  _+ j
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );8 q" X7 D& }" P  W1 i
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; * M, j4 f" ?) K7 R
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
9 L4 h4 A/ E. q8 i/ z9 Z$ T+ P: K: d, u
    CSR = 0x0000;1 K# k4 b" R" @0 W: k4 Z
    INTC_INTMUX1 = 0x3d;
- i( K( g* T# c. h' X    ISTP = (unsigned int)vectors;, `6 Z" k! l. ~
    ICR = 0xFFF0;  3 P# p9 z: y) X7 N" j# t% J* a
    IER |= 0x12;  ' ?1 x+ R& j3 Y" Y; d
    CSR |= 0x01;  
% m2 R& \8 W- b. B; g. L$ v! x/ V5 B: w: g

4 n& k7 A$ Z; P2 y% m) _4 a' Z/ H5 ^' U( M/ W" ?1 m4 e
还有就是两个输入输出函数:
8 U% \* g9 X' Rvoid output_sample(Int32 out_data)9 v/ Y; l+ }4 |: |5 c" R$ w4 Z! X
{
- a5 e7 q! L2 W3 _; [, r7 i- w! ^/ k  AIC31_data.uint = out_data;  
# P& n% \; T: b4 }% \  MCASP1_XBUF5_32BIT = AIC31_data.uint;
( f1 |6 M5 _* \, c  E0 t( k}
; c  g( j2 m2 v2 ~- L2 ~/ h% B+ w+ v" d$ R
Int32 input_sample(void)
, f6 V1 E/ X4 _) z6 C* b4 y4 T6 G{  % ?: T& o8 d% j$ D$ m
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
( J2 R$ K% v4 L6 S, C2 M+ v' a  return (AIC31_data.uint);
+ B( K8 u2 e* K1 H& {, o0 z}
6 p  E  X) d0 d& L. m$ w# q7 C# o0 }

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




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