嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% _2 W/ A6 X4 w, l' m! wmain文件:
9 G) I/ g6 d6 H% L. ^3 A& Z* v# finterrupt void interrupt4(void)    K- e! D# H% K
{
5 S9 m3 [% U/ F( Q  l9 x* z" Y# G" I  Uint32 sample;
1 ~7 k; F) ]. v# v- j( E, Y. k3 f9 J
) Z6 w2 M4 ~) m  sample = input_sample(); // read L + R samples from ADC
, E% G( O& q/ [8 z) i8 E# F" d9 R  output_sample(sample);   // write L + R samples to DAC 9 P, ^9 C3 I/ K# X
  return;
, U$ D3 z+ m$ x5 O* G}
- [* L$ S6 n- R3 d7 m* f
% R( g& b8 ?0 C+ o6 y1 rint main( void )
! W  ], |5 F: r- x* V{
# @* g' S# `# \8 h- W6 Z
# d* r. W6 s: s% h" f6 K" y7 ?    /* Initialize BSL */: U- G% C: O: @( m5 t! w' c
    EVMC6747_init( );
' R2 Z# d3 o7 ~) u: G; U, F6 {. y) W        /* Call evmc6747_intr function */2 D& P" P( j, A
    aic3106_init( );
) G  i; `; P. G& ?8 J  }; Z9 @        while(1);# ?" c5 [) A' H$ l! j
}
; @7 |9 Y9 ?/ W1 ]7 t
2 d. _) K' f- a+ X" q2 l3 ]# U& R9 h) M$ B5 v- ]. E) N
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题1 @3 F) R& |3 t1 y
/* Initialize MCASP1 */  g+ r$ z8 [- u9 S
    mcasp = &MCASP_MODULE_1;( y$ Y) _5 |+ L  r5 r' l
    mcasp->regs->GBLCTL  = 0;       // Reset' e4 d8 ]1 g3 B0 r2 f* x
    mcasp->regs->RGBLCTL = 0;       // Reset RX  [; n& {( _: ~" d' v
    mcasp->regs->XGBLCTL = 0;       // Reset TX
/ [0 l# l, Q; |; _) l! r9 |: F3 P    mcasp->regs->PWRDEMU = 1;       // Free-running2 p8 N* @8 `6 g" X! |
   // configure McASP0 receive registers
2 L; X3 N- t0 r! K/ O    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used, R. I5 y' o. M, E, y
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
; J& |8 y8 k4 v* ~1 h- d+ q& P    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
, `; B5 r6 i$ S    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
, R% q3 u( u  Q  h; C- C- F5 f    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
) D: d' U& i; e9 m3 k) ?    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
2 {' P% H5 c  ?! \, K) Y8 [    mcasp->regs->RINTCTL    = 0x00000000; // Not used
- |( d. {3 `; b4 Y& C    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& w3 R) a+ u; O* T7 p

& j. h2 L0 W& K* }  S3 S    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# N& M6 e" }! t6 O2 [4 B( ]    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
! t" a9 {% A3 [5 T  P5 l1 D    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word4 R' [9 Q( L) }1 d) j/ m
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
7 P3 H# i- I* t% v' G    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK+ f. v& V: C3 U% n. a& i
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
  m& m- Z! Q5 T4 o$ r. B7 s    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
4 z4 n( J5 o( @$ v: v4 e4 ^    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256; ?+ K1 |+ a# j) W* H$ l# Y

0 S1 z) s( S% z9 `- f) m8 R    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
, F3 |* X6 q: ~/ S; V    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT# u4 i5 \5 |3 d" Z+ c0 X! N* l. n4 @4 O
    mcasp->regs->PFUNC      = 0;          // All MCASPs2 L1 l4 B& W+ r2 w! Z' Z% j- E3 E2 h+ w
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' P* }+ b2 }% l5 J2 E2 O

# B: D) ?0 k. R  N4 E, ~    mcasp->regs->DITCTL     = 0x00000000; // Not used
7 A; L. @2 X+ e" l$ [; t. ~    mcasp->regs->DLBCTL     = 0x00000000; // Not used0 c) v* i2 Q' j7 A8 t4 S
    mcasp->regs->AMUTE      = 0x00000000; // Not used/ Q6 u& p! O; ^* k: e
8 L4 l7 X/ K" U$ R$ i6 R1 X2 O
/* Starting sections of the McASP*/
) q% D5 I1 t# i5 U% E    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; , F5 s+ x0 E: O) K) `  T
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  8 R8 W' F& U8 x# O0 g# u
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # L; K: \* f5 C0 X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
& K: v, g6 s. Y0 Z( S! G1 e5 l+ t: l( W7 }% J
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
# r% }( |% u' T# b9 N3 A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 V0 ^( {7 @1 b- e' H' ]/ ^    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; . a; m6 C1 g9 @; c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
4 A( p5 `  v" j1 x1 K( i0 d
" B; p3 i8 o: c2 n    mcasp->regs->XSTAT = 0x0000ffff; # t$ C9 `) j* _* [# Q
    mcasp->regs->RSTAT = 0x0000ffff;
: i" ]% B; @6 q6 x7 g5 U# `0 n0 H4 X8 o; J, y! r% U8 F
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
' H8 q% B, Z7 J8 e; Y2 S# t. H    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
: ]0 k& [6 O! I9 v0 @    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
2 d8 y1 B% |9 G  |( I8 f4 {    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% H$ z; X/ B# m& t

6 D# `8 C, m" ^3 B& f) i6 j  ?    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 p' J) r7 i; k' W    mcasp->regs->XBUF5 = 0;
, @3 F# y' F: {- }/ u3 w    mcasp->regs->RBUF0 = 0;$ I2 {3 }) d5 }4 T1 ?) n

6 D, @  I4 ~  l3 U5 A; j3 {+ r, H    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; % A! m, C  V/ c( o/ \; Q4 u0 ?+ r
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );2 G5 i' w3 `& M0 p" j, `: `- k
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
- s- n9 [# v: }8 A0 N9 H1 b1 H) B    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
, s/ X! Y4 R1 C9 L. L& @* F# S, s5 r3 e# z; k% ]
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; - {1 U: Q7 j. F5 a% O0 W
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
. k3 p9 N; l: k: L. a) m( m    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 7 n$ t0 e% l9 _( v4 b
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );" i: q0 p  i7 v6 L0 |- t7 d

" s5 @, a1 E) W8 L& ?4 C# I$ p% \    CSR = 0x0000;7 l" g; s1 a) H/ W1 X! z, m$ F
    INTC_INTMUX1 = 0x3d;
: {3 D' v* F" t6 k    ISTP = (unsigned int)vectors;
- T$ R/ M$ p6 h" [# b5 \7 Y% a: r    ICR = 0xFFF0;  
, t, |- z8 I% o7 Y+ Z. n& e$ z- d3 A    IER |= 0x12;  ) B, j% c; J# k4 T' a' Z9 ~
    CSR |= 0x01;  ; y+ e5 e7 j5 c+ g

+ W0 p5 [3 [' W. D
: r" s& Q: j! w
; f/ u2 b. H( \8 a+ F: A还有就是两个输入输出函数:/ x# ?3 J# D8 w
void output_sample(Int32 out_data)
2 {' o6 Z; m! V+ c9 e{6 @0 k) J3 r  _( r
  AIC31_data.uint = out_data;  5 m4 |" F& i& T/ j
  MCASP1_XBUF5_32BIT = AIC31_data.uint;& V' w+ ~6 f! Z5 z+ F- Q
}+ b/ h. B0 z8 U) n/ ?3 a) Q
7 O2 G$ V6 @) ?1 f0 a/ s( o  _" v* I
Int32 input_sample(void)
$ x- g+ M( g; d, _4 b/ b- W{  
) A& g/ d/ c7 K- @" W  AIC31_data.uint = MCASP1_RBUF0_32BIT;- ~7 C/ @/ W* x: a7 q5 |8 {1 C/ p
  return (AIC31_data.uint);
* z- r% P+ Y( a  ]# ?2 P7 Z6 H}
+ Q0 k1 E# F5 u% ^) Z; |' `! \5 ]" P* J; X1 [

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




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