嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:  E: K- V8 e/ p! n9 x6 k  L
main文件:
( ~# d/ C& Q$ {, p5 g0 ~/ ^interrupt void interrupt4(void)  
5 ~& V  c& l5 V" Y{
' I0 L! |* x4 z' d5 `( n4 p9 T# ~, i  Uint32 sample;2 X1 V) `$ m- x  f% [
/ A& d5 S5 P9 T% ^; m6 k0 G1 _: p
  sample = input_sample(); // read L + R samples from ADC1 r! z1 C$ W1 o
  output_sample(sample);   // write L + R samples to DAC 6 |( V$ {3 ?0 J) K
  return;/ W" ^2 @7 }8 G& F- i8 e8 c/ Y( G3 M
}
3 ]2 V$ @8 ~: _: l
# W& x; t6 c) o5 ^int main( void )
& B3 C8 B1 t. q/ Z# x/ E$ e{
% q' B' e7 B: [% B; {+ E- v  G
* }5 d* u* c# S5 m# j    /* Initialize BSL */2 O9 y& p0 X' S& o- r9 {* ^& n
    EVMC6747_init( );  Y) ~( P" i: n8 {; q9 E0 n
        /* Call evmc6747_intr function */: f; p3 z* y$ h" T9 A- q
    aic3106_init( );; L2 f: H+ O+ o4 W9 e1 c
        while(1);
, [( [) w4 K+ x4 w}
) o* }  y. ^, J5 Q0 i8 n$ H  n2 S1 p* u: _8 Z5 `

' J- X2 R) o" X' c5 paic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题2 }% x0 [3 [% }
/* Initialize MCASP1 */$ Y4 s7 `/ ]0 B  {
    mcasp = &MCASP_MODULE_1;
7 f( r8 v" w, G% c  x5 u4 }7 A    mcasp->regs->GBLCTL  = 0;       // Reset
9 F8 O: D' W! R    mcasp->regs->RGBLCTL = 0;       // Reset RX! D6 C5 L2 s- L
    mcasp->regs->XGBLCTL = 0;       // Reset TX* g. T% w1 X- `5 ]+ W3 z6 @' D4 s
    mcasp->regs->PWRDEMU = 1;       // Free-running" ?5 a" b$ K  _  M# e* R
   // configure McASP0 receive registers
- {2 V2 {/ g! z1 ]# T    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used+ n' f4 r) e) p6 A: `
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus6 `6 M3 V% ~; d' w
    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word6 @$ g6 K" T1 t' R  }
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side): ~+ ^; r" v8 @- e$ K
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ E; o- x# e0 b4 j# [
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
' n# S( h- E& X* a5 o6 G    mcasp->regs->RINTCTL    = 0x00000000; // Not used$ \6 e5 w- E: _
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 Z8 N7 k7 d$ P' A2 S
9 n7 Y* c  `1 y! B' p# V( K) U
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
! F! N. S, k- R5 C" O    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus7 E* A; L2 ~: ^9 C9 h. {
    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
4 J$ h( c* b, \% `6 [, j    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16, y: ?3 e/ b8 z
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK8 S! p) _% }3 l( `, W5 o0 }& s5 ^& h
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
) j4 k! o+ ?# K; _; I, Y    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit- C( @9 j% U# R, T
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
9 m/ B- X0 M7 L- j% y9 d
0 g8 r8 ]' K+ o. H: `& `    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN  C% b7 Z$ w9 W/ H- H
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT% |& L* q! {; F
    mcasp->regs->PFUNC      = 0;          // All MCASPs5 J% f5 f6 Z: S8 V4 J4 m4 r/ A
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
. q$ N3 B! s' c# n# L: s# g; `2 r: ]5 f. b' J( W+ U
    mcasp->regs->DITCTL     = 0x00000000; // Not used% H' y: b+ o; K/ f8 x' l1 x) U6 Y
    mcasp->regs->DLBCTL     = 0x00000000; // Not used
) x8 X8 ?6 P2 }# ^4 P  ?9 Z8 j    mcasp->regs->AMUTE      = 0x00000000; // Not used
3 c8 d- B  K2 B" S$ c: @+ M% o5 ^  m& }) C* L1 E; e% ~1 A; Y
/* Starting sections of the McASP*/
" \6 n* B; ~) b& o    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
1 [# C- N2 M5 m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  / @; C0 t- Y; g! ]
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ; @4 E  g, }9 g5 N# I
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );% R$ r- c6 K+ I3 a
$ g* A) Y8 E& S" I
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
9 P; ~# W) T+ F, f' X+ X0 i( f    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& m9 s0 T& y1 i! o! O; I4 k/ X6 H    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; # G, n- {2 K1 R, ?& K
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 d/ P& j( o# u. }) ~& R& ^, k! m* G* q1 T' @; K1 a
    mcasp->regs->XSTAT = 0x0000ffff; - W/ ^+ C$ G: {
    mcasp->regs->RSTAT = 0x0000ffff;
0 {5 Y, c  I# i7 O) q) T1 G3 y! i2 v3 c: i0 P
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
; M1 L) q& z8 w$ ?$ W* }6 ^) B, R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
; B! I  F" a2 b1 `# e7 l. B    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; 9 T2 K# u. j8 k( V( ^  x; Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );% H9 ~# v) z) [9 X
5 M" _' M% ~% O
    /* Write a 0, so that no underrun occurs after releasing the state machine */
5 O5 I: B3 y# C    mcasp->regs->XBUF5 = 0;
; ]/ C& F+ t! X3 F6 n    mcasp->regs->RBUF0 = 0;
2 ?  I, a- Y+ ~0 I6 ~- B/ }
( P2 T  e' g4 O& b3 J6 t1 `! w    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
: n% p/ ]$ T) r  r$ _$ A    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
  q7 U* v4 {8 l! a    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
4 ]7 [' S' {$ |' m/ Y: F. P2 g5 ~    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ I4 T  |- U' S$ d: z3 `3 ]+ y8 g2 n# z
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
+ c( M8 n% x5 \' y: ~    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );( _- Q5 D. M2 E
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 5 i& f! w9 f( u
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );6 i6 k; \/ G8 J8 J9 N* K
' S, N' e! Q- S
    CSR = 0x0000;
; t2 A& f% \, Q/ S0 X    INTC_INTMUX1 = 0x3d;* R& a! E, z, b. n0 H1 g! k6 b
    ISTP = (unsigned int)vectors;
/ d/ e* M2 y. W" d" \" w    ICR = 0xFFF0;  
/ ^$ J' Q: k5 u. h; I  }    IER |= 0x12;  
1 E: n" J" h: e  a9 B/ W4 T! m    CSR |= 0x01;  
1 O% p: F4 T: m- F5 ]' f2 A  y
  ?- l+ z0 j9 N) e- }6 u
8 r$ S4 Z2 i! p* @. ?. j. F- f/ w. {5 G$ i+ T- d* w4 V: Z
还有就是两个输入输出函数:
, o" o6 m3 }7 i, o! [void output_sample(Int32 out_data)
4 `$ @7 {; D6 o5 w{$ @; ^* J2 g8 E- v
  AIC31_data.uint = out_data;  
3 W0 h$ l2 ]# n3 |  MCASP1_XBUF5_32BIT = AIC31_data.uint;
3 A7 t/ t" g, d3 W}
# S2 A" n& _3 Y& W& \4 n  w% a# N; g9 d: \* M
Int32 input_sample(void)
* t8 h. ~4 k% {+ p4 {{  * S  T0 |3 Q" P3 [, @* R
  AIC31_data.uint = MCASP1_RBUF0_32BIT;6 ~' p# E& @  U, d# d. t
  return (AIC31_data.uint);
8 ?: S) S0 `' S! P6 |; ?8 E; ?" X}
6 O$ U$ T- ?3 F% t/ h# F% D# ^% W% c' Z& ?; ^4 o( v2 Z

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




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