嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
9 C: q' l' T2 Cmain文件:8 ~: x6 s) Q5 X. R
interrupt void interrupt4(void)  
0 W) b2 r, J# Z+ r% H) Q& c" u{
2 F- E9 F# u3 y8 R: H  Uint32 sample;0 ]4 G0 s% e# K/ l: ?. k) _
# r7 V: r* \1 A' Z( q& b# E- B+ B
  sample = input_sample(); // read L + R samples from ADC
5 k. {4 x- J/ V9 @3 }- J2 r  output_sample(sample);   // write L + R samples to DAC % a( D) D$ g3 K
  return;
2 z7 t% v( P) d2 T% \}
3 V. p; `( @7 f" U2 V( k) j' R% n1 y" Y8 h  X) m. ?
int main( void )1 @  ]* f& A4 p) T5 k  q2 c: I" J
{
# F8 i0 r' Q7 N0 t
& @6 h4 H5 P3 n  g7 J* s    /* Initialize BSL */, s& F' L, l* w, c6 i# `
    EVMC6747_init( );
0 n  \/ {! Y# V, i0 s1 R$ n- V) v        /* Call evmc6747_intr function */  ]1 V* l; ^, W& s- c5 n1 s4 e8 D
    aic3106_init( );
" X2 [4 j; a' e; a) G        while(1);  j/ W, Z0 A! H& {) B
}3 r' o: A  p" ^. I

9 h9 m* M$ v; I# L  w* }
# {) k6 P6 }/ I& d( w3 _aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题
( a0 P! s! }1 |+ u/* Initialize MCASP1 */4 J& m$ d* P# `. ^5 W% u- q1 p1 K
    mcasp = &MCASP_MODULE_1;
/ o4 W/ X& ^4 [5 q9 ]$ b; d5 O& i    mcasp->regs->GBLCTL  = 0;       // Reset
& P2 k2 U# Y, N+ s7 ^1 U$ V3 U( L9 C    mcasp->regs->RGBLCTL = 0;       // Reset RX  `( _7 w3 T; i6 E+ G8 K
    mcasp->regs->XGBLCTL = 0;       // Reset TX
& m/ W& ^5 n1 v- ~    mcasp->regs->PWRDEMU = 1;       // Free-running( ~" z4 J9 l* ~' X* U! Q
   // configure McASP0 receive registers
* H6 `# J3 h$ L4 W6 x    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
5 ?; ]% o) R: _9 m    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus) e# c5 ~4 M+ E
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
" k! c; s4 `. A4 O( c+ I9 {    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)+ {6 k5 K; r5 Y3 H; C, v# B3 J. a
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
' e+ L- s4 Z1 c8 F    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
# `  U" f$ d+ U  Q# Q) K8 ?0 Q    mcasp->regs->RINTCTL    = 0x00000000; // Not used
  R1 q) p' n' O/ F3 N/ S' d    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  W# r/ Y8 W0 s! D' X7 ?

" \* D& e6 }  S) g. P/ {& ?5 V    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
" l% m! R0 f0 \2 H2 b5 @+ L    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 J8 q. m3 t6 N
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 H0 b, G4 `1 O  ~1 u    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
* Q2 _$ Z% J* }1 ~* Q( m# N0 Q    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
6 ]* j( t) o  Z- J; O2 a. v    mcasp->regs->XTDM       = 0x00000003; // Slots 0,15 ^; _, [2 B3 L
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 |+ m7 a4 t: t* b7 o    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 x2 o/ W) S! Q: s5 L6 \( ^! A$ d* y7 u. l
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
8 L3 D3 O8 e8 W    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT2 x9 P* N; p. x  @# ?/ D
    mcasp->regs->PFUNC      = 0;          // All MCASPs* e* ?* h  B6 d4 q
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- H9 @5 M% Q( u8 a. g# q' B+ m. o' y0 h7 {, M4 `6 E; ]3 _  \3 B
    mcasp->regs->DITCTL     = 0x00000000; // Not used, q$ p, Z. w3 o
    mcasp->regs->DLBCTL     = 0x00000000; // Not used- ], j1 E. I) n
    mcasp->regs->AMUTE      = 0x00000000; // Not used
0 C% L6 y3 ^3 J. l5 K' H" Z3 F% g7 g! h# Y; @
/* Starting sections of the McASP*/5 R- N5 y; Q) T0 {' Q
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
3 F2 k1 n! R1 }5 n7 A5 |9 B; F    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  * I* K  ]) [* K( L' }. q! n
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; 1 e" U- K2 C3 y
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );9 }. U. ~& T# a0 r* u

' G; B5 C4 J, Y+ p6 F, @1 L: u, `    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; * L+ b& Z, n& J) t2 D2 m0 }
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );3 l0 G3 X1 |* I0 `9 l+ k
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
" ~) g  X  P9 L$ O$ ^    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );, D4 N$ S# f2 x$ K; i$ |1 Z

; X/ L& V) n* p9 B    mcasp->regs->XSTAT = 0x0000ffff; 0 _' c4 b8 r0 k% U' k/ @' M8 Z
    mcasp->regs->RSTAT = 0x0000ffff; ! f; O$ S" S' B8 W& K8 D
1 w" O& S2 d" h" p
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;+ f/ c: {+ ]" L, x6 M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );7 u3 |4 Q& g: D0 a: T  _' g) ~
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; / g5 n1 d. R* ?" C* W
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
6 z% l" p9 ~2 b, |% B
0 u1 J, J8 }4 u' x0 j0 }7 f    /* Write a 0, so that no underrun occurs after releasing the state machine */
+ {* `5 U1 H8 ^$ F    mcasp->regs->XBUF5 = 0;5 [6 q* e7 {7 B, g, D, o
    mcasp->regs->RBUF0 = 0;
2 r2 q$ m" X1 m( Q! \
- l3 v9 i# d, X: ]- W5 |    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; # E7 T8 v4 [( V% M
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- V/ n+ o* b# H; N/ U+ J' [    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
/ e$ [# r$ [* c6 m. L1 r: [) s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ C3 O: N4 o& j' D

  `9 R5 t& T: r& J/ C8 {    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 5 ]- T, B4 W+ U! Y- ?* H; S
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
2 g, u! E* Y9 j3 ?    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; # f$ K) \/ n8 P) _7 s" j; g/ `
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
$ J* M# i; d  i- Y. n7 c/ _. W
0 j$ U$ s! c% Q    CSR = 0x0000;
2 O$ c  Y7 \! p8 u& @3 ^' b8 d    INTC_INTMUX1 = 0x3d;- c! h9 T: G6 S
    ISTP = (unsigned int)vectors;
! V' e# U5 w. ^: [    ICR = 0xFFF0;  
9 {/ p1 B6 O- `, `# s0 r0 p/ q    IER |= 0x12;  ' B0 P6 ^) E2 x2 P; C: L* b
    CSR |= 0x01;  
) W5 q& l  H9 {1 {) T  u' v3 F) R
7 n) y3 v( g' p- c% A9 U% `0 m" b8 J( ?* w$ L

; e* c5 ?8 t( W" u还有就是两个输入输出函数:% ~8 I  V0 o, o: F
void output_sample(Int32 out_data), F8 M/ p& a/ P7 G# j# e
{
, e6 S% w9 B- Q3 R1 Z  AIC31_data.uint = out_data;  6 Z; b8 j+ x; N& _7 `' D
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
( F2 w/ \0 T+ V( o5 I" B}
3 `  \" K2 x3 v+ m: {% r' k, V" Q' l) N0 U7 U5 T' L& g: p
Int32 input_sample(void)7 T  W/ C& T3 J
{  ! f  m( ?* M( W5 e
  AIC31_data.uint = MCASP1_RBUF0_32BIT;2 q) n* G  r/ O
  return (AIC31_data.uint);$ g3 h$ `4 H7 C8 C' r( r, X
}& z7 A+ q2 B; O# V
3 o5 M% x3 z. h4 G0 Q, E

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




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