嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
2 k8 [6 @9 }. @* h5 S% {7 nmain文件:
) Q* D! y( S. finterrupt void interrupt4(void)  % e4 g, N3 @6 @% Y1 _2 s. a
{
( U  C/ g8 s8 W  Uint32 sample;  {/ w! p8 n  k! i& w9 K9 k

2 y# _! L. e0 n  h' H  sample = input_sample(); // read L + R samples from ADC
9 [' b+ w4 u+ r6 Q' j! P( K5 G  output_sample(sample);   // write L + R samples to DAC & A0 A# c. G' m4 ^
  return;! H" l/ `8 o1 H8 K; R3 {& g+ ?2 D" h
}
, `4 m/ E+ p5 X+ g! X% ~( Y- a+ R9 t& N$ k9 F; e4 H
int main( void )
1 P% e! d* J9 x0 T2 H{' }0 \& P. D- a& P. Z8 z! z. M) l
  ^6 ]: U2 d, H7 m' }1 p7 I& h
    /* Initialize BSL */
' j' ~$ f! k1 q) N$ m9 p9 _/ G    EVMC6747_init( );
8 m) k. A4 H1 `2 C  w        /* Call evmc6747_intr function */% S6 j9 K# q% T- h8 B7 p2 V& {
    aic3106_init( );
; k0 Y  a! y: M1 K        while(1);/ S! |; m& `" E: p6 T1 V6 d7 h
}" M: ]$ z3 C7 y4 A  b3 H4 z4 @

( ?. c6 Y! L' K1 h" N$ l9 [, |3 t2 C
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
. e) X" L# |8 _% A# ^& h/ x) G/* Initialize MCASP1 */
' L0 w  I+ {5 b    mcasp = &MCASP_MODULE_1;
3 [7 b5 \1 R8 ]9 U) W( C# c    mcasp->regs->GBLCTL  = 0;       // Reset+ t/ _! ~3 L( ?: P; ^$ W
    mcasp->regs->RGBLCTL = 0;       // Reset RX
( f$ Q2 ?3 X5 m9 `/ V6 m    mcasp->regs->XGBLCTL = 0;       // Reset TX
8 H$ z+ _- K+ j; o$ f4 ]    mcasp->regs->PWRDEMU = 1;       // Free-running
% Z! s2 @6 {6 B6 S; R3 ^2 N! M   // configure McASP0 receive registers' X+ J, ]- i: W/ T) T
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
9 t* k9 D. W8 f1 H1 f. E    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus0 j/ G/ }% w9 ~. E4 Y
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word) a+ e1 p& i" W  ^& z
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 `/ u5 G! ?0 h$ [
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
6 R9 l  u( Z7 |# K, {    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 R& ?' }; a. |/ |- Y# R    mcasp->regs->RINTCTL    = 0x00000000; // Not used/ c$ ?  K0 L$ }7 I* ]
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2566 j' Q# g1 z9 T0 c; S8 a

* _4 q; Y5 F" d+ Q* O" c! q    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
: l! k$ o: @& y    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
& `- h- y7 }% l; F9 u* g    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
- T: \5 {1 V2 j- g  U( x3 {, J    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
: K/ B. Y* G2 T/ j" f# V' b2 g- t    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK4 Y8 G, H7 F& A  @9 n6 [/ b3 z+ k2 a
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,10 o$ R( ]' ^* f
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit. k) n; M& \$ \
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ Q( w! l  z& T: r: |3 j  T2 [2 X+ a
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN1 l1 W' M" U) @2 S7 o2 N9 N
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
; A! h5 K; A9 _1 B, \7 R    mcasp->regs->PFUNC      = 0;          // All MCASPs
; P- K! `) U% B- ?, F    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX14 w3 l1 {0 P" @& F  R
4 o  C6 m7 f" d2 e7 n+ p. b
    mcasp->regs->DITCTL     = 0x00000000; // Not used
2 {8 P' C2 Q7 N! J5 @6 D    mcasp->regs->DLBCTL     = 0x00000000; // Not used
2 _5 k% V. Y& e, F( _5 C3 W5 e% F    mcasp->regs->AMUTE      = 0x00000000; // Not used
/ B/ _8 v* G1 X4 K  ]  K. S( n5 t! X$ r& j6 x) T7 g" g/ Q
/* Starting sections of the McASP*/; x+ E- {' q1 j( ~, X! [- O7 |
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
- P& r4 F7 [# ]* W    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  * }* W) U7 i: k
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 3 O* `' R: ^& x9 I3 s. G
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
" h+ T) ~# z0 E+ ~" n9 F4 X  ]6 K2 G9 O7 j7 u! x0 n4 n" I- w' O
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; * N0 Z$ S2 I. W0 `+ K! [* n% W0 K/ Z
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );0 ~9 K2 h9 M2 ~9 I2 A: c) P
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; o& o0 o' p! u5 o    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );/ k" Z" n2 B, W# W; [
- U4 y6 U+ A' {. m" H
    mcasp->regs->XSTAT = 0x0000ffff;
2 w5 A& E- P" [& A    mcasp->regs->RSTAT = 0x0000ffff;
1 |" H1 t! V- I3 C$ G1 g) ?7 d! O7 Y
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
+ v( U+ J5 q1 |1 N# G2 }; I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
# H4 N- ~* v/ ^% O% B& n    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;   B, o5 K8 Q# S) J) O7 J; J# l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );8 g6 e. u! @- E" f
# U% U) C$ x' m. O
    /* Write a 0, so that no underrun occurs after releasing the state machine */
2 ?2 s3 Q- B9 Y    mcasp->regs->XBUF5 = 0;
4 N8 N/ c& I, u    mcasp->regs->RBUF0 = 0;& w# F6 F" Z: ^/ J8 k; {8 f
& z+ _9 {" C0 Y; @7 Q* s
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! E$ X) |( t& N% W( b+ B
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
+ T- h: L2 r$ i7 q, h    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
0 Q( m0 Y2 l; V! s: k    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );$ }( S! ]( @6 L- ]5 N
* ]: n6 M  \+ s/ p
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
# k2 |2 b% C* t, o0 v    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
3 V& K" `& n: I0 @' v3 @7 w  N    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
9 J+ f/ {1 a' c) b  |5 f! u; e5 U    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );3 R+ J" a. R+ Q, P$ i
/ L# g! P% q6 ?9 H
    CSR = 0x0000;4 O* X" ^+ S9 g8 o  t
    INTC_INTMUX1 = 0x3d;/ b6 E/ ~, g2 Y! I5 B
    ISTP = (unsigned int)vectors;! o1 F2 S6 v7 w
    ICR = 0xFFF0;  
& m$ X4 M( W" h6 U: Q    IER |= 0x12;  
) i# R2 Y. V' J  p" n    CSR |= 0x01;  + b  S% I! n7 @, F3 r1 r1 o

/ o, Q9 Z, q+ ]* J# o
. H/ Q, b) G5 Q6 t4 q+ r+ y$ R; _7 l1 t; r; x- L
还有就是两个输入输出函数:
+ O3 y: Y/ Z1 v) @  S3 `+ A9 A0 }void output_sample(Int32 out_data)  h* L" v2 f. n7 ]/ [
{; P# i- n7 l7 i5 r! [' I
  AIC31_data.uint = out_data;  
; {. l) Q4 J  J4 s$ V8 a  MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 s" s8 j" X% O2 ?# U}
9 I# R" H8 T  I1 s% }* e6 e& @# X2 b( m3 ~( Q
Int32 input_sample(void)
! K1 f" K& S8 S) p+ j1 E{  # ]) H! ?  ]$ k  Y
  AIC31_data.uint = MCASP1_RBUF0_32BIT;  B5 O) K* ~# t+ S+ v7 \  z) o
  return (AIC31_data.uint);
: q( y4 L' ?4 ]3 x}- \6 M% s; a- Y4 q( }

2 }7 L) v! f  k. ?- q) B
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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