嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
% m# l+ U* [( @+ Hmain文件:
3 u+ W9 e2 |' N4 W# rinterrupt void interrupt4(void)  
. k& f: K: x& W4 M' H0 S# o{) ]: k) Y0 J# h; @; j( J; l' o: d
  Uint32 sample;
1 Z# q9 ^7 K' q+ }: g
1 D9 Y  i/ ?4 f# z& q  sample = input_sample(); // read L + R samples from ADC
+ X* ~9 s* Y8 W# d: A! ]  T# h$ R, \' e  output_sample(sample);   // write L + R samples to DAC
; Z" X! l1 A. I8 J5 w  return;
7 w" L1 i, |: Q# U* m. C) Z0 Q}
  I. C* F/ g4 J* N
. q' l  q% z( J, w$ H. Nint main( void )
5 ?  I' _2 P: m" I3 @. u9 q{
0 w. ?9 `# t% X- l4 M& y, x- q( C5 |. O3 g. B, Q3 N
    /* Initialize BSL */; q9 w1 s: B4 O! c% p+ m1 ]3 h
    EVMC6747_init( );
3 u+ Q3 C; O: m        /* Call evmc6747_intr function */
4 Y. ]' L* Y9 ]: O& ?& O    aic3106_init( );
8 i1 J6 s) e+ u  W7 e        while(1);' N9 F6 T8 n: T/ D2 u1 D8 H
}
8 a, P2 ?0 ^' n8 U+ e! S
* t5 D8 h" A5 N9 h, P; S! J9 u! p0 e  V3 D/ [8 W2 ?1 ]
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- t7 S$ d. m* I4 e% N0 q* X! K
/* Initialize MCASP1 */
/ Q3 o& z( s. S. X. H    mcasp = &MCASP_MODULE_1;
0 m: {7 g6 ?8 Y0 c9 r2 l    mcasp->regs->GBLCTL  = 0;       // Reset
" v' [& y+ n4 D% I: g% _5 ]    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 v9 [4 B; s8 b, r( T    mcasp->regs->XGBLCTL = 0;       // Reset TX
1 x: U4 S7 I" j$ _& @& |9 f    mcasp->regs->PWRDEMU = 1;       // Free-running& c3 w8 F5 h0 ]6 T8 W
   // configure McASP0 receive registers
# a3 {: Y7 N0 y7 x* X  F0 }0 p2 B    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used) Y  v/ |8 ^6 p: A. C3 r* v
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 \% @3 V& }* z6 |* @( S7 g
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word$ ^9 z. Q; [  O3 _
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 \1 f; C+ ]/ f2 G* c: r
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
: }0 Z9 q8 |1 }% l# ~9 W# |- v7 l    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1( z5 R' ]7 k  _/ I, O' y+ s: z
    mcasp->regs->RINTCTL    = 0x00000000; // Not used4 u; r( m# t) d* u( W2 y$ \
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
8 I0 _! K7 }5 @7 I( @- ]5 a" m
7 p9 M4 C% N9 }! n: R. ~    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
6 G9 ^- E! n4 s* ~* `, u2 m. [" J    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" N6 j' }: X6 K  X/ l    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
5 L# A. k" M5 K& _, L. P    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
1 }' S7 ]( K/ y) k$ D% c6 @* Q) x    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK" y8 n$ c6 m# T) w" w( o
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,13 s6 m& M( _7 G/ n0 g
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
' O. I9 I# g( n4 @/ b    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
5 X' v9 u- ~, O' r4 N
3 l# H0 q) f. n1 \! k; V/ x: S    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
0 }. m" ?% z* b9 G    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT  S3 u% h- {; q; X- i( e* r
    mcasp->regs->PFUNC      = 0;          // All MCASPs* E) o9 a$ H. v7 M% O
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
6 @& Z7 G6 \4 E' ?5 k7 E) v
7 E5 N4 z- @) Q8 Q( s5 m/ I& ?- q    mcasp->regs->DITCTL     = 0x00000000; // Not used3 G; ]/ _) B& D3 @2 u. J
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
  f% z% t( V( m" v& r    mcasp->regs->AMUTE      = 0x00000000; // Not used7 {7 Q, I2 \  ?. s3 A+ n; ?$ n
! y- F8 w( K3 I3 w, ^2 o% M
/* Starting sections of the McASP*/
. j2 [8 ~- p- e* ?+ O+ z    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
" _' ]( }# E7 D! d7 R0 w3 @% `    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
% `" e' I1 N# P( G) C    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
6 o1 E* f: e$ M6 C! S( W3 f* g    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );1 r# \+ k; |$ M9 N
# }% x( R) G! G" A* p) c
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
6 S  a& }/ x% }0 ~7 e    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 g; d1 T& A4 n$ \
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; % b* x- J( U1 C! F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );1 k% [& |& Z# D% k5 Q( Z1 o
/ e8 G: j% M# B* G- c
    mcasp->regs->XSTAT = 0x0000ffff; % O% r6 h# p" m$ `. t* _: r& q
    mcasp->regs->RSTAT = 0x0000ffff;
6 t0 I) w% F# f* S0 p" l: S8 R1 S2 s: E. T& ~) _. e% ]
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;4 J* }' a4 P* j2 r; o& R3 y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
6 K4 h( O) e7 }    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; . D' p, h3 q. o9 ^" q3 Y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
) r* \3 C( t! R$ N$ Z" j7 g5 m2 }# {4 j
    /* Write a 0, so that no underrun occurs after releasing the state machine */
3 ?/ d# ^: n! C& e6 h    mcasp->regs->XBUF5 = 0;0 O- \0 D: |. b) T- S
    mcasp->regs->RBUF0 = 0;) H8 H! K' L/ y8 m; y# ^; A
2 s/ l) ]7 n8 C& L' a# R3 l' y8 j
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
" C3 i/ X+ K3 C& [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );0 E5 `+ H: Y0 X: p5 Q% f- p
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
2 L7 d, Q/ f/ o+ ]9 _' L  H8 i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );0 T! v9 p( q% J; I8 x; b+ l
0 ~+ c5 F7 L0 S& i
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# w( p3 c4 R" `( v9 w  Y0 y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
7 d4 @+ c2 V8 ?    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 9 z% m# Z0 e) ?/ g% `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
5 ]$ \$ M& Q: |) r% \! t. P2 c/ J
6 M. I/ _$ D8 B7 k    CSR = 0x0000;
1 R! `( e1 u! L7 Z  q/ `( J( p    INTC_INTMUX1 = 0x3d;
' X6 p+ f% n- ~1 h4 l    ISTP = (unsigned int)vectors;9 @, O1 w5 g( R0 Q2 C5 J
    ICR = 0xFFF0;  9 r0 B3 X6 t2 p0 g- b
    IER |= 0x12;  
5 S( V  B# {3 N! x' K3 H- G- Q    CSR |= 0x01;  ; v% q2 Z! R! g9 h
* y; r5 p2 ?% Q3 v& q

8 r' V& w5 N- v: L1 W& e# S0 D$ T& I. {
还有就是两个输入输出函数:
* `: }7 p3 ]  t: ^: T. O1 ~6 P8 ?void output_sample(Int32 out_data)
6 R. ?  H+ \  d( `" H6 i{
! f( t( n+ o1 K  f  q  AIC31_data.uint = out_data;  
, @  g6 H6 N  G: y; X" K- I2 |  MCASP1_XBUF5_32BIT = AIC31_data.uint;& A9 S4 P! i6 r
}
3 A3 `, E' Z# ?: O5 _6 v+ A* h4 M; C' |; n9 p
Int32 input_sample(void)2 I/ d9 Z9 w2 \2 v- v7 |" a+ A. ~( H
{  , x$ Y% E% ]% a1 k9 G& p
  AIC31_data.uint = MCASP1_RBUF0_32BIT;$ ?  _& {( ?, j" \7 X
  return (AIC31_data.uint);
, Y6 d: x1 m8 B) f; D: \6 @}! m* L# X3 J  \1 ?2 z- D- V  w
0 t1 T4 j  c# W

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




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