嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
$ D. M- o; A4 |: _2 {7 Wmain文件:/ N6 s1 M  t; k- G9 o
interrupt void interrupt4(void)  % J3 S: v( d$ w8 B8 D4 Q
{
* R+ b; m0 L' M  Uint32 sample;
( i  R; P* v  f% J
/ w3 @; d3 E5 r+ o! H  sample = input_sample(); // read L + R samples from ADC% t/ Q6 u- ]" f+ c/ f6 c6 \( ?' H
  output_sample(sample);   // write L + R samples to DAC
" c) L4 `2 e/ x( g; ^+ ?0 D5 k9 O0 Q/ b  return;
; `- ^, }% D4 N' ~}
0 z$ L, z+ B+ E/ H- w6 e( n* o( D! }+ Y
int main( void )
) Y/ _$ s; q. z, t{8 x/ w( ]7 r) g
7 @7 Q" v% q' u$ s3 ?) t/ o. v( W5 d
    /* Initialize BSL */
3 }# _8 M: F9 M2 _$ z. C  @6 ^8 q    EVMC6747_init( );
& w1 `: k7 p: o) [# U, q        /* Call evmc6747_intr function */  j4 ]8 A2 y# i( ~, N
    aic3106_init( );' `  C. F' C. {* V1 Z8 H
        while(1);
' R3 h- b: U% L}
8 y# u& s% n; @4 j9 ?1 e7 L/ N" w3 U% Q( m
1 l3 w. e/ O  S  Z- ?0 S
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题$ V. B* P7 ?" J
/* Initialize MCASP1 */! f7 z' q/ b) d& G
    mcasp = &MCASP_MODULE_1;; o6 ~4 a* c  J. ?; G' ?& l, Q. Y- F
    mcasp->regs->GBLCTL  = 0;       // Reset
- U2 U3 T, g) A  s1 Z    mcasp->regs->RGBLCTL = 0;       // Reset RX
6 x* t# P' p; E% Q    mcasp->regs->XGBLCTL = 0;       // Reset TX  G4 U- i5 i0 S+ p, ?; B6 H' c$ k
    mcasp->regs->PWRDEMU = 1;       // Free-running
3 b6 P5 I" [3 Y  z" a% P# g/ d   // configure McASP0 receive registers
2 w$ ^7 x* a* C: B    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used% _- ]  x: c, k; ]7 a! C
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus; U; K$ d+ f' x0 D1 {9 I6 i& F
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word2 v7 n: T8 \/ j  e% q! L9 Q
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
. ~8 ?6 `8 y2 Q9 B2 A    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)( }0 X4 ?; K+ i( ?( V/ n! q
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
% S6 [3 S1 m  C7 P4 t* m  P& ^    mcasp->regs->RINTCTL    = 0x00000000; // Not used
- q, m) t5 g7 b- q: `! i* v5 m    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256, T9 B) j: d8 j9 b! }; D. k( a

( }& Q; J4 G# D' Z" |- ]( m    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
  u$ e  `7 b8 \& N    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) D' ~1 a2 m2 D8 M  w  S$ b7 ~    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word; M; F+ \7 @% J2 B4 w4 f
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16+ q' m" @- V; j/ B
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK8 B6 n! F0 S% E7 }' _8 J7 Q0 U" q
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,12 C, `  t% F; K1 @# K; m" r
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
2 }) X: i- A0 x0 J  l( r# Z5 B+ D1 ^    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
" K, t7 y( U; z4 X! ~" b. C. `7 N+ _( Q* j) W6 R4 X0 `
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. z. m$ R! I1 ]) b* F/ Z    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
+ h4 X: R0 f! J) S; @) U    mcasp->regs->PFUNC      = 0;          // All MCASPs
/ }$ u' B, C- _( {    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1' y8 y! s3 Y2 u6 N: m

& i$ b# p+ N, Q; k    mcasp->regs->DITCTL     = 0x00000000; // Not used
# k' e! y# A% L5 W' F! Y    mcasp->regs->DLBCTL     = 0x00000000; // Not used
. }* u9 Z9 @3 E& O  {' w3 V    mcasp->regs->AMUTE      = 0x00000000; // Not used
" x5 K2 y, z/ k
4 k4 O7 A3 i; l; S/* Starting sections of the McASP*/3 f# u! X- z# ~( K
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; ( d  {2 Y& _7 Q) F9 e
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
, \. h( w6 A( p" R* Y  i    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 6 e  k7 E: N! P, Z3 x* b5 m( o2 t7 l
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 m+ U& o' e# ?; v/ [* |5 g8 ~2 ?1 H  K
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
) I4 q4 v/ i+ c" q6 J* C. N    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );/ @1 B( S. j8 k/ V  m9 `% t8 F( K
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
; B3 l4 |- @# r- f4 Z& l6 P0 ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );  q2 K5 }; H* i$ D

3 X1 w: Q8 _/ R, q" f% C! \    mcasp->regs->XSTAT = 0x0000ffff;
" {: p8 B: h5 l6 ~1 e  y7 s    mcasp->regs->RSTAT = 0x0000ffff; 0 I  X9 S# }5 {" I
: }- ?: s6 t) h; Z
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
7 I* P, H0 x$ k, W7 t! Z* v! G7 s5 Q    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
/ c0 S% ~: k+ m: Z, {0 |    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 4 i6 S0 {7 x; V! j( c
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
1 ?- ~3 V$ }/ [: X. H1 {1 \: n4 s( q& m( t0 H$ u
    /* Write a 0, so that no underrun occurs after releasing the state machine */
. g) X2 L- C  k! C; A$ t0 r% k0 i    mcasp->regs->XBUF5 = 0;
( X9 V2 M2 k& Q6 t' v2 p( }    mcasp->regs->RBUF0 = 0;
: B" a. z# ?. H  W: u% ], P+ w' P3 {" o; w# P+ @) F# j7 V& y
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
$ `9 |1 Y2 o2 D3 w6 {7 K    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );' `, }% @  t6 o( j
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
5 Y* u6 A( }8 |( u: Q  l4 i    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );; X" g. Q* c8 Y2 `% z: a

2 V: K( ]! P& B5 v    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
' o/ _8 D* w7 Y8 p; y' [    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
* w+ x0 F6 W9 s: Q    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
$ s  o: T8 U# \0 m& R    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
# U1 a+ p# J$ J& E
7 C! O. v% C8 t( R$ A9 k* z* F+ B6 K" k+ t    CSR = 0x0000;# N6 n# G+ `2 x. `2 p& h, }
    INTC_INTMUX1 = 0x3d;
. l. m8 x$ w1 Z$ b$ q+ t9 B+ y* h    ISTP = (unsigned int)vectors;4 c5 _6 C& Y8 J4 Z- U
    ICR = 0xFFF0;  
& D$ {7 ~7 G6 Q    IER |= 0x12;  
6 i% Q8 I3 H; n2 N    CSR |= 0x01;  
' P8 R# R9 s( _0 F& _" a& S2 z
" D! J! e2 E& z2 b
9 y! b% i; J; T* k& C1 d6 J" C7 o* z! X6 O
还有就是两个输入输出函数:
  v6 E+ i1 I8 a/ M4 i& F: Ivoid output_sample(Int32 out_data)
. L3 Z+ k, B. m$ s: Z, T{$ C! T. y/ F0 B  A6 i
  AIC31_data.uint = out_data;  
0 ?1 _+ y  m5 L- ]9 U! l1 M3 p  MCASP1_XBUF5_32BIT = AIC31_data.uint;# h! J, n8 f+ s( [' X: N
}
0 \: e1 b( h* E# q( M; U% w1 m: ~- x7 F" N) x8 w! B. {) N- S
Int32 input_sample(void)
2 |! K* d2 p" S# h$ b{  
$ V: G5 |5 m! B3 z  AIC31_data.uint = MCASP1_RBUF0_32BIT;
9 b1 n. G) t$ G* O# f. P' f0 ~  return (AIC31_data.uint);) u* l  i+ @  D0 N& K
}8 p( x6 @' H% f* C1 N, G+ P  R# ]
2 m2 V8 ?& r& I

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




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