嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:6 J3 y  h5 t  b* K% w) v
main文件:& b* h- |3 g* n( Y/ @7 {, t) M
interrupt void interrupt4(void)  6 U, ]* o5 `, h1 B' x# c
{
8 t5 X- R3 q( {( L  Uint32 sample;
- B# T( J7 i) F2 V6 t! D9 t6 u
) H, ~. r2 F; r6 u! |  sample = input_sample(); // read L + R samples from ADC
1 P5 Y+ r3 H- C) R$ U; W  c; A" e  output_sample(sample);   // write L + R samples to DAC
6 m/ t% y1 d0 }# u: _& W! K$ \- F  return;# D3 P/ B: G" U8 c/ N
}
' c" b4 f0 X, _9 D- A8 v2 D$ {+ S" \" }) \( s7 s$ @, A5 |
int main( void )/ \& F2 i) e6 I7 |' R
{$ a# Z. \! _+ O. m4 R4 }4 Z4 g% E
9 Z: x8 T$ f( \% B7 M
    /* Initialize BSL */
9 w  T; p* q8 s6 b- g    EVMC6747_init( );6 B4 d; N8 f/ {& Y  l
        /* Call evmc6747_intr function */* d! I7 ^% G( T6 y; [
    aic3106_init( );
) {  B4 t( ~0 X$ p  d        while(1);
& c- h, a% D( C0 i0 l4 W& T}
, A+ L9 ?8 b5 G9 ~5 l7 x1 p
; [& c* U% j+ t% ^7 @5 ~# ~& b$ D+ m- C: |1 {9 b# B
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题0 A* B0 v" ]( k1 [
/* Initialize MCASP1 */! q$ C7 J7 t; R( Z" \9 f4 m9 `
    mcasp = &MCASP_MODULE_1;) i$ k# Q! {+ U# {$ A
    mcasp->regs->GBLCTL  = 0;       // Reset+ i& @. d. a- [9 K3 O$ P+ e6 H( T
    mcasp->regs->RGBLCTL = 0;       // Reset RX
( a$ n5 I0 ~/ i* h0 a# E& o, N  W    mcasp->regs->XGBLCTL = 0;       // Reset TX
; \" F3 v9 F5 R    mcasp->regs->PWRDEMU = 1;       // Free-running
6 s1 C* c& N2 m7 W  p   // configure McASP0 receive registers! N; L$ J0 C6 `) J4 ]5 Y: a
    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
6 G; [- F) V, p    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
5 b5 l# g; [0 d6 T7 N% i& q    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word; K" N1 b* [- S; x
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)
% _0 c' [$ w' i5 b* p) H& j    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side). o8 c! i% C6 d* H. H5 I( r1 P
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,1
  I3 h9 ?% S: Q/ U" x4 M% e2 }& n8 V! i    mcasp->regs->RINTCTL    = 0x00000000; // Not used- X- {2 E1 M7 L2 \% T! `' v/ m, @
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ a& e+ [+ Z6 d5 L( T+ T7 ~6 N' |0 D! p1 D' n0 [$ v* P% \& V
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
9 E, ]) Y. o5 m) T- x7 L1 j4 l    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
, m; p) v0 K5 {7 Z    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
+ b: f  C1 B& H* d; S( G    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16( H* N7 g3 v6 c- @
    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK
5 J, v! A* u0 i% Q: \. q% |    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
3 p* q) V0 p3 E* ~' |- I4 b0 S% N$ [9 N    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit* g4 r. ]% [) D& m  O: t
    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256  G- y8 b4 O- g0 Q% e6 r9 S

' a6 s" |* ]9 b' p    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN, @% C( s; y; u5 q# M& r" m, R7 C. @
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT
6 v, G5 ?( P& t* A/ G+ t! i4 A' |    mcasp->regs->PFUNC      = 0;          // All MCASPs
' D" J7 {' G* @: n7 W: l    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1  m, w0 U3 [: F6 s
  y1 r& y. ?' G$ Z! A9 Q5 G
    mcasp->regs->DITCTL     = 0x00000000; // Not used
6 g5 I2 m# l4 h9 ?: n    mcasp->regs->DLBCTL     = 0x00000000; // Not used) ?# o3 g( p" n$ k/ M" p
    mcasp->regs->AMUTE      = 0x00000000; // Not used
5 E  n% K; t* @# |9 u9 k# Y* ^+ ]9 T% z4 _/ Q: v4 {, p
/* Starting sections of the McASP*/) M$ A) M- V7 a2 g2 J! y' q# D: ~
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; 1 N8 ^+ m4 r. u9 `$ \8 r4 N
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  , R" @0 f# e  H. X% F5 }& p9 ~
    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; " x) A1 n" [* F, m
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
8 R' e' `& F0 f4 `& D; H
  j, [2 X! M6 g, U    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
. c* f' s& G) h5 O    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );9 ~7 L) w  `$ x
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; * d1 e9 I7 N- f0 ~. w( u% ^
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
7 Q+ N. X. P; d; J% g) v
1 w) X2 \5 D6 D- z2 U# T7 f2 v( F    mcasp->regs->XSTAT = 0x0000ffff;
, [& F3 `& P: p- o% {; o    mcasp->regs->RSTAT = 0x0000ffff;
+ k/ I+ n5 V/ z/ `4 C) c: D9 @3 f4 G9 M! t5 o0 B
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;
- z' ^- b5 n% m- v- g) X    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
- k" K" p5 W, K/ z0 K    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; ) ^2 e) I' O8 ^7 @) c5 ^' v7 t& C
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );9 V3 a& B  y( n% w! e6 w/ q  s9 f

  n1 n& p* B, b! v7 F% ?2 M    /* Write a 0, so that no underrun occurs after releasing the state machine */  |2 Z4 [- j: {1 l
    mcasp->regs->XBUF5 = 0;( Q' i5 x6 A8 q5 ?( c8 [  j
    mcasp->regs->RBUF0 = 0;% L$ f/ e7 b  x' L: M8 s

1 c- Y4 E* X! n/ h5 v/ D    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
; n. e5 h' Q3 R    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );1 E8 [( s# j' o0 Y& A
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON;
, T6 z/ W+ r1 V- F4 v; x' T    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );
$ m) O' Q& }+ A% e
8 k: J/ ?/ c1 J    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; , l$ B8 d" K+ V" b. o& y
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
% y* [  T+ i( }! v' i$ q5 o    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON;
% A5 t2 g4 h( N% V/ y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
- ~8 P5 `3 b9 C$ e4 {; `( z! D& w# A
4 k' F! i' q: a    CSR = 0x0000;
) e8 W- e# U6 @% l& s    INTC_INTMUX1 = 0x3d;
2 _5 G3 S; O7 L$ j8 l% x    ISTP = (unsigned int)vectors;
) i' }+ o* M2 ]/ b. t& n4 P    ICR = 0xFFF0;  
  J. E7 |" Y% d    IER |= 0x12;  
) I& k% y' h/ i, D( L7 l    CSR |= 0x01;  7 n  h& J. e/ W. ^
* q- t! m* c; p' e
4 Z+ C) F3 G, u6 f" Z$ k: V
3 u# ~( ~9 g* M9 s3 i
还有就是两个输入输出函数:
8 b3 o3 g4 k1 j. L+ ?% T' dvoid output_sample(Int32 out_data)% L3 ?) b4 p6 @' Y. S! o: l
{& }9 Y: q+ V" g4 i2 A0 c  v* B) c
  AIC31_data.uint = out_data;  
  `7 g) k  [& T  MCASP1_XBUF5_32BIT = AIC31_data.uint;0 x! E  Z  y. O! R" n% s2 U* A
}
/ i: O, n' n7 p, y! n" y; N1 d  M% J8 H+ }6 S" u3 ~6 n4 ~: N
Int32 input_sample(void)1 Y7 M+ _) o- D' r' h& M# F2 t
{  # y$ x& S, e8 k
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
# J0 O+ d; K( [7 C  return (AIC31_data.uint);
! d6 c7 p& E; S% p- h, V! K}
, B" _6 @, `) V7 e  T
7 `4 e1 N8 p6 ]) }' w
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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