嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  [  c1 A5 s+ O* p" u8 w' A
main文件:* K) C( c) q& [; f$ {0 n& P
interrupt void interrupt4(void)  " o! U) W! q! R0 i1 x7 U! x9 U
{9 R1 v/ e  Q2 F) W7 ]9 g% E) d
  Uint32 sample;7 @3 N! b7 V# y0 |5 W! ]$ p1 |
* o( ?6 g% s( [
  sample = input_sample(); // read L + R samples from ADC
8 d7 `* Y( R" F, J7 h) J  output_sample(sample);   // write L + R samples to DAC
) P0 V& b9 t7 U+ t! u8 k; B  return;0 q# D& H: B+ q
}/ C' z$ q+ M' Z# z! _$ p) H
. \, e! _4 m0 ^% U' l" H3 A" t
int main( void )  p2 f2 k2 |: t
{6 n9 D6 R1 W+ K

# X4 M' l. _- ~( B  A6 B+ u1 y    /* Initialize BSL */
( @2 y7 q, g% a# S1 P    EVMC6747_init( );
5 ^6 J" Y' B; _4 @: L        /* Call evmc6747_intr function */; C0 b9 Z0 m+ t- L/ J
    aic3106_init( );
; S$ j. X( o+ Z2 I- r+ v        while(1);' b6 d0 U6 T* _6 s3 _7 P: s% c
}1 Y/ j7 h1 v! K# N) P0 A
+ j6 o0 M, R$ _
( v+ Q" @0 w" j7 E0 z
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题! e$ l7 P/ e# I. x& _
/* Initialize MCASP1 */
. x( G! b8 r* k6 Y1 W9 _    mcasp = &MCASP_MODULE_1;% G9 p4 \( r$ P( @5 V
    mcasp->regs->GBLCTL  = 0;       // Reset! T! S) p) r/ o  H$ [7 C. Q; q
    mcasp->regs->RGBLCTL = 0;       // Reset RX4 X" g* Q! i! z! f% g
    mcasp->regs->XGBLCTL = 0;       // Reset TX  B$ j4 {  f4 E$ @' g
    mcasp->regs->PWRDEMU = 1;       // Free-running4 w" V+ c5 D/ h9 E1 V/ E7 f7 }
   // configure McASP0 receive registers
/ b. D8 `5 S; K% ?. g( D$ f6 G2 t    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used5 l% }8 f) a; ~" W# k9 e
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus( j; F. ]3 p# Z7 W4 N# }
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word% h5 k+ b) M; l, R% V
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
# T& Q8 F: {0 ^8 r: |9 y    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)' A+ z  |. P8 f  t
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 F  H) F1 G; x# ~8 E) a
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
& D; q+ M2 N0 _3 t) {' t    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
( L5 U7 L) U# v6 R, O$ s6 ~; }' g2 [- d+ Y" R2 v
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used  g. d1 y5 T8 Y! H) c7 Q
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
+ X4 |+ O. d- [0 y7 t4 K    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word7 ~$ l5 D; }( G, M0 n* Z
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16& P# B( J2 t4 O. o
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK2 R* ]% H; ?. L* U+ i! |4 |1 }
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,11 ~3 J  {, f* J. J8 X% f6 v/ o
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit% _! c& L# v4 J! Y
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. B3 N( I" [& U, i- V
1 w7 I3 [" a( x0 F! O5 G4 ?+ D4 {0 l    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
1 L- U9 @* [) R# S# ?) Z* c% E    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
2 H& X" j/ P8 p+ r0 H8 P; o    mcasp->regs->PFUNC      = 0;          // All MCASPs8 R+ b5 t* p5 P- H0 o! o
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1" F/ u; I. O* {
: a2 t2 V; `: ~. l: _! @) J/ ]! B
    mcasp->regs->DITCTL     = 0x00000000; // Not used
+ y+ U  P! c4 @* D    mcasp->regs->DLBCTL     = 0x00000000; // Not used( u0 }) P. @1 V. L' p3 C
    mcasp->regs->AMUTE      = 0x00000000; // Not used1 w. ?0 ?5 v8 ?) [6 M

4 S4 X# [$ t5 Y/* Starting sections of the McASP*/
7 r: c6 V) X$ [" R; `    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 I1 n4 w2 R- t
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
1 ?' w* w$ K; ]: a    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; # q, S. j( `" ]9 w4 \* a( g5 a
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
2 c  G3 j/ w; Q% m+ @. s% W& `- E1 B8 Z8 R
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
, o0 @! w, g$ [- W5 R$ F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
4 Y% h- t1 z3 Q7 \% R6 w8 G9 e. {" ]    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 `  ~* [/ h. O    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );9 E  C, {+ O) E4 h# O

) |, G; m& D$ b) F    mcasp->regs->XSTAT = 0x0000ffff; , L5 n; K2 ]8 E! j) B" B3 e  P9 N) _
    mcasp->regs->RSTAT = 0x0000ffff; # j5 @: G( i8 v0 H; z% h; @8 \& d/ a! ~
4 h, D- a+ P) U2 n* o3 d0 `" A
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
1 h# \( w  |* \1 o    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
9 o$ D8 G0 C$ h" `    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 1 D( f# s4 Z% z7 i
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );6 E0 U- s+ e# p# G1 t6 q) x. Q& b% d9 D

5 U( m  i, d/ x8 O( T- p$ u    /* Write a 0, so that no underrun occurs after releasing the state machine */
7 ?' g. S2 o6 H5 l    mcasp->regs->XBUF5 = 0;
% F2 S' B7 ~" U& o    mcasp->regs->RBUF0 = 0;: r1 n- B# ]' x: E2 t
' g( C3 E" S4 J) E2 n( s
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
5 }% x& t& \6 p    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
9 _% V# M5 O% h- f    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
; `8 D. q1 D. L( F1 y4 M7 q    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
0 j% }+ V: X" b: H. o; m% w4 `6 p6 q. Z8 H+ L
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 4 q) P# P8 O9 r4 U2 x
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );4 r" c( r" k1 A$ o8 Z% N1 J
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; $ ~+ g! Y" P3 n6 N# I1 }3 d# J
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );! ?4 C7 D6 X. z' C7 f+ B

& U( i/ g. S- {1 ^' H8 ?& V1 |0 l    CSR = 0x0000;
+ G. W5 `# M! a5 }; }' h" `  A* b    INTC_INTMUX1 = 0x3d;: R" n4 z( c( _3 e
    ISTP = (unsigned int)vectors;4 t' h, E( [" a% j5 E
    ICR = 0xFFF0;  
3 S& K* G: D8 _    IER |= 0x12;  ) Y. E" _% \5 j* T- {$ k
    CSR |= 0x01;    U! V  l  b( i, j; l! T
! [0 H' E! F0 P2 P

0 D% l% a# u5 w. Q
. k3 \1 P% @! c0 i. k还有就是两个输入输出函数:6 A! P: ~( P' q+ @& x% U
void output_sample(Int32 out_data)9 ]( @) G/ ]: t5 X
{
. r0 \$ J+ z& d  AIC31_data.uint = out_data;  3 A6 _! h7 q5 H- {/ b% L4 L& Z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
1 p- b( a/ M! n0 v; m}5 ^! }' z3 g, F5 d9 T9 f
  N  r; O# u+ p: G/ @
Int32 input_sample(void); c, A3 w$ ?7 [  {0 S
{  
8 @8 N; m/ T+ ~, @/ D: S  AIC31_data.uint = MCASP1_RBUF0_32BIT;
. s8 y6 ^9 r, u) Q& R  _' i8 c  return (AIC31_data.uint);
2 N! c* _8 t6 e1 c( S2 l% \}! u# ^- W3 N  P1 M6 ]8 W! K
, }+ }8 K: G2 j) p3 M

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




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