嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
# _* `) `. v' d; {& l( J1 Hmain文件:8 c2 x1 s+ W9 b
interrupt void interrupt4(void)  
3 S- _5 `3 w2 a! Z{' g  b; h; I6 Y
  Uint32 sample;  u# T! I' p8 }* ]& p6 L3 ~! X

) a2 w7 p+ g9 k5 e  sample = input_sample(); // read L + R samples from ADC% `$ p& N0 O8 a4 l2 E. |5 u+ |9 ?  W
  output_sample(sample);   // write L + R samples to DAC ' u1 v+ q% S. w0 b+ h9 y' l1 _
  return;
+ D' p, [) d3 P9 ^- g& O) k0 D}
% |) X4 n  G: t9 L9 g3 l
. k6 r5 A, O0 iint main( void )6 R0 N; D0 v" I
{' c* g* G: o9 P$ C" D8 {6 a+ W
9 \, C; D8 H$ f5 G% |7 v
    /* Initialize BSL */
; g5 `  {7 U& N5 I- u/ @6 B    EVMC6747_init( );* _- m3 q# q" y5 B, i3 j* \
        /* Call evmc6747_intr function */' d$ M8 [$ |, ]1 [/ i
    aic3106_init( );/ o3 \1 Y; Y( Q! ?
        while(1);! n1 c2 h$ y8 C, _; i& ]2 {, d
}
' {/ C# ]4 n7 \2 T: ?( \) P
: r  `% Q6 \! f! [$ Z/ W2 E" R8 y- x- Q$ Y' c* ^3 t
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题- Z* _8 ?1 ~( A2 O1 s$ c# b
/* Initialize MCASP1 */3 `% k" b' S! A: {6 m
    mcasp = &MCASP_MODULE_1;
5 @6 Q* H( h, o' K( [$ s    mcasp->regs->GBLCTL  = 0;       // Reset
- b# ?5 k: f: h4 E( @3 }    mcasp->regs->RGBLCTL = 0;       // Reset RX
; f; }. L+ P* P) ]1 l( t. G9 ^    mcasp->regs->XGBLCTL = 0;       // Reset TX3 m" ~6 n" o0 A
    mcasp->regs->PWRDEMU = 1;       // Free-running! P1 g% ]" H6 a
   // configure McASP0 receive registers
/ O) _  g8 \" f3 O3 [9 {    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used1 p9 ^3 x9 ~5 K: }) i& X
    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" R$ K) A, T4 ]% J    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word
! s; ~8 V9 ^9 u6 i8 K" g) m    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)2 }# A7 |/ \+ ^% y: M8 Z
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)2 K+ w8 o, Q  ]. d
    mcasp->regs->RTDM       = 0x00000003; // Slots 0,15 ?0 J9 }5 K1 q% r' V
    mcasp->regs->RINTCTL    = 0x00000000; // Not used0 d+ p: G3 F( W
    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256& J0 l. O% L* }1 ?5 [/ t: B+ [
3 h4 ^5 B+ }. S
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
/ Z1 h% M) r' T1 M* q0 s    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
" Q' _+ w4 B/ y8 b/ @+ Q; E" I    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word/ q1 F! @0 Y$ K# I6 O
    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
; h; V& v1 `  E) ~% }    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK1 L" g5 @2 C2 Q7 ^+ u: T
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1
6 T" E7 M7 N; A- v/ I6 n    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
$ X- V. Q5 P8 b# w$ a$ ~/ [    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
1 @, V# |# R; }  o
# Y" d/ S1 R* t7 t* g; \    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN
7 ~3 E6 P& ^9 w! f( i$ K2 D# }    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT, [$ r7 S# j% D& p
    mcasp->regs->PFUNC      = 0;          // All MCASPs
. C1 _8 O. }8 r: H* S( Q8 y1 ?    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1$ c' b, z4 b* r% _" m1 t* v$ [

0 A6 I4 v% F( q% a+ n- u- f    mcasp->regs->DITCTL     = 0x00000000; // Not used* }7 d( @7 p9 p; j% V
    mcasp->regs->DLBCTL     = 0x00000000; // Not used  k6 H5 U: U1 L  e4 y' p9 f2 m, d
    mcasp->regs->AMUTE      = 0x00000000; // Not used
7 C* ~+ Y8 x# F- c% A
- ~1 G' L8 m& [* z+ G/* Starting sections of the McASP*/  F- ]! G- S2 d& `9 D% N* a; Y
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
+ e8 `* C. J: M# r7 T/ F1 E8 r    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
) L% w' ?. r; R+ n7 R0 @    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON;
+ j1 w1 k9 e' a! J1 L) y    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
# X1 O3 {& o' J/ ^6 ]$ p2 V3 }1 S% z8 `$ ?
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
1 Q$ X2 ?, @( E  x    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
& _- t' {0 [9 Z6 {  }! P    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
+ E# q! T9 H3 i) s    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
* [/ |2 q4 [8 B& |3 U5 ]
2 ?8 Y2 G7 i- E* X, _# w- d) z' D    mcasp->regs->XSTAT = 0x0000ffff;
2 V3 _- E; G( |- V& X3 ^    mcasp->regs->RSTAT = 0x0000ffff;
4 `" x' ]# y5 E& c( @, h* k: V4 f6 L5 l/ s* c6 Z
    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;8 H  j7 D8 y9 h) @+ J
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
0 D( K& x0 [! t# K" N& c' k" i2 `' N    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
  N; K# \8 u9 Z  F    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
9 i1 X7 p! Q7 C; m# H5 h) ~: c1 O8 J1 d9 m' f: n9 z  K
    /* Write a 0, so that no underrun occurs after releasing the state machine */
4 N  a8 U/ I( Q: [    mcasp->regs->XBUF5 = 0;
# ?; ^* @& A# i+ {4 M. _  A& Y    mcasp->regs->RBUF0 = 0;
; ^% }& z& T# Q! D# Y  `( M% d. E( k& p9 y5 ?( k2 o
    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
0 x% R+ i0 d, x; A+ P4 X$ n1 I    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );8 I- h, Q5 A8 E+ i8 v' ]  W2 a5 E
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; ( j- V1 c/ x; O7 Z
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );+ n) o" G- E) y5 T- ^0 ^% G; U8 A
9 }& R. i8 Q+ E* O. V! y8 r
    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; ) k! I8 {5 u# ?- f8 b6 G1 m
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
! S9 X) r* l7 i& \, K    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; % ~" X- b3 c$ ~6 J. g1 \+ v( {
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
" m8 H! d" q3 l5 p0 J8 D
+ W! Q: z. y+ j* H    CSR = 0x0000;
- b" g% ~2 `$ c% k# W6 Z' i    INTC_INTMUX1 = 0x3d;
+ G  T) u0 l& U6 k' ]# |2 K' V& Z    ISTP = (unsigned int)vectors;, D5 j9 m) g2 F7 W/ |5 F( h
    ICR = 0xFFF0;  
- e0 P9 @+ c6 p; `( j    IER |= 0x12;  
! R7 [9 `+ O' |. X# c    CSR |= 0x01;  
( N3 c5 i% L8 f7 ~3 I. }8 k( [4 B$ [& w4 X
' [  }" a) f- ?

% [6 I# o4 d/ `+ Z还有就是两个输入输出函数:
# W3 L+ A; c" G8 U, m, o1 Qvoid output_sample(Int32 out_data)) L) m  ^* S, q: y7 A
{
/ E* M  f. W8 x1 j# g6 F0 p  AIC31_data.uint = out_data;  7 [) N. G+ j$ n, F! Z
  MCASP1_XBUF5_32BIT = AIC31_data.uint;; x& p1 b6 y2 j
}. O8 E$ Z6 l5 B) ~6 z+ u

/ v/ C( @3 |5 i; q5 ^/ QInt32 input_sample(void)7 a4 E/ W1 r$ G4 {" U
{  . @" z( J4 V; h/ V
  AIC31_data.uint = MCASP1_RBUF0_32BIT;
5 i6 ?' T6 m$ T. [( {( p  return (AIC31_data.uint);! v% d. u9 R9 E. Q6 h4 e
}
! ~+ H6 h+ B8 Q* W) ^+ z" F( N) w- k8 r, ^5 W- ?

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




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