嵌入式开发者社区

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

作者: yusijiangchengm    时间: 2016-3-15 16:07
标题: C6747利用McASP发送中断方式完成音频输入信号的直接输出
C6747和C6748感觉差不多,我想实现McASP发送中断方式控制音频信号,在轮询的例程基础上改的,轮询程序可以实现,但是中断一直实现不了,也找不到错误,求大神帮忙!下边是主要程序:
7 h0 ]& a" L; Jmain文件:
% ]: P" Y+ f5 g9 D1 x! d0 ?; }interrupt void interrupt4(void)  
- k0 l) Y1 H/ g8 G  p{
$ {% d% D& f  R, E  Uint32 sample;
& J& S2 C- g8 n2 B- |0 e! h
% I) c. |$ O6 W' {# F+ n  sample = input_sample(); // read L + R samples from ADC
0 x; H: X' e2 e  output_sample(sample);   // write L + R samples to DAC ' B- q- X* H! I8 L* @4 I& U
  return;
  z* G: \* I- h" o}
* X! p4 A6 |9 T, W
# r) f* @8 J$ l; R6 }) u7 _int main( void )
# T/ N8 N; B; f0 ]* Z) i{) i, G% \- K) X5 S& V) q$ d

& H, N, Q$ D+ n# t* @2 b* P1 r" X* P. y    /* Initialize BSL */9 o( N, @' C" |+ [
    EVMC6747_init( );" A; X) n/ G+ l+ l. t" u
        /* Call evmc6747_intr function */% A4 z+ s; \2 B% z
    aic3106_init( );, l1 c  d6 v0 Q5 B3 j: f* e
        while(1);& F: k3 X; m$ K' n- f( W) r( x
}
, h% B7 N' E+ z2 d+ n
" q0 J/ L) A, h: e- V4 P) _" B- Q7 w  C* z6 p2 a# \! I: p
aic3106_init文件的一部分,McASP配置部分,采用内部时钟,I2S方式,同步传输。音频芯片的配置应该没问题7 u8 ~$ e: L4 N/ V. M
/* Initialize MCASP1 */
0 J' Z% j. D# Y) X( Z& B    mcasp = &MCASP_MODULE_1;- I% k" R+ _) `- b
    mcasp->regs->GBLCTL  = 0;       // Reset
4 o5 y; P+ X( G& O5 ~  P  h# v" ~    mcasp->regs->RGBLCTL = 0;       // Reset RX' X! P) s8 W5 N/ Y, q4 _
    mcasp->regs->XGBLCTL = 0;       // Reset TX
4 h" v- T5 Q# e3 W, M& P    mcasp->regs->PWRDEMU = 1;       // Free-running
- G% s  P% f, u4 r: L- a; x! h   // configure McASP0 receive registers
4 d% L( j" r- q( O    mcasp->regs->RMASK      = 0xFFFFFFFF; // No padding used
  U9 q7 o" u) Q    mcasp->regs->RFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
0 J% ^$ h5 E; j! Q* t1 `    mcasp->regs->AFSRCTL    = 0x00000112; // 2TDM, 1bit Falling, External FS, word( d' u% o# D" S8 n+ R. q/ f
    mcasp->regs->ACLKRCTL   = 0x000000AF; // Rising INTERNAL CLK,(from tx side)# @: Z7 F3 |& t- W' p6 ?
    mcasp->regs->AHCLKRCTL  = 0x00000000; // INT CLK (from tx side)
9 E: d$ N( p  D0 F1 F) v/ N) N    mcasp->regs->RTDM       = 0x00000003; // Slots 0,17 y2 R' g, I5 A. H
    mcasp->regs->RINTCTL    = 0x00000000; // Not used
. T" {7 m" L) k5 T" F; j    mcasp->regs->RCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
/ ^" g' D1 O- a) J5 c. `- J* T/ w, w: k# n0 p) Q% }1 J
    mcasp->regs->XMASK      = 0xFFFFFFFF; // No padding used
: v/ n  \+ w: c; x6 m' p2 L    mcasp->regs->XFMT       = 0x00018078; // MSB 16bit, 0-delay, no pad, CFGBus
- Q6 u& c. G. |5 i; C    mcasp->regs->AFSXCTL    = 0x00000112; // 2TDM, 1bit Rising edge INTERNAL FS, word
% P$ G- q0 o; E9 `1 ]    mcasp->regs->ACLKXCTL   = 0x000000AF; // ASYNC, Rising INTERNAL CLK, div-by-16
4 V: B  N9 r" E1 b$ W    mcasp->regs->AHCLKXCTL  = 0x00000000; // EXT CLK; ?  R* o( I( z
    mcasp->regs->XTDM       = 0x00000003; // Slots 0,1  A; q4 t. |, S+ W
    mcasp->regs->XINTCTL    = 0x00000020; // interrupt on transmit
6 ]* [* k- |! m" k; X' Q  j    mcasp->regs->XCLKCHK    = 0x00FF0008; // 255-MAX 0-MIN, div-by-256# j0 a7 z# X7 w( k4 ~! T- L8 E

) c5 Q. X- p$ k; p9 y" P    mcasp->regs->SRCTL5     = 0x000D;     // MCASP1.AXR1[5] --> DIN$ g6 b( x8 r: b" {9 s1 P, A
    mcasp->regs->SRCTL0     = 0x000E;     // MCASP1.AXR1[0] <-- DOUT9 H' X5 u) a% S5 Q6 Y
    mcasp->regs->PFUNC      = 0;          // All MCASPs) F- ]! w. }8 k6 B  `
    mcasp->regs->PDIR       = 0x14000020; // All inputs except AXR0[5], ACLKX1, AFSX1
- N5 N+ o2 i% S8 s2 F* I! ]0 r6 z. G4 r5 c6 K  b
    mcasp->regs->DITCTL     = 0x00000000; // Not used
( s# ^+ P4 m( T1 g    mcasp->regs->DLBCTL     = 0x00000000; // Not used
; l. }3 p' l' |% B2 E    mcasp->regs->AMUTE      = 0x00000000; // Not used; d1 D3 Y9 S) t& e# o
0 ^6 E' y8 |) \
/* Starting sections of the McASP*/7 r" R- p% ~: i
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON;
4 n1 ?6 C; j) i' S7 I5 F$ P    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );  
+ \" A, e! d* A* w# _/ n. p    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; , `, U! C6 l7 u  S: }
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );
. J; y: `4 w) _1 x8 z: p; \$ h# t; ]' [. ]- o5 Z- e! ~
    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON;
* y; q& T: [: c7 I, Y7 _# y# k: _    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );7 h; A  c$ O' |# a# G; ?: P
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON;
& w% Y, B! y. r! ]  E( ?  `    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );
  n. A$ V; B  u4 B, v6 w/ D% X# p4 q4 n* k6 o; \/ N6 h
    mcasp->regs->XSTAT = 0x0000ffff;
: h5 ?  N# n& ^- I+ U2 J/ U    mcasp->regs->RSTAT = 0x0000ffff;
  d1 B# A4 V5 d- w& g3 J
* O6 D2 J& z7 N& n6 G    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON;9 f2 z4 o% l9 O. U, \* M6 p8 Z: V
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );# l* I! J& Z( p. q7 }. F
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON;
+ J4 c& g9 j; m" X    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );
& W% j; }* }! F% i' ?2 R( n3 n; |; z' G. R, B  v( U6 K7 A. |
    /* Write a 0, so that no underrun occurs after releasing the state machine */  k( l* f5 N' c) q' t- B  L
    mcasp->regs->XBUF5 = 0;
' M1 d5 d& i- c0 t7 w. ^4 f, j    mcasp->regs->RBUF0 = 0;
2 j. O4 |& C- `2 H9 u
; I$ [$ _$ _- B) J( Z8 j; |    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON;
2 \0 m! R, E/ d# G3 K% _7 ^/ y    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
; h' }: Y% ^6 G2 k    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; : M+ _$ ?  P* h4 F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );% \( E0 K( n5 w/ M+ w

1 o( U3 u: O: _: y6 X    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; 3 s0 h0 D2 ]; C
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
" b" m2 A9 W4 a$ V5 ?# E    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; 0 j( M% N4 L+ p" }$ c# G; F
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
: ?1 U. c! I' j7 p* l6 `; C. S# d& q4 a% D' r( C1 Q
    CSR = 0x0000;& Q* B; q1 `; P+ d+ s
    INTC_INTMUX1 = 0x3d;# k  j9 Y! |6 q& d
    ISTP = (unsigned int)vectors;
6 N, ^/ o8 p: M- F    ICR = 0xFFF0;  
+ E3 E. P1 l& q+ N9 D( J    IER |= 0x12;  # D- g/ o. j& t& Y7 J6 z2 c' D
    CSR |= 0x01;  
( U) z, ~. Z6 t0 g
$ ], y: h9 W/ J# _) D
* T% E: W* y4 e' C* l; k0 e$ }
- \2 u; J( ]" P& U8 t* @还有就是两个输入输出函数:( o5 \& L' [+ p9 \+ y
void output_sample(Int32 out_data)
- u5 Y3 z( k# e/ P: G5 b0 u{
9 e. m2 D0 q. L6 |2 M9 a3 s  AIC31_data.uint = out_data;  9 B* N1 }' H7 J  f, A7 }5 t/ j$ E
  MCASP1_XBUF5_32BIT = AIC31_data.uint;! }& Y7 h) r3 r% ~
}* N, k; G# {& s) {
+ [4 }' V4 ?* }, Y- `# W
Int32 input_sample(void)" I& ?# D' E9 R) E. u9 \/ k+ }
{  
0 y; l' O9 \* P; ^1 M) j: J  AIC31_data.uint = MCASP1_RBUF0_32BIT;1 A4 l5 r7 ^, ]. _
  return (AIC31_data.uint);; _$ F% d7 i2 B, I1 S' D$ H! p6 u
}
8 ?6 O8 @. V; k$ X$ |
: e; |" H8 u. _, p: Z0 V
作者: human    时间: 2016-3-16 11:55
可以参看创龙提供的例程:AUDIO_LINE_OUT_INTR——Line Out 音频输出(中断方式)




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