嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:& w' b: ^# y9 t+ g1 e& E
main文件:% T: |$ G4 }+ \
interrupt void interrupt4(void)    v: V. F& l7 P8 M5 B
{/ Y' i7 X/ L. n+ d' n6 n  L) ^' Y
  Uint32 sample;
; E8 e+ a+ g8 V2 t4 C0 e8 L: N' e
5 ]" J, v; K- F& P  sample = input_sample(); // read L + R samples from ADC
+ b* n  F) U, _' M' X' ?' @  output_sample(sample);   // write L + R samples to DAC
3 U+ q* W0 |- D$ t  return;
+ g# A1 U9 Y% l  P' V$ C+ [}  J, C; B3 X3 i- }

3 w, N: U2 [2 b& q; b) x: V( yint main( void )
6 e$ e" f3 X% C& F0 `! X4 l{
' a* ]! y; ~$ |( U! i, e7 U3 _, t7 j, ~; _7 N- b
    /* Initialize BSL */
& y( ^7 l6 l, p. \/ R    EVMC6747_init( );* \5 T, t/ t0 K/ q  t! A* e; n: i
        /* Call evmc6747_intr function */
! q! M6 z# ~/ j0 W( P* e8 E    aic3106_init( );
( B, W) W! s  U* `9 q! B        while(1);8 I. e1 y9 a0 i
}, W" e! Y) E4 l3 }
0 E1 X1 q1 Z( z1 ]; V+ g
4 l7 R: Q9 E1 a" l0 c
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题  I% r- x# s5 X2 c9 E3 ?3 e: }$ n
/* Initialize MCASP1 */% {3 w6 t8 ?3 T" E, U& _3 `( s& q
    mcasp = &MCASP_MODULE_1;
* E: T5 V% L9 j, U; C/ g    mcasp->regs->GBLCTL  = 0;       // Reset% X( E. t$ g, X+ E
    mcasp->regs->RGBLCTL = 0;       // Reset RX  Z4 }) E3 I) r1 [' C2 c5 p
    mcasp->regs->XGBLCTL = 0;       // Reset TX1 Q7 ~0 O# F6 a) z$ S! P
    mcasp->regs->PWRDEMU = 1;       // Free-running9 n! U8 g: Z0 ]
   // configure McASP0 receive registers; y# v8 D) C6 q# ^+ G0 H
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
" L: t" ^2 s. X' B    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus5 b. z0 L) K8 n* K: Q" L9 U* D
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
$ T# ], v/ |7 h    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)! |, f" |  \7 P) u
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)6 ?  G- J7 h! C- u
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
* I* {7 C! B9 {    mcasp->regs->RINTCTL    = 0x00000000; // Not used) E: q& n% j! y
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2563 U! a  m+ w9 A1 a9 f" y: e

' }3 x% d% L. k' H2 q2 c    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
# F' U! B, y# A: O/ \5 w1 A3 R    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 t6 q. b: w9 z  g; d! d7 ]2 g7 G( U
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
# E5 g- p1 M8 m- Q* ?) r9 z    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; h  c: c+ i: ^    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
) d8 w8 r8 e8 `; U/ T+ i    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
! d: v" Q/ c- x6 M" L$ D; e    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
0 N) N+ V3 i# Q+ x# ]    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
: }8 N0 Z2 i% ^5 j5 \# u6 r1 Y1 o& ~" W' J- g$ C  e
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
2 e% R+ ]8 ]; Y4 _/ s    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT* I9 i! j! W) |7 K# r- @
    mcasp->regs->PFUNC      = 0;          // All MCASPs
" @4 K1 V! |# b6 {    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1) b* N# _) J/ x2 E

2 K/ T8 U$ F; _  `    mcasp->regs->DITCTL     = 0x00000000; // Not used6 W$ B. O4 M7 L. I7 n3 S4 u
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
1 C' P' m# W. x4 X& H5 f    mcasp->regs->AMUTE      = 0x00000000; // Not used
, R6 J' J3 g  L6 ~) i4 q: ~+ r2 m' V! J: [
/* Starting sections of the McASP*/
- r* B3 G, j! X" r8 X    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
! o. G; Y, R; f+ n    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
/ k4 m! Q# o- S7 D    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
( n! ]# @6 d. h, T+ I9 i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
; Z# r7 r$ r0 \
. |. O% d$ e, Z9 T% ~    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; : Z- L  t+ F* c3 p9 g: b# [& g
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
2 {& g5 @; k* K2 X5 {; P4 X5 N    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 9 |, Q/ ?5 A6 y% d7 a5 a$ H; r
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
- v* i2 n* h: @* i+ g2 ]& a7 G: Z/ v
    mcasp->regs->XSTAT = 0x0000ffff; ! }! M3 J7 z/ A% Q7 ]2 u) q% n0 n
    mcasp->regs->RSTAT = 0x0000ffff; : H! G* b: X6 P+ w! H, u
8 K1 x  b+ q. \6 ^4 d$ P" d( U
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;" Y  S7 `- ?9 t& q& N
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# c0 w; o4 J8 Q) S- X" h
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
0 H8 `+ U% A5 ?( x% E5 E    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
: h5 }  W! q( k* d( ^3 h+ U
9 Y; D) R/ R* B% x: p    /* Write a 0, so that no underrun occurs after releasing the state machine */
1 j5 w% L/ a! F/ e    mcasp->regs->XBUF5 = 0;5 X' s* S* N4 p
    mcasp->regs->RBUF0 = 0;; W( a) C5 R; V8 a/ P

" O5 Z& V4 Q1 r/ C! T    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 \. f  u0 ~  D9 _3 ^) t    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
% O( ?6 j' V3 [# \    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
) m" U8 `. \4 F; z9 V    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
1 ?+ i4 w% @4 _# `1 t, v+ h( P1 w
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; # C  J; E2 ]- Z6 W" s) B- x, X; ]! c: D2 Q
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
; T0 G: _9 v  w! L8 P9 X0 a    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ [; G" R) s, s% W    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: Z5 y0 t0 d9 A/ |$ }. ~- \. g/ o5 {, r6 X$ k  e3 H& N# p
    CSR = 0x0000;; V, _: C  ]2 H2 c4 h
    INTC_INTMUX1 = 0x3d;- f! O* \, u& J. c- ]! x
    ISTP = (unsigned int)vectors;5 p  @- G7 `+ S/ Q8 e1 I( N0 `
    ICR = 0xFFF0;  % H3 T1 U' k! [  s7 B
    IER |= 0x12;  
+ @# p3 E* X9 M4 _. j    CSR |= 0x01;  
: N- I3 W) H7 |5 b% V
5 H" p; A+ ?1 c) W/ K' b$ v1 F' u8 \% y0 O$ b6 M
$ M& g4 {0 @: x, l" t" g4 }! _4 h
还有就是两个输入输出函数:4 m. F4 P  r$ B! q& j2 u+ }
void output_sample(Int32 out_data)
) Y) S6 p& W8 W2 t6 M3 M4 v{+ m2 z7 f, V% x; u  P4 G
  AIC31_data.uint = out_data;  ' ^1 T& A. ~: }! m4 \$ m  K: n3 E
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
, R+ \( u7 A& m3 O- z* v( ]: K}/ v1 d" q" S( ~+ R5 t
. F4 p, \' j/ @' f' `
Int32 input_sample(void)
% k; c6 [$ Z% H& D" M/ D{  
) J) u( _1 L' E/ E! W3 K8 J" t  AIC31_data.uint = MCASP1_RBUF0_32BIT;2 K- r2 ~: @6 A6 W: n
  return (AIC31_data.uint);0 w" O" m( N; r4 C$ A
}
2 l( x6 W0 a' {4 T& O2 \. k2 l% M3 y+ g. ]

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




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