嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:% m) M& O) N0 C7 }
main文件:" J! k9 ^" G) Q) p0 G
interrupt void interrupt4(void)  ! g" c7 j: N  v
{
. B1 g0 p3 r) n" x* T# U  Uint32 sample;
& k8 h# \% ]7 M! e* g
+ J6 z6 z% W6 G. G2 K  sample = input_sample(); // read L + R samples from ADC+ v9 R8 ]1 C( |! v$ _
  output_sample(sample);   // write L + R samples to DAC
1 }6 e+ h. J8 y! L- N. t  return;, x9 U  s& G  f5 D6 C1 `; t2 ^
}
) {4 e' V1 c6 m: d+ q+ @2 w! ^8 i
' y; P5 J. C/ b) ^2 x$ \int main( void )
  e- u# o8 t+ U. W' E{6 ~- m1 t8 p/ N9 k7 N1 S9 l

$ v  m; H' v/ n2 B% l% M, E2 @    /* Initialize BSL */$ K! c1 w8 f; j
    EVMC6747_init( );4 W* O4 F# ]2 k* S
        /* Call evmc6747_intr function */1 L2 U- \2 k3 X! Z# ^
    aic3106_init( );
- z; i7 Q9 p( [" h! I        while(1);* ^! _+ L5 ?, {: s+ N! r
}- l5 |, v+ Z( w
" ~) X( q- X: G4 h  R+ P( |
; y% T( e; d8 W. S6 g- Z- \
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题' @" J6 R9 e  V+ O. E
/* Initialize MCASP1 */5 j) c" @/ a) i
    mcasp = &MCASP_MODULE_1;
! W' l+ c% y6 p; L- Z/ z    mcasp->regs->GBLCTL  = 0;       // Reset$ O; q$ U6 s' P! L, }/ U; h
    mcasp->regs->RGBLCTL = 0;       // Reset RX
" Y1 L) p4 j6 Y0 a* r9 N1 [    mcasp->regs->XGBLCTL = 0;       // Reset TX
. r- \$ O3 y* r/ m. v5 ]+ f    mcasp->regs->PWRDEMU = 1;       // Free-running' X3 v/ n+ M! s: O  v2 y
   // configure McASP0 receive registers
% _: r( l# U' _+ ?1 L- O  C    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 C! V# }( g% ^! F' {1 I' D" Q    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 y9 A- B$ _! l# S* r) s) M7 C    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
1 u$ v! r) R  y    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)6 ^( e% r9 I* x3 _$ t6 N/ c" d6 z
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
1 r- ~5 J1 p; s0 N- }( E& p    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
5 ]! r  B) P. c4 [3 u& U$ I: L- @& T    mcasp->regs->RINTCTL    = 0x00000000; // Not used. |; |4 q/ W9 _' P1 ^( U
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-2560 A" D2 _* r: }$ g

2 p8 f' j& Q* k6 T5 }' v7 G0 S    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used  g. M0 v  N: t" C1 `+ x
    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
4 N3 T2 I5 K& X2 O$ G8 z6 {! x/ y, N    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word2 O% v* o, I( d! d- I* D
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-164 K$ Q1 d" _' k% u
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
2 Z! f: G2 W' ]; J! H4 S5 ]    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1$ L3 {$ c, X( ?, i
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
# X' R9 n' c# x/ p; v$ f3 K' |# Q    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
* R1 D7 D8 J! r+ p# ?8 R& F) `2 E3 N! s% J
    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
' p1 E' i2 K/ ]5 A6 W$ h% u    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
1 y7 Q7 a% p3 _0 p    mcasp->regs->PFUNC      = 0;          // All MCASPs4 M) E8 f5 ]. T/ K0 S. _; ]
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1+ p8 Q. V  G2 Q4 @/ X  r- w2 F* v

) H: |1 f/ s$ A! [; d/ a/ G    mcasp->regs->DITCTL     = 0x00000000; // Not used
% A7 b( u, r4 u  h! E+ [    mcasp->regs->DLBCTL     = 0x00000000; // Not used
6 e: M) R6 \: G" o! Q: @. O    mcasp->regs->AMUTE      = 0x00000000; // Not used! o; F- c' e- o- q
* Y0 d* X- A0 K+ a0 D
/* Starting sections of the McASP*/' I& m  W) a- H  `" ]: C$ [% r
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; / J' G6 Z7 |1 t3 I! \$ P6 v
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  % u; @+ o( E6 [$ K
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; ! r$ n- o0 ~# M5 `$ }, w) p
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
- D/ e5 l  V) j; n5 n' E$ a, n4 d- D* N( W/ @1 Q3 B
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; $ q! D) o5 w9 q( t# l
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
! }% X1 ~9 R- {1 R# R& z$ N1 x3 t    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
4 x- r2 x9 N9 H" Z' d/ Z1 }& }    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );: ~1 d7 q6 n# [
3 Z' ~4 Z) w& D( e, w
    mcasp->regs->XSTAT = 0x0000ffff; + S8 P  O, {$ _# k6 [2 q
    mcasp->regs->RSTAT = 0x0000ffff; 1 M5 P8 u6 |3 E1 _& s+ A! _
* q2 U4 |3 V8 u
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;/ J. o  g: e: ~
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );4 r+ }: Y" O/ B
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
" i! g: L( Q4 w9 F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
' d, Z% ^- t4 _4 b, t4 h
9 x( D  o2 H, S    /* Write a 0, so that no underrun occurs after releasing the state machine */1 w. ^* M) e: r, \6 ~6 i
    mcasp->regs->XBUF5 = 0;$ m- h! s& r1 k( d6 f" t: W, M; f
    mcasp->regs->RBUF0 = 0;* w+ x1 S; y% R! \: r# c1 W+ `2 F

+ w  U# U2 g* `, ?0 M: {2 m    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; , @5 [; }5 }# Y+ w- ^9 A& ?: f
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
" j4 E! v8 i1 ^$ Z    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
7 p7 D1 n  c% V) y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
' Z/ @8 S  O( h& W$ E/ h, }% p$ h4 \1 c% p8 \( |
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON;
- W4 l' L  D0 |9 {    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
+ N) t* D3 K7 o( P; |& A    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; " i. Y2 }/ s/ O: x$ `9 ?. m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );7 b' O% {8 j8 ?1 m; K3 o7 H

5 r# `2 k1 X1 Z    CSR = 0x0000;
' l5 C! A! |1 _5 M" H- D: u7 B  c    INTC_INTMUX1 = 0x3d;
4 ?9 t' o3 d  ~1 k    ISTP = (unsigned int)vectors;2 e9 ~1 j' |! K& }0 P( }
    ICR = 0xFFF0;  
( Q* v! N4 B( ]" G    IER |= 0x12;  + C. k' c4 B1 s% ~5 N
    CSR |= 0x01;  
+ S- r, h1 w9 o* z8 R# g" V  _" v) D: t" D# ]- r

+ l) s& ^' l  r3 B/ ]) ]1 \$ I1 E& F" ?6 X
还有就是两个输入输出函数:( y) H, y! y1 i0 o; M. J$ f" j- A
void output_sample(Int32 out_data)
& x  ^/ O$ T0 j/ I* |3 o* E{, h: o7 X/ d: @! I! k
  AIC31_data.uint = out_data;  4 N) y7 A8 |$ C: a. d. k- `( O5 }! w
  MCASP1_XBUF5_32BIT = AIC31_data.uint;
5 d& g  ~. ]* o) w$ F. R}
' D2 \& B/ a( \( }* h3 |& k
, L- \. R0 A  h2 X; M2 BInt32 input_sample(void)# z' f( o6 u0 W1 s0 j0 O7 w( p6 T
{  . ~& ?6 P% e6 o+ A
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
, X& @4 p0 v! g% I9 E  return (AIC31_data.uint);( E* Y* l9 z4 Y' X' r# V' D
}
2 T3 |/ D! X8 P5 ?
" a: J1 c# {2 p6 v
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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