嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:* z' e, D0 S/ x
main文件:$ p- A, D& d. m8 c+ t
interrupt void interrupt4(void)  
0 O! P. n/ x" n{( u+ _2 |7 x6 f$ H% L
  Uint32 sample;
+ b6 v. T# R& h; G; O3 f: `! W" _9 L- ?4 m3 q
  sample = input_sample(); // read L + R samples from ADC
% J: @) Y8 A5 \( }* T% l& ?  output_sample(sample);   // write L + R samples to DAC ) k, P' Q$ l/ ^$ C1 ?6 m
  return;/ y' _9 y! m5 m0 m
}
% r: I3 Q' v3 n! n+ U2 ?$ r8 O3 }1 h3 |0 y
int main( void )
* _( s+ T' @4 L0 r{4 A: [5 M# |) r- z4 J8 @& [! T

4 b' q+ T( `: Q# C! p. T    /* Initialize BSL *// A, A8 H. A) ]6 B  |
    EVMC6747_init( );
9 X7 n" v" y* N" Q        /* Call evmc6747_intr function */
- d% W. V/ Y+ h- ^/ X" @/ [    aic3106_init( );3 [' m$ y( N' s3 j8 c& R  l
        while(1);
% p: ?. D8 S3 U4 a+ m: ^}8 M' `, j7 D- d
5 s( J& ]+ h  K4 u0 y( ~
: s  @$ B+ s2 p; P" ^: ?& b0 l
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题4 ^$ l8 u; O/ a) F0 C- |
/* Initialize MCASP1 */0 o; Y% Z8 V( j" N" v5 T, L! ]
    mcasp = &MCASP_MODULE_1;
, a+ V" B1 W. \# L) R4 |    mcasp->regs->GBLCTL  = 0;       // Reset
8 H- N1 u7 q' j    mcasp->regs->RGBLCTL = 0;       // Reset RX
& f7 W* S+ M. c    mcasp->regs->XGBLCTL = 0;       // Reset TX
% Q) U' e6 L. _. v4 h3 ~3 _    mcasp->regs->PWRDEMU = 1;       // Free-running+ O- W7 ]& Q/ |, J3 y4 R  I/ v
   // configure McASP0 receive registers: S( ~4 i3 _; m0 h; I4 w7 N7 ^- G
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
2 B3 P% W! b1 [1 `0 S3 N    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
. ]4 s4 I. w. _$ ?. m' R  G    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word9 O' H% A* A: G4 V" q
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
- }8 s% y1 m5 z% S    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)/ L9 C2 j5 h4 O" k
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1. E1 n+ X! }& q3 M8 A  }3 `
    mcasp->regs->RINTCTL    = 0x00000000; // Not used9 R7 g% ?* I! u
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 B* y' D; C" J- X: j0 t; Y* N) Q0 j% I6 r# |) C+ i% P. q$ p
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
( a, l+ r8 h1 e4 N6 V( W    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
) y; d1 S9 @0 O1 J    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word. I/ ]1 O7 P# d; `' y3 i$ `
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-166 q6 U$ Y$ p- e) d8 n
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK# e" \9 x5 }  v, Z& T/ Y3 b0 Z  C
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
- f+ }# C8 _9 }9 N    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit: G: q6 h6 h. ^1 o  ^4 r
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ [* T" J: T3 m- C7 e/ A
1 ?3 W# _, ~6 o* x+ ~+ b9 L0 B% b  G. e    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
. r' {, m% y6 w/ |# _    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT' h# d6 M0 u4 W. C
    mcasp->regs->PFUNC      = 0;          // All MCASPs8 ~" u6 \) O' R" `! t, F: j
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX18 M3 u* j' \% ~+ |* w
, C9 N" F$ r3 g5 k7 x
    mcasp->regs->DITCTL     = 0x00000000; // Not used* }6 Q3 x( q4 S9 {
    mcasp->regs->DLBCTL     = 0x00000000; // Not used* J) S, J5 f9 e! j( T) V, L
    mcasp->regs->AMUTE      = 0x00000000; // Not used/ d: i/ Y4 c6 F' y+ [, F
4 X4 |4 b; s" j$ G3 F3 y# N' V
/* Starting sections of the McASP*/: `! m" P: |4 Q4 g
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
) S" D  ]1 G' q2 K- K5 W- i    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  7 N- B/ L% p( e) h; w8 O5 t
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
1 H( s) S4 ]$ ?5 y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );0 X5 U2 E1 s9 ^

8 X0 T+ o. c6 l4 S    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
/ H# h3 v! O2 d) T& l    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );: L; X; I8 M' U1 B1 j3 p7 d" l
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; 6 u# o, O9 N1 l. {' ^
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
3 I' o% Z0 z. O+ T4 R( V$ M" v- r
" r) C( D. {# }6 S. p) V" V    mcasp->regs->XSTAT = 0x0000ffff; ! n' D" g" k  v3 L! O8 \, R, V. r
    mcasp->regs->RSTAT = 0x0000ffff; 7 B9 w$ [5 L3 g- L0 ^5 J/ ?2 s
& y8 q% u9 k; Z+ {; |) @9 ]
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- P+ I$ T& r- ~0 R% m    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );1 ~0 C2 F' T3 X3 [/ s. f5 W
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
, E( p" [2 }- c. v    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );- U% H1 O, m$ v

4 b$ \: b9 @# C, O1 r& _    /* Write a 0, so that no underrun occurs after releasing the state machine */
- ^/ S/ I2 E9 k5 k    mcasp->regs->XBUF5 = 0;
+ ]7 `' M2 H9 Q    mcasp->regs->RBUF0 = 0;: l: ]0 J- j, e! Z$ \

5 s# |  e6 M' h2 u+ V    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; ! }4 z  e* ~* t# b* ^
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
- {$ [! I9 v0 r: M  m    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; * Z. [$ X" {" N! g( x
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' f5 X+ h+ f- u9 f2 R/ l
' v/ h1 l0 B1 l7 m# @! R, _    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; & M, B2 _& w0 _$ I1 _
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
/ [6 w! _$ u; J; V; T2 s    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
1 P4 O, m- x6 w6 o% K    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );0 E: {) h/ M. ~
- @( r5 K0 L; n
    CSR = 0x0000;  ^2 I: ]% F0 w" p& k: Q
    INTC_INTMUX1 = 0x3d;
1 s  O# O' ]! G# c    ISTP = (unsigned int)vectors;
5 H4 Q' R, N9 z/ S3 g  c8 E# j, I    ICR = 0xFFF0;  6 K3 z; ~; A& `
    IER |= 0x12;  $ R/ W; S* y6 R8 \' z3 |
    CSR |= 0x01;  
2 k' H4 L& m. G! T7 D' {
/ f8 d8 B  ]7 f$ Y8 H; x1 k1 w9 Q
' Z4 V& a" o+ r  N/ b% b8 l8 M7 U" e5 s. |0 ]
还有就是两个输入输出函数:7 O7 M1 V4 W1 A! L; F. v0 y9 ?" e
void output_sample(Int32 out_data)4 i8 m. W( r- X% C+ B
{$ Y" D/ H( x2 n, f2 O. g( H  m
  AIC31_data.uint = out_data;  0 J7 [! J/ b! }1 B# u* q& m! c
  MCASP1_XBUF5_32BIT = AIC31_data.uint;% h1 \9 y/ v% w1 y0 N1 J/ N
}+ j# q* N7 F+ F
! |0 H: c9 F9 k) _7 Y$ F
Int32 input_sample(void)# O2 r& z0 ?3 y/ U) _
{  ; n: I4 G' a; h$ J
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
1 p0 e+ y- w3 k/ a- ?$ X3 C  t  return (AIC31_data.uint);
8 w/ r5 N9 `" @( z}/ N2 d" `* |% X; s) u+ e2 S

/ d0 a2 x6 r& X, x5 R4 p) g& t) \8 ?
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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