嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
3 t. A3 {- K5 x8 umain文件:# `  K( y+ D, y, n
interrupt void interrupt4(void)  
" @1 l( O7 z4 h) b! A2 q{
9 T  X- Y6 Y: R  Uint32 sample;
( p6 e2 V" i& q! W0 [- E& N, S+ Q0 K- X8 L$ J1 z* C, M
  sample = input_sample(); // read L + R samples from ADC
5 B/ |. S" |6 @  output_sample(sample);   // write L + R samples to DAC
& L! t5 t' m/ I1 G( L  D  return;+ ~! Z, j+ {3 \
}8 T. I/ n. M' q5 S

9 \! M0 H2 I$ u: y0 dint main( void ), \! i! d/ ?4 `. d7 B
{; t1 ?; J; {! p2 \' J$ G
' g9 n2 V' f6 A# u/ l8 x
    /* Initialize BSL */
3 I# i$ k3 |, s$ {& w2 D    EVMC6747_init( );
2 ]3 r+ H  `% U6 Z3 F0 f- L        /* Call evmc6747_intr function */$ U2 h. {- D( k" i
    aic3106_init( );
  p7 f4 x# R( z        while(1);
. W  c8 O9 g0 c* |; V1 U/ }1 d}
5 p8 E  [" j7 z5 _
9 ]* ^" d- |7 z
! J6 @: ?! X: Faic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题3 J# ~8 U$ b& R3 t2 ~
/* Initialize MCASP1 */
. [. z1 N- }) g2 i* Q$ W- t8 Q9 g    mcasp = &MCASP_MODULE_1;% ^! y2 Z  ~9 W( H
    mcasp->regs->GBLCTL  = 0;       // Reset1 m+ ?7 J; }5 s9 F
    mcasp->regs->RGBLCTL = 0;       // Reset RX
9 t+ A# t! o9 d2 }6 x% p1 V9 u. f    mcasp->regs->XGBLCTL = 0;       // Reset TX5 f" |; i' n  E  o7 \$ K( v
    mcasp->regs->PWRDEMU = 1;       // Free-running4 S  o: G; }4 t3 T. R5 ~5 U
   // configure McASP0 receive registers
' L) o+ [4 U4 n) u6 W    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
5 }- j6 m9 d1 m+ _6 u9 y6 h- Q8 `    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus& R( V; r, [0 e, V. @
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
; A, U5 l. r" ~4 e& R1 A& K    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
9 l; y5 \: X& |3 W! t    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side), x# D; D+ f$ t2 N
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 k9 c0 Z: r2 R% M
    mcasp->regs->RINTCTL    = 0x00000000; // Not used" C, r+ Q. E% K6 d3 Z1 _+ z* C
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
. s4 P8 E' T8 ^
3 _! l2 m0 _+ T* L- a: P3 L' K    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
+ o  {2 p, g+ @5 H3 ~; h5 k    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
7 l1 D8 B) J) H: g6 n) L    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word+ q2 _, k$ U# F# f# c
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16  Y3 s0 u. L3 |( x
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# z  j5 g1 k0 J  V6 m, R
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,16 s! ^5 L4 c; b, F7 Z! h( x2 S
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit0 g# I3 [$ s0 ?0 U8 l
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
7 a6 {& b1 d& O" J* m3 U5 u: ^# W6 B9 y" c4 ^- K
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN: g# X4 x+ E& z/ e
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT' f1 O) |4 O6 |1 O! f! \
    mcasp->regs->PFUNC      = 0;          // All MCASPs1 D; C" c* S* n7 r9 c; n
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
* Z! ?( c! O! }3 a+ v7 Y$ I/ s+ [9 `+ e8 P
    mcasp->regs->DITCTL     = 0x00000000; // Not used9 O( b% Q, V- e! t9 S' A
    mcasp->regs->DLBCTL     = 0x00000000; // Not used4 Z8 a( y8 ~/ S
    mcasp->regs->AMUTE      = 0x00000000; // Not used0 }9 r+ p) Y: x6 f* [
, a0 k  V; {, H& R  ^
/* Starting sections of the McASP*/) n& A! _1 C  ]6 l. H
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 6 O& m) M; ?+ M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
0 t* s8 c9 S/ W4 Y. s5 Y7 L    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; % Z( `5 J; l; ]1 g
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );  p7 ?9 n* x' M
7 U; e4 x9 z/ r& \
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; 3 D7 i' v1 `/ x7 j; v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );1 c8 c5 I* ?$ _. O7 N/ C! A$ w
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
/ B* ?" ~; c+ P; N; q  m    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
1 ^: r. D) ~9 T: v$ t* K
5 B1 ?7 o2 g! R- }+ ~% X    mcasp->regs->XSTAT = 0x0000ffff; 3 p. v' B/ s! Q3 o. l. j1 r  l
    mcasp->regs->RSTAT = 0x0000ffff;
$ x6 @) G: ]3 ^, l; }! \% k+ N" a0 ?+ p* \
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;# `8 H6 y/ W$ |$ A, Z9 o0 n+ N$ f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );- X# d1 Y! s7 [1 |
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ; y6 }. F) ^& p: x4 d/ B$ m1 ?
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
* e7 p) l2 }4 y: \  c* W, W; G
: k1 d3 B& J, a1 w) Y: k    /* Write a 0, so that no underrun occurs after releasing the state machine */
* k. J) Y+ {  @- D0 l5 ]    mcasp->regs->XBUF5 = 0;
; ^# P- w! I7 r; ?# N. P  l+ E# j    mcasp->regs->RBUF0 = 0;
; L8 q8 |: X1 _0 z5 ~
/ p( P2 L/ X. |$ |1 S( h3 Y, O    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ) q4 k8 O8 f- ]8 D
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );& y, O- D3 ]8 p, Q  A: @
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; 7 A/ m: |0 F6 \8 X
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );: T# w9 |" h' G' {9 @1 K' Z' K

) E" j: w- s4 N- F% t2 S    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
1 `" E( [0 P) @( l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );$ n# v& q( n0 b1 Y6 Z
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 4 F# e6 C; r4 K/ \4 u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );+ m. `5 k3 y1 _% k# }

# v& e' E, R1 A/ f2 z' J    CSR = 0x0000;
0 j9 D. k; ~, U! W0 S6 B! o" e    INTC_INTMUX1 = 0x3d;
  `1 e' P# S+ A3 @4 [    ISTP = (unsigned int)vectors;
$ Y  j7 Q. V4 z2 {7 H. N6 W% ^    ICR = 0xFFF0;  
  r1 t+ ?  }5 e3 ^3 _$ B. I    IER |= 0x12;  
6 c. p3 K, O5 Y9 S    CSR |= 0x01;  : z" X8 o$ v% O# o% H+ j' k

' D+ l0 S' ^: |
% r! v1 u) L' k! w" a9 d. z1 R8 r: E" v; ~
还有就是两个输入输出函数:- j2 ^1 V- R5 c& ^
void output_sample(Int32 out_data)
, O6 m, b) _% s" L* d. K{
/ N) J( v' T3 a9 w, E- R  AIC31_data.uint = out_data;  , k& M" u2 `# j3 k3 N
  MCASP1_XBUF5_32BIT = AIC31_data.uint;  \& [9 {& ?, K( v  f' C9 f% u) t
}
3 W4 U# U8 @  R' o
+ n' i9 W! f" F6 GInt32 input_sample(void)- D0 X2 p4 [* }" P- n
{  0 _. l7 g) d+ h) U- i4 E8 }
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
% x2 f  Z6 }; c  return (AIC31_data.uint);# f% u6 D) y  J% \& u4 M( R
}
2 r. G# b: u0 k' b  r% L( \  y' p( D( F) [9 q' C2 m

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




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