嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
5 ~" T2 ]5 b+ Bmain文件:4 _8 \( o" _) c* x  f2 j! E# e
interrupt void interrupt4(void)  . T+ X3 b# a: z" t, Q$ o% `
{+ l5 S3 f) q2 A4 @* D
  Uint32 sample;
$ x6 H8 m! Z; p$ i) a* c: S" v, v" o- r% J3 z4 Q& k
  sample = input_sample(); // read L + R samples from ADC& G) r% h3 C: c7 p5 f; Q
  output_sample(sample);   // write L + R samples to DAC
2 D6 w+ d) _, n# E" r- s  return;
! l6 s8 R5 [! R6 G" G" T9 H}
4 o9 p, M- j  u3 ~1 {0 C* p% g* i- n
& F- t: o- V* {" \# w+ N) @; rint main( void )
0 R/ h# T% h+ ^/ q$ u2 J{
1 S: O7 E9 X# M& m( k6 }& |1 N
5 e0 ^! z- y% Z/ x4 d    /* Initialize BSL */
9 I/ m! r0 @! q2 w' |6 w    EVMC6747_init( );" Q' k4 P. w) U1 H$ k) D0 w$ N
        /* Call evmc6747_intr function */" o3 B( F# F$ A; a# ]. v
    aic3106_init( );
5 ^# C* ?: q% q: O( G        while(1);
+ x+ \  n) R( c/ D4 ?6 j0 L}
  _  f: V( g6 L  @  ?+ b! u1 A$ G, A8 R$ [% k, F7 c

' S2 q2 W$ r; x2 @aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题: N0 C7 S2 X0 L
/* Initialize MCASP1 */
: n6 _9 }8 [8 ^8 ?8 d) _- _    mcasp = &MCASP_MODULE_1;$ A$ w4 B3 F# t
    mcasp->regs->GBLCTL  = 0;       // Reset& V; X" ~: E' I2 H# N6 Z) ]' t
    mcasp->regs->RGBLCTL = 0;       // Reset RX- n4 v3 H: t+ N# j0 Z
    mcasp->regs->XGBLCTL = 0;       // Reset TX6 g- s' l, Y$ k! p9 u! i
    mcasp->regs->PWRDEMU = 1;       // Free-running
: B$ o9 [- w9 ?  k7 x' k. Z   // configure McASP0 receive registers
' F6 [* D2 T3 K, q    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
' D1 Y6 {0 }  w  }; P. s* F3 X    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 i! d8 I% M& r: A# ^    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
6 V% a; @# J- `% ?6 \: _. {    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)5 \, f' M1 u6 Y6 r
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
6 p1 M* b6 W$ N. {9 x    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
" C9 H3 ~1 f, P7 [& C6 m    mcasp->regs->RINTCTL    = 0x00000000; // Not used
+ m" A; i* l: G/ I4 S    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
) c: K; c& f" `$ z7 U5 |1 O/ Q. K# h* C' U. R
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used1 A) @. I9 Y, [; ~/ n* u
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& b7 S4 E8 U# Q' R& H9 v! j
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
3 E7 d$ ?" p3 w; [5 @2 F    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-168 \$ b9 `& ], {5 D' Z* Z; r
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
3 s7 j2 _# \! f    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
7 ^* x! o# H8 a7 v. i3 p5 ~: P6 C    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit9 p. N8 Y# J2 [; ?9 L+ w
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
$ k) S! O0 X: O# k- e# e& [/ S+ L$ E
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
; }0 P  p, f( o; e5 d% m+ m    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT5 `4 B- c% y! g# i
    mcasp->regs->PFUNC      = 0;          // All MCASPs$ y- g, f$ t" s" s# E" L4 L" l$ E+ o
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX15 n) s8 p" z) \+ u+ R: Q
2 i/ g) O" g; ^9 i3 [! B3 h. E
    mcasp->regs->DITCTL     = 0x00000000; // Not used6 o1 o$ P/ O  c) \
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
% O1 C2 N$ d0 `" b+ h5 v    mcasp->regs->AMUTE      = 0x00000000; // Not used
7 d( g: s5 |. @+ S
, i0 X$ H- z. s+ X! G# N0 g8 y/* Starting sections of the McASP*/, C( s& C2 F- A+ r" X. l
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 0 t. i) A2 i% V! B. a# }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  + a* J! f7 j1 K4 B- i& e2 B4 c8 P* D
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
4 B: ]. \4 X+ i: J" A    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- Q  Y2 o  k! v# j. ]# _1 f5 O% G' h" F
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 F5 Q) a9 x* l7 Z$ G$ E    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
: a' g  e2 n* N. G- Z" X0 u    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
, p' }5 K! [5 R" @1 W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
$ M" p3 i  D, @8 N/ S, v& r4 e7 i# Y; c' G: E$ w8 @: {
    mcasp->regs->XSTAT = 0x0000ffff; # Q9 a6 p. @- m+ I* h& V8 V% }) |
    mcasp->regs->RSTAT = 0x0000ffff;
; F: j" d; }* k( F8 Z1 [% Z; K  K& g7 @$ S
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
0 E- d' B+ V" I) }    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );; E( a/ X* j+ E' c" H  G. U/ E+ |' V9 G
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
: P0 r  X' g/ L3 b* k% V5 i. \* t( L    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );" W; |/ U* ]! n1 I3 ]( z4 a( I/ {

8 E* s0 O& b- x' e. N# m    /* Write a 0, so that no underrun occurs after releasing the state machine */
0 [0 |+ x! r) E9 D    mcasp->regs->XBUF5 = 0;
' m, p$ \* Q2 e/ k: e$ V    mcasp->regs->RBUF0 = 0;6 b9 y6 c) Y+ H4 O: f. ~" Q

0 U3 H5 N% C# l) ^$ |6 w    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; . ?% M4 g4 z2 _, f' y0 Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );! p$ x$ p- d8 [0 S
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : v7 u, g6 a: n- e: \
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
+ O6 g4 `; B. W0 j  ?7 |, w
3 u# D1 W& z, }    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 6 ]4 [) H( y2 x8 b  v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );2 L  p% Q4 d; h* n
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
, l# Y: a# v1 u  l( s, m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
! @, c- e6 t1 q  h2 b& ?8 v0 |3 [
    CSR = 0x0000;0 s: d2 h# V! @( a. P. U  i2 L% B1 K
    INTC_INTMUX1 = 0x3d;
2 d( [: r, B3 [* P6 `* ^' \    ISTP = (unsigned int)vectors;* [' N* |0 w9 R, g" L: F& d+ K0 y; S
    ICR = 0xFFF0;  * I. m* Z% B" X* Q+ q1 \
    IER |= 0x12;  
6 U- k! F6 x7 N. ?+ V    CSR |= 0x01;  ) y3 z+ O+ ]9 s! s* Q2 Y
8 F- p8 M7 l) E# k+ I4 G  y

6 U6 {' V. I8 z
5 w  q( Q- g$ D  _0 ^还有就是两个输入输出函数:  @3 f2 Z2 N5 v6 X
void output_sample(Int32 out_data)
! r) @$ M) H0 j: L3 n' a2 W{3 W/ u' v% E1 K6 l9 K, y: O* O
  AIC31_data.uint = out_data;  / S( F$ `% U% F9 ~
  MCASP1_XBUF5_32BIT = AIC31_data.uint;7 e, G! n: ]5 @# M: N
}
. `* n% N! f" F* i. A' m" d6 m' p) ~0 W  y* J/ Y: {
Int32 input_sample(void)
4 q( g* S, u4 }+ y% ^, H{  
+ C0 Z3 O/ t4 F" j- Q/ S' @. \  AIC31_data.uint = MCASP1_RBUF0_32BIT;7 |3 z8 S* ?$ _( v8 U& n
  return (AIC31_data.uint);
. v# L' q5 N) Q: f}0 e' z8 D! R, d
8 o$ U0 C! O" }9 s, m8 [- k

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




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